Ошибка обновления PDO, не показывающая

Я новичок в PDO. У меня есть попытка и уловка, которая ловит и отображает ошибки, когда что-то не существует i.e в таблице.

Однако, как я могу показать сообщение об ошибке/причину для неудачных команд sql.

Например, ниже я пытался вставить слово "включено" в крошечный столбец int, но только показал мне пустой экран - пришлось отлаживать себя. Как я могу показать сообщения об ошибках SQL с ошибкой?

$db = new PDO('mysql:host='.$dateBaseHost.';dbname='.$dateBaseName, $dateBaseUsername, $dateBasePassword);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// set/get variables
$id = (isset($_GET['id']) === true) ? $_GET['id'] : die("ID not set") ; // ? : shorthand if else
$action = (isset($_GET['action']) === true) ? $_GET['action'] : die("Action not set") ; // ? : shorthand  if else


// query
$query = $db->prepare(" UPDATE `telephoneCountries` SET `enabled`= :action  WHERE `id` = :id ");


// bind parameters - avoids SQL injection
$query->bindValue(':id', $id);
$query->bindValue(':action', $action);

// try... if not catch exception
try {
    // run the query
    $query->execute();
}
catch (PDOException $e){
    //sendErrorMail($e->getMessage(), $e->getFile(), $e->getLine());
    echo $e->getMessage();
    echo $e->getFile();
    echo $e->getLine();
}

Ответ 1

Я пытался вставить слово "включено" в крошечный столбец int

это довольно нормально для mysql. 0 будет вставлен.

как я могу показать сообщение об ошибке/причину для неудачных команд sql.

для реальных ошибок вам нужно просто настроить PHP для отображения их

ini_set('display_errors',1);

поэтому вы сможете увидеть каждое неперехваченное исключение.

Кроме того, если вы собираетесь отображать сообщение об ошибке, но не обрабатывать эту ошибку, просто не используйте try..catch вообще. PHP будет делать всю работу уже. Это точка.

Большинство людей путают сообщения об ошибках с обработкой ошибок. Последнее не должно использоваться для первого. При работе с сообщениями об ошибках ваша единственная цель - сделать PHP для их повышения и настроить правильное назначение:

  • на сервере разработки сообщение об ошибке должно отображаться на экране
  • в режиме реального разговора он не должен отображаться, но зарегистрирован.

без всех этих блоков try-catch вы сможете управлять сообщениями об ошибках (включая не-исключения) с помощью пары настроек ini или одной функции обработчика ошибок (о чем я упомянул вам в другом ответе).

используйте try..catch, только если вы собираетесь обрабатывать само ошибку - скажем, для подключения к другому серверу, например.

Итак, чтобы ответить на ваш вопрос более подробно:

  • Установите PDO в режиме исключения. Выполнено уже.
  • Удалите все блоки try..catch, которые обрабатывают только сообщения об ошибках.
  • Установите PHP, чтобы показывать ошибки на сервере разработки с помощью директивы ini выше.
  • На реальном сервере настоятельно рекомендуется регистрировать ошибки, а не отправлять их по электронной почте. Но если вы все еще этого хотите, используйте одиночный настраиваемый обработчик исключений, чтобы отправлять электронные письма вместо сотен try..catch blocks

Ответ 2

Вместо ошибки catch вы можете использовать $query->rowCount(); для обнаружения успешных обновлений. İf rowCount() > 0, это означает, что обновление успешно.