Php 尝试捕捉不发射功能
我有一个类,它有一个方法(add_client_to_db),调用该方法时,将向MySQL数据库添加一个客户端。当值正确时,函数本身工作。我希望它将错误写入数据库(如果它收到错误)。我以前在其他项目中使用过错误日志功能(db_errorHandler),它工作得非常好 在我目前正在开发的这个应用程序中,我使用AJAX调用脚本,这是唯一的区别 当add_client_to_db函数获得良好的数据时,它就会工作。如果它得到坏数据,它不会将数据写入数据库(这是我想要的)。它不会启动db_errorHandler函数,或者由于某种原因它不工作 任何帮助都将不胜感激。在本例中,我故意使用错误的INSERT命令 functions.js:(这就是所谓的add_client.php脚本) add_client.php:(实例化客户机类并传入一些变量,然后尝试将客户机添加到数据库) class.clients.inc:Php 尝试捕捉不发射功能,php,jquery,mysql,ajax,Php,Jquery,Mysql,Ajax,我有一个类,它有一个方法(add_client_to_db),调用该方法时,将向MySQL数据库添加一个客户端。当值正确时,函数本身工作。我希望它将错误写入数据库(如果它收到错误)。我以前在其他项目中使用过错误日志功能(db_errorHandler),它工作得非常好 在我目前正在开发的这个应用程序中,我使用AJAX调用脚本,这是唯一的区别 当add_client_to_db函数获得良好的数据时,它就会工作。如果它得到坏数据,它不会将数据写入数据库(这是我想要的)。它不会启动db_errorHa
...
public function __construct($db) {
//Get the $db object
//Must be passed in when instantiating the class
$this->db = $db;
}
public function add_client_to_db() {
try {
$this->db->beginTransaction();
$query = "INSERT INTO `clients`"
. " VALUES (:id, :client_type, :firstName, :middleName, :lastName, :phone_home, :phone_mobile, :phone_office,"
. " :billing_street_address_1,ddd :billing_street_address_2, :billing_city, :billing_state, :billing_zip, :customer_status, :active)";
$stmt = $this->db->prepare($query);
$stmt->execute(array(
':id' => null,
':client_type' => $this->clientType,
':firstName' => $this->firstName,
':middleName' => $this->middleName,
':lastName' => $this->lastName,
':phone_home' => $this->phone_home,
':phone_mobile' => $this->phone_mobile,
':phone_office' => $this->phone_office,
':billing_street_address_1' => $this->billing_street_address_1,
':billing_street_address_2' => $this->billing_street_address_2,
':billing_city' => $this->billing_city,
':billing_state' => $this->billing_state,
':billing_zip' => $this->billing_zip,
':customer_status' => $this->customer_status,
':active' => TRUE
));
$this->db->commit();
} catch (Exception $e) {
//========================PROBLEMATIC AREA=====================================
$this->db_errorHandler($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
$this->db->rollback();
//=============================================================================
}
}
...
public function db_errorHandler($errno, $errstr, $errfile, $errline) {
$query = "INSERT INTO `error_log` "
. "VALUES(:id,:error_time,:errno,:errstr,:errfile,:errline)";
$stmt = $this->db->prepare($query);
$stmt->execute(array(
':id' => NULL,
':error_time' => NULL,
':errno' => $errno,
':errstr' => $errstr,
':errfile' => $errfile,
':errline' => $errline
));
return true; //Don't execute PHP error handler
}
我想我发现了错误。我在数据库连接脚本中设置了以下内容
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_NONE);
我将其更改为以下内容,现在似乎可以使用:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
这看起来很简单,但花了几天时间才弄明白。错误正在正确地记录到数据库中。谢谢你的帮助,雅各布。我很感激 您可以调用
db\u errorHandler
,它会向数据库中添加内容,然后调用rollback,它会撤消该更改。您需要先回滚,然后调用错误处理程序。我切换了db\u error\u handler和db->rollback()的顺序,仍然得到相同的结果。好主意。您是否尝试过一些调试,比如在不同的地方(比如在db\u errorHandler
的开头和结尾)添加对PHP的error\u log
的调用,运行脚本,然后检查您的错误日志以查看哪些执行点被命中?这可以帮助您确定是否根本没有调用db_errorHandler
,或者是否正在调用它并提前终止,或者是否正在调用它,正在完成,并且db查询本身失败。我让functions.js ajax success回调返回(数据)到警报:。。。成功:函数(数据){警报(数据);}。。。它会显示错误查询所预期的错误。(致命错误:调用成员execute()…)
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_NONE);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);