Почему не может поймать ошибку с PDOException? - PullRequest
0 голосов
/ 31 декабря 2018

Получите информацию, переданную методом POST, обрежьте все пробелы в строке, затем запустите новый экземпляр pdo, подключите mysql и вставьте информацию, переданную POST, в таблицу.

$title = trim($_POST["title"]);
$content = trim($_POST["content"]);

$dsn = "mysql:host=localhost;dbname=blog";
$con = new PDO($dsn,"root","xxxx");

$title = $con->quote($title);
$content = $con->quote($content);

try
{
    $sql = "insert into tmp (`title`,`content`) values('$title','$content')";
    $stmt = $con->prepare($sql);
    $stmt->execute();
}
catch(PDOException  $e)
{
    echo $e->getMessage();
}

Выше мойPHP-код для выполнения работы, самая большая команда импорта -

insert into tmp (`title`,`content`) values('$title','$content')";

. При запуске приведенного выше PHP-кода информация об ошибке не отображается, и в /var/log/mysql/error.log ошибки нет, но информация не была вставлена ​​вбазы данных.

Я изменил

insert into tmp (`title`,`content`) values('$title','$content')";

на

insert into tmp (`title`,`content`) values($title,$content)";

Информация, передаваемая POST, теперь может быть вставлена ​​в mysql, проблема, которая меня смущает, заключается в том, что:

  1. echo $e->getMessage(); не действуют вообще.
  2. нет информации об ошибках в /var/log/mysql/error.log

Как я могу перехватить эти ошибки?

1 Ответ

0 голосов
/ 31 декабря 2018

Исключение, которое вы пытаетесь перехватить, никогда не будет выдано, потому что вам нужно , чтобы сообщить PDO, как вы хотите, чтобы он обрабатывал ошибки .

$con = new PDO($dsn,"root","xxxx");
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

В противном случае, по умолчанию PDO::ERRMODE_SILENT будет использоваться:

Это режим по умолчанию.PDO просто установит код ошибки, который вы будете проверять, используя методы PDO :: errorCode () и PDO :: errorInfo () как для оператора, так и для объектов базы данных;если ошибка возникла в результате вызова объекта оператора, вы должны вызвать метод PDOStatement :: errorCode () или PDOStatement :: errorInfo () для этого объекта.Если ошибка возникла в результате вызова объекта базы данных, вы бы вместо этого вызвали эти методы для объекта базы данных.

Тангенциально, вы должны использовать подготовленные заявления .Вы используете вызов prepare(), но вы не параметризуете запрос и не привязываете переменные, как следует.Использование quote() недостаточно безопасно.

...