PHP SQLite Не записывает данные в базу

Рейтинг: 0Ответов: 2Опубликовано: 31.05.2023

интересная ситуация. Написал небольшой чат на 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;
    }
}
?>

Ответы

▲ 1

Спустя 6 часов изнурительных поисков ошибки, выяснил, что проблема была в пакете - php. Я по глупости, решил, что если установлю сразу все пакеты, будет лучше, но оказалось, что они конфликтуют. Всем спасибо за помощь

▲ 0

А ты права доступа проверил на файл базы? Сервер писать то туда может?

$ touch database.db
$ chown пользователь:группа database.db

Возможные варианты пользователя и группы

  • apache:apache для Apache Web Server
  • nginix:nginix для nginix
  • httpd: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

Тогд он просто обязан будет что-нибуть да рассказать тебе :)