Php 尝试捕捉不发射功能

Php 尝试捕捉不发射功能,php,jquery,mysql,ajax,Php,Jquery,Mysql,Ajax,我有一个类,它有一个方法(add_client_to_db),调用该方法时,将向MySQL数据库添加一个客户端。当值正确时,函数本身工作。我希望它将错误写入数据库(如果它收到错误)。我以前在其他项目中使用过错误日志功能(db_errorHandler),它工作得非常好 在我目前正在开发的这个应用程序中,我使用AJAX调用脚本,这是唯一的区别 当add_client_to_db函数获得良好的数据时,它就会工作。如果它得到坏数据,它不会将数据写入数据库(这是我想要的)。它不会启动db_errorHa

我有一个类,它有一个方法(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:

...
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);