PHP SQLite Не записывает данные в базу
интересная ситуация. Написал небольшой чат на PHP с авторизацией перед каждой отправкой сообщения, но это не суть. На локальном компьютере всё работало хорошо, данные из базы читались и в базу записывались, а вот когда загрузил всё на сервер, работать не перестал только скрипт по чтению данных из БД. Система - Linux Debian11 Php7.4, Установлена php7.4-sqlite. На файле базы данных стоит 777 разрешение. Сам Php скрипт отрабатывает хорошо, без ошибок, но данные в базе не появляются Пожалуйста, помогите. Ниже скрипт
<?php
// Установите соединение с базой данных SQLite
$db = new PDO('sqlite:database.db');
// Получаем данные из POST-запроса
$nickname = $_POST['nickname'];
$password = $_POST['password'];
$message = $_POST['message'];
// Проверяем, существует ли пользователь с таким никнеймом
$query = 'SELECT * FROM users WHERE nickname = :nickname';
$stmt = $db->prepare($query);
$stmt->bindParam(':nickname', $nickname);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$user) {
if(!($password == "") && !($nickname == "") && !($message == ""))
{
// Если пользователь не существует, создаем нового пользователя
$insertQuery = 'INSERT INTO users (nickname, password) VALUES (:nickname, :password)';
$insertStmt = $db->prepare($insertQuery);
$insertStmt->bindParam(':nickname', $nickname);
$insertStmt->bindParam(':password', $password);
$insertStmt->execute();
$insertMessageQuery = 'INSERT INTO messages (nickname, message) VALUES (:nickname, :message)';
$insertMessageStmt = $db->prepare($insertMessageQuery);
$insertMessageStmt->bindParam(':nickname', $nickname);
$insertMessageStmt->bindParam(':message', $message);
$insertMessageStmt->execute();
$report = "";
// Преобразование отчета в JSON
$response = array('report' => $report);
$responseJson = json_encode($response);
// Возвращение отчета в JSON формате
echo $responseJson;
}
else{
$report = "Не оставляйте поля пустыми!";
// Преобразование отчета в JSON
$response = array('report' => $report);
$responseJson = json_encode($response);
// Возвращение отчета в JSON формате
echo $responseJson;
exit;
}
} else {
// Проверяем правильность пароля
if ($user['password'] === $password) {
$insertMessageQuery = 'INSERT INTO messages (nickname, message) VALUES (:nickname, :message)';
$insertMessageStmt = $db->prepare($insertMessageQuery);
$insertMessageStmt->bindParam(':nickname', $nickname);
$insertMessageStmt->bindParam(':message', $message);
$insertMessageStmt->execute();
$report = "";
// Преобразование отчета в JSON
$response = array('report' => $report);
$responseJson = json_encode($response);
// Возвращение отчета в JSON формате
echo $responseJson;
} else {
// Возвращаем ошибку, если пароль неверный
$report = "Пользователь уже зарегистрирован - вы ввели неверный пароль.";
// Преобразование отчета в JSON
$response = array('report' => $report);
$responseJson = json_encode($response);
// Возвращение отчета в JSON формате
echo $responseJson;
exit;
}
}
?>
Ответы (2 шт):
А ты права доступа проверил на файл базы? Сервер писать то туда может?
$ touch database.db
$ chown пользователь:группа database.db
Возможные варианты пользователя и группы
apache:apacheдля Apache Web Servernginix:nginixдля nginixhttpd:httpdну или так
Узнать наверняка можно в списке процессов написав ps -aux, ну или методом научного тыка перепровыва все три варианта :)
Добавленно спустя
Временно включи вывод ошибок. По умолчанию он подавляет ошибки.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'on');
Проверь php.ini
Должно быть включено
extension=pdo_sqlite
extension=sqlite3
Возможно PDO не может стартануть драйвер?
Третяя строчка $db = new PDO('sqlite:database.db'); сделай путь польным 'sqlite:'.__DIR__.'/database.db' возможно он пытается сохранить файл не там где ты ожидаешь?
Если всё выше перечисленное не помогло, идём в php.ini и временно включаем
display_startup_errors on
Тогд он просто обязан будет что-нибуть да рассказать тебе :)
Спустя 6 часов изнурительных поисков ошибки, выяснил, что проблема была в пакете - php. Я по глупости, решил, что если установлю сразу все пакеты, будет лучше, но оказалось, что они конфликтуют. Всем спасибо за помощь