Привет. В 2021 году - прихостился на freehostia.com. Создал страничку обратной связи. Запустил,её, через форму - работает. А недавно проверил - оказалось, что нет. Это - информация по серверу и работе, на сегодняшний день: PHP: // dbconnect.php try { $pdo = new PDO( 'mysql:host=localhost;dbname=baza', 'baza', 'password' ); } catch(PDOException $e) {echo'<font color="#ff0000">Нет соединения с базой MySQL<br></font>', $e->getMessage();} // form_action.php require_once('dbconnect.php'); // добавляем переменные на базу, в таблицу 'comm' try { $query="INSERT INTO comm (username, dt, msg) VALUES (:username, NOW(), :msg)"; $comm=$pdo->prepare($query); $comm->execute(['username' => $_POST['username'], 'msg' => $_POST['msg']]); header('Location: index.php'); } catch(PDOException $e){echo'<font color="#ff0000">Данные формы не добавлены</font>', $e->getMessage();} // выборка require_once('dbconnect.php'); try { $sql="SELECT * FROM comm ORDER BY dt DESC"; $q = $pdo->query($sql); $q->setFetchMode(PDO::FETCH_ASSOC); } catch(PDOException $e){echo'<font color="#ff0000">Данные не выбраны</font>', $e->getMessage();} это - сервер: Сервер: 10.123.0.78 via TCP/IP Тип сервера: MySQL Соединение сервера: SSL не используется Версия сервера: 8.0.16 - MySQL Community Server - GPL Версия протокола: 10 Пользователь: net_baza@10.123.0.183 Кодировка сервера: UTF-8 Unicode (utf8) При добавлении "напрямую" - выборка проходит, через форму - нет. Ошибок - нет. Не пойму - в чём дело?
Если через форму обратной связи - то нет. Если добавить "напрямую" - база -> таблица -> вставить - то, даже - выборка проходит. Я посмотрел на dev.mysql.com/doc/ - там, что-то, странное. Выборка и добавление - в разных файлах.
baza@localhost как-то не согласуется с net_baza@10.123.0.183 Или это две разные учетки? Или первая условная? А вообще код – жесть! Попросите какого-нибудь начинающего программиста переписать за копеечку. Потому что ЭТО писал НЕ программист.
Исходный код, который вы предоставили, по нему очень трудно понять почему у вас не работает форма обратной связи. Поэтому я предлагаю свою версию формы обратной связи. Файлы проекта: - dbconnect.php - form_action.php - index.php Исходный код каждого из файлов - dbconnect.php PHP: <?php $dsn = 'mysql:host=localhost;dbname=baza;charset=utf8mb4'; $user = 'baza'; $password = 'password'; try { $pdo = new PDO($dsn, $user, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]); } catch (PDOException $e) { die('<p style="color:red;">Нет соединения с базой MySQL:<br>' . htmlspecialchars($e->getMessage()) . '</p>'); } - form_action.php PHP: <?php if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header('Location: index.php'); exit; } require_once 'dbconnect.php'; if (!empty($_POST['username']) && !empty($_POST['msg'])) { try { $stmt = $pdo->prepare("INSERT INTO comm (username, dt, msg) VALUES (:username, NOW(), :msg)"); $stmt->execute([ 'username' => trim($_POST['username']), 'msg' => trim($_POST['msg']) ]); } catch (PDOException $e) { die('<p style="color:red;">Данные формы не добавлены: ' . htmlspecialchars($e->getMessage()) . '</p>'); } } header('Location: index.php'); exit; - index.php PHP: <?php require_once 'dbconnect.php'; // Получаем список сообщений try { $stmt = $pdo->query("SELECT * FROM comm ORDER BY dt DESC"); $messages = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { die('<p>Ошибка при получении данных: ' . htmlspecialchars($e->getMessage()) . '</p>'); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h2>Оставьте комментарий</h2> <form action="form_action.php" method="post"> <p> <label>Имя:<br> <input type="text" name="username" required> </label> </p> <p> <label>Сообщение:<br> <textarea name="msg" rows="4" cols="40" required></textarea> </label> </p> <p><button type="submit">Отправить</button></p> </form> <h2>Комментарии:</h2> <?php if (empty($messages)): ?> <p>Комментариев нет.</p> <?php else: ?> <?php foreach ($messages as $row): ?> <div class="message"> <strong><?php echo htmlspecialchars($row['username']) ?></strong> <time><?php echo htmlspecialchars($row['dt']) ?></time> <p><?php echo htmlspecialchars($row['msg']) ?></p> </div> <?php endforeach; ?> <?php endif; ?> </body> </html> - Структура таблицы Код (Text): CREATE TABLE comm ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(100) NOT NULL, dt DATETIME NOT NULL, msg TEXT NOT NULL );
Высылаю вам последовательность скриншотов, для того чтобы показать вам, что код, который я привел рабочий.
dbconnect.php: Ошибка синтаксического анализа : синтаксическая ошибка, неожиданный символ «[» в /comment/dbconnect.php в строке 7 Если убрать скобку - неожиданный T_DOUBLE_ARROW (=>)
А нефиг настолько старую пыху пользовать... Этот синтаксис в 7.0 появился (если не раньше, но в 7 точно уже был), а текущая 8.4. Раньше надо было array() писать
5.4. У нас много где это минималка, а кв. скобки, естественно, вовсю используются. --- Добавлено --- @cupoma58, хочешь сидеть на пятерке, обновись хотя бы до 5.6.30 (максималка сейчас – 5.6.40).
Ну, заработало, вроде. Только время - по Гринвичу. Поменять-бы. В таблице, это, выглядит так: Имя: dt Тип: timestamp Null: Да По умолчанию: CURRENT_TIMESTAMP Дополнительно: DEFAULT_GENERATED