0

интересная ситуация. Написал небольшой чат на 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' =&gt; $report);
    $responseJson = json_encode($response);

    // Возвращение отчета в JSON формате
    echo $responseJson;
    exit;
}

} ?>

2 Answers2

1

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

  • Хорошо что все получилось!) А лайкосик мог-бы и поставить, хотя-бы за стремление помочь решить проблему ) – Eugene X May 31 '23 at 19:49
  • @EugenX :) Да я пытался поставить, но что-то не получилось, разбираться не стал)) Написано было, что голоса новичков не учитываются – Иван Jun 04 '23 at 17:56
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

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

Eugene X
  • 3,238
  • "На файле базы данных стоит 777 разрешение" – u_mulder May 31 '23 at 14:17
  • @u_mulder Дополнил ответ, пробуйте... Я вариаций много накидал ) – Eugene X May 31 '23 at 14:26
  • Спасибо за ответ. Дошел до последнего пункта. А где мне просматривать вывод ошибок из PHP? На HTML странице не отображаются, после вызова php, а напрямую php запустить не могу - "Страница недоступна". Может раз не отображаются, значит их и нет? Читать ведь базу я спокойно могу через php. в логах Апача есть только вот такие строки php7 error – Иван May 31 '23 at 15:53
  • По умолчанию PHP выводит ошибки в STDERR, куда он перенаправлен зависит от конфигурации сервера. К примеру Apache свои ошибки сохраняет в /var/log/httpd-error.log а так как PHP запускается из под Apache то и STDERR у них общий. Так-же бывают извращенные методы соединения, например PHP запускаеться как PHP7FPM сервер, тогда у него будет свой собственный лог – Eugene X May 31 '23 at 16:11
  • @u_Mulder кстати 0777 доступ делает весь сервер уязвимым, лично мой совет все-же менять владельца а не права! – Eugene X May 31 '23 at 16:55
  • @EugeneX Да сервер тестовый, в отчаянии просто уже 777 поставил. Лог STDERR пустой, а Apache2 выводит только PHP error. Забыл уточнить важный момент - писал код я на Винде, тестировал на MAMP и всё отлично работало. А вот на Линуксе не работает. Чувствую, что не хаватает чего-то. Сам код PHP кстати, работает, не идёт только запись в DB, а чтение проходит – Иван May 31 '23 at 17:26
  • @Иван STDERR это не лог, это pipe. У всех приложений даже оконных даже в windows при запуске создаются 3 пайпа - STDIN, STDOUT, STDERR. По сути это 3 текстовых буфера. STDIN отвечает за ввод текста в программу. STDOUT - вывод текста из программы. STDERR - за вывод ошибок из программы. Обычные консольные приложения их использую как ввод/вывод в консоль в оконных приложениях эти папйпы обычно перенаправляются в абстрактные получатели. – Eugene X May 31 '23 at 18:55