-1

我对 PDO 还很陌生。我有一个try and catch,当某些东西不存在时,即一个表,它会捕获并显示错误。

但是,我如何显示 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();
}
4

1 回答 1

6

我试图将“启用”一词插入一个很小的 ​​int 列

对mysql来说还可以。将插入 0。

我如何显示 sql 失败命令的错误消息/原因。

对于真正的错误,您只需设置 PHP 即可显示它们

ini_set('display_errors',1);

所以 - 你将能够看到每个未捕获的异常。

此外,如果您只想显示错误消息,但不处理错误本身,则根本不要使用 try..catch。PHP 已经完成了所有的工作。这才是重点。

大多数人确实将错误报告与错误处理混淆了。后者不应用于前者。处理错误消息时,您唯一的目标是让 PHP 引发它们,并设置正确的目的地:

  • 在开发服务器上,必须在屏幕上显示错误消息
  • 在实时服务器上不应该显示它,而是记录下来

如果没有所有这些 try-catch 块,您将能够通过几个 ini 设置或单个错误处理函数(我在另一个答案中向您提到)来控制错误消息(包括非异常)。

仅当您要自己处理错误时才使用 try..catch - 例如,连接到另一台服务器。

因此,要更详细地回答您的问题:

  1. 将 PDO 设置为异常模式。完成了。
  2. 删除所有仅处理错误消息的 try..catch 块。
  3. 使用上面的 ini 指令设置 PHP 以在开发服务器上显示错误。
  4. 在实时服务器上,强烈建议记录错误而不是通过电子邮件发送。但是,如果您仍然想要这种方式 - 使用单个自定义异常处理程序函数来发送电子邮件,而不是数百个 try..catch 块
于 2013-03-19T14:30:10.880 回答