当前位置: 首页 > 知识库问答 >
问题:

pdo捕获并输出mysql错误

曾枫
2023-03-14

我还在想方设法搞定PDO。

我有一个用PDO执行的insert语句。插入工作很好,但如果有一个错误,我希望它显示给用户。

我有下面的try catch块。

try{ 
        $insertuser = $db->prepare('INSERT INTO `she_she`.`Persons` (`idnumber`,`addedby`,`firstname`, `middlename`, `surname`, `fullname`, `gender`, `birthdate`, `homelanguage`, `department`, `employeetype`, `employeestatus`) VALUES  (?,?,?,?,?,?,?,?,?,?,?,?)'); 
        $insertuser->execute(array($idnumber,$user,$firstname, $middlename, $surname, $fullname, $gender, $birthdate, $language, $department, $employmenttype, $personstatus));  
    } 
    catch(PDOException $exception){ 
        return $exception; 
    } 

如果查询失败,或者假设有一个重复的IDNumber,我希望将此显示给用户。

如果我只是尝试回显变量$exception,它是不起作用的。

我想把mysql错误返回给用户。

我一如既往地感谢任何建议。

谢谢,瑞恩

更新

根据建议的答案编写新代码:

   try{ 
        $insertuser = $db->prepare('INSERT INTO `she_she`.`Persons` (`idnumber`,`addedby`,`firstname`, `middlename`, `surname`, `fullname`, `gender`, `birthdate`, `homelanguage`, `department`, `employeetype`, `employeestatus`) VALUES  (?,?,?,?,?,?,?,?,?,?,?,?)'); 
        $insertuser->execute(array($idnumber,$user,$firstname, $middlename, $surname, $fullname, $gender, $birthdate, $language, $department, $employmenttype, $personstatus));  
    } 
    catch(PDOException $exception){ 
       return $exception->getMessage(); 
    } 
echo "exception: ".$exception;

共有2个答案

周凯捷
2023-03-14

1.在数据库连接后添加ERRMODE_EXCEPTION模式:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

2.您必须对所有mysql查询使用try{}catch{}方法。像这样:

try {
    $SQL = "DELETE FROM items WHERE item_id=:item_id";
    $m = $dbh->prepare($SQL);
    $m->bindParam(':item_id', $item_id, PDO::PARAM_INT);
    $m->execute();
    //success
    $return = "Your success message.";
}
catch (PDOException $e) {
    //error
    $return = "Your fail message: " . $e->getMessage();
}
颜均
2023-03-14

默认情况下,PDO不处于将显示错误的状态。您需要在DB连接中提供以下内容

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

更多信息可以在这里看到

 类似资料:
  • 除非你开发的是非常简单的控制台应用, 否则你应该不希望php脚本代码产生的输出 直接被扔到激活的终端上. 捕获这些输出和你刚才用以覆写启动处理器的方法类似. 在sapi_module_struct中还有⼀些有用的回调: typedef struct _sapi_module_struct { ... int (*ub_write)(const char *str, unsigned

  • 问题内容: 与类似的命令不同,在默认情况下,该命令会生成一个包含任何错误消息的输出文件,该错误消息会导致脚本的执行停止,但我无法找到一种方法来执行此操作。我尝试在Linux Shell中使用管道来实现此目的: 但这只会传递发生错误之前发生的所有输出,因此该文件不包含任何错误信息。有谁知道如何捕获并执行R文件并将其保存到文件中时发生的任何错误? 问题答案: 将输出和错误放在同一文件中(假设sh /

  • 问题内容: 我想编写一个函数,该函数将执行shell命令并以字符串形式返回其输出,无论是错误还是成功消息。我只想获得与命令行相同的结果。 能做到这一点的代码示例是什么? 例如: 问题答案: 这个问题的答案取决于你使用的Python版本。最简单的方法是使用以下功能: 该功能适用于仍在广泛使用的几乎所有版本的Python(2.7+)。2但对于较新的版本,不再推荐使用此方法。 现代版本的Python(3

  • 问题内容: 我遇到了一个困扰我几天的问题。我在Python 2.7.10中使用了Paramiko模块,我想向Brocade路由器发出多个命令,但仅返回给定命令之一的输出,如下所示: 如果要打印完整的输出,它将包含发布到路由器的所有内容,但是我只想查看show命令的输出。 谁能解决这个问题? 我想问的最后一件事。我想过滤变量并检查是否出现诸如“ up”或“ down”之类的字符串,但是由于输出中的所

  • 问题内容: 我了解到,在Python中执行命令时,应该使用子进程。我想要实现的是通过ffmpeg对文件进行编码,并观察程序输出,直到文件完成。Ffmpeg将进度记录到stderr。 如果我尝试这样的事情: 调用child.communicate()后,程序无法继续执行,并等待命令完成。还有其他方法可以跟踪输出吗? 问题答案: communication()阻塞直到子进程返回,所以循环中的其余各行仅

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。