3

Я начал изучать и PHP, и ASP.NET, пока что у меня в голове каша..
ОС: Ubuntu 18.04
Сервер: Server version: Apache/2.4.29 (Ubuntu)/

Server built:   2018-10-10T18:59:25

PHP: PHP 7.2.15-0ubuntu0.18.04.1
MySQL: mysql Ver 14.14 Distrib 5.7.25 phpmyadmin: 4.8.5

Содержание index.php:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <? require "add.php";?>
</body>
</html>

А внутри add.php расположен след. код:

<form action="controller.php" method="post">
        <input type="text" name="theme"><br/><br/>
        <textarea name="text"  cols="60" rows="13" placeholder="Введите текст статьи"></textarea><br/><br/>
        <button type="submit" >addDB</button>
</form>

А внутри controller.php расположен следующий код:

<?php
    $pdo = new PDO("mysql:host = localhost; dbname = input_db", "root", "123");

    $sql = ("INSERT INTO tables (theme, text) VALUES (:theme, :text)");

    $statment = $pdo->prepare($sql);
    $statment -> bindParam(":theme", $_POST['theme']);
    $statment -> bindParam(":text", $_POST['text']);
    $statment -> execute();

Вроде всё кажется правильным, но почему-то в базу не добавляет введенные данныею

И еще как сделать так, чтоб при нажатии, на кнопку AddDB и отправил запрос,и потом возвращался на главную страницу?

  • вы хоть какой-то дебаг делали ? ошибки выдает в логе ? – madfan41k Feb 28 '19 at 06:02
  • xdebug установил. Ошибка никак нету, пустая страница отображается, но и не добавляется на базу.. – Kalys Osmon Feb 28 '19 at 06:06
  • 1
    сделайте вывод $_POST а начале файла controller.php var_dump($_POST); die; – madfan41k Feb 28 '19 at 06:07
  • и еще где-то прочитал, что xdebug не все ошибку отображает.. При не правильном подключении в базу, xdebug отображает ошибку. Возможно такие частые ошибки только отображает, видимо .. Вот так вот.. – Kalys Osmon Feb 28 '19 at 06:10
  • Я вардампил, все получает из фоормы, но дальше не отправляет.. – Kalys Osmon Feb 28 '19 at 06:15
  • /var/www/html/input/controller.php:3: array (size=2)

    'theme' => string 'Тема статьи' (length=21)

    'text' => string 'Какой-то текст...' (length=29)

    – Kalys Osmon Feb 28 '19 at 06:16
  • ну тогда что-то с подключением – madfan41k Feb 28 '19 at 06:16
  • 1
    try { $pdo = new PDO("mysql:host = localhost; dbname = input_db", "root", "123"); } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "
    "; die(); }
    – madfan41k Feb 28 '19 at 06:17
  • пробовал, все нормально подключился, вардампил даже, нормально.. object(PDO)[1] вывел.. может у меня проблема с phpmyadmin? А на счет верхнего кода, все так да, нормально все, правильно все сделал?? – Kalys Osmon Feb 28 '19 at 06:27
  • madfan41k, если у вас есть возможность, можете себе пробовать запустить мой код.. – Kalys Osmon Feb 28 '19 at 06:29

1 Answers1

4

Это очень хорошй и важный вопрос.
Но ответ на него не совсем очевидный. И звучит он так: "Надо правильно соединяться с PDO".

Вообще, тема "что делать, если код не работает" довольно обширная, но самое первое, что надо делать в таком случае - это попросить РНР сообщать обо всех ошибках, которые произошли в скрипте.

Плюс, в данном случае - попросить PDO сообщать об ошибке, произошедшей при выполнении запроса. И вот как раз для этого и надо правильно соединяться: Как правильно соединяться с Mysql в PDO. Помимо других важных настроек мы таже сконфигурируем правильный режим выброса ошибок для PDO.

После этого PDO само начнет нам сообщать, с какой проблемой оно столкнулось! Надо только убедиться, что PHP в принципе настроен так, чтобы сообщать об ошибках.

<?php

$options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; $dsn = "mysql:host=localhost;dbname=input_db;charset=utf8mb4"; $pdo = new PDO($dsn, "root", "123", $options);

$sql = "INSERT INTO tables (theme, text) VALUES (:theme, :text)"; $statment = $pdo->prepare($sql); $statment -> bindParam(":theme", $_POST['theme']); $statment -> bindParam(":text", $_POST['text']); $statment -> execute();

Скорее всего PDO сообщит о том, что не найдена база данных или хост, поскольку никаких украшений (включая пробелы) в DSN быть не должно.

Но конкретная ошибка в данном случае не важна, поскольку ошибки всегда разные, и на все случаи все равно ответить невозможно. Но это и не нужно - надо просто прочитать сообщение об ошибке, и исправить её.

  • Все сработала, Спасибо огромное Ипатьев и madfan41k.. там только $dsn добавить внутри try перед "root".. Спасибо, огромное еще раз.. Я еще вернусь, (I all be back) ;) – Kalys Osmon Feb 28 '19 at 08:03