PDO在发生故障时不发送500代码

时间:2018-01-23 17:44:55

标签: php mysql ajax mysqli pdo

我的网站向此PHP脚本发送XMLHttpRequest

<?php
if(isset($_POST))
{
    require ('../../PDOConnect.php');   
    try
    {
        $insert = $pdo->prepare("INSERT INTO priorities 
            employeeID, WorkOrderNumber
            VALUES (?,?)");
        $insert->bindValue(1,$_POST['employeeID'],PDO::PARAM_INT);
        $insert->bindValue(2,$_POST['WorkOrderNumber'],PDO::PARAM_INT);
        $insert->execute();
        echo "try";
    }
    catch(Exception $e)
    {
        echo "catch";
        echo $e;
    }
}
?>

此时,priorities表不存在。我希望XMLHttpRequest status500,因为查询显然总会失败。 PDO会记录错误,因为PDOConnect包含

$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);

但是我得到的是200,而不是500。我是PDO的新手。当我使用MySQLi预处理语句时,我会从失败的PHP脚本中获得500,但PDO的行为方式不同。我希望客户端知道查询失败,而不是让200回来并认为一切正常。无论有没有trycatch,我都会得到相同的结果。我不理解PDO是如何工作的?我是否需要更改PDO设置?

修改:我添加了echo "try";echo "catch";。客户responseText总是&#34;尝试&#34;永远&#34;赶上&#34;。似乎catch语句不会运行。那是为什么?

我的PDOConnect.php文件包含:

<?php
$options =
[
        PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
];
        $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8mb4','root','mypassword',$options);
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
?>

2 个答案:

答案 0 :(得分:1)

确保正确设置PDO选项。通过PDO构造函数的$ option参数设置PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION选项是重要的。不要通过setAttribute()设置此选项,这是没有意义的。

$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_PERSISTENT => false,
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES $charset COLLATE $collate"
];

$pdo = new PDO($dsn, $username, $password, $options);

然后处理异常并发送500 http错误代码:

try {
    // do something
} catch(Exception $ex) {
    header('500 Internal Server Error', true, 500);
    echo $ex->getMessage();
}

答案 1 :(得分:0)

您也可以尝试使用try ... catch语法来了解您在PDO查询中遇到的错误。

<?php
try {
    //pdo query
}
catch(PDOException $e) {
    echo 'Exception -> ';
    var_dump($e->getMessage());
}

然后请注意 200 响应意味着您的Ajax请求成功。如果您收到500响应,请检查您的配置。 500 内部服务器错误是一种非常通用的HTTP状态代码。这意味着网站上出现了问题,并且网络服务器无法确切指出,因此无法完成客户端的请求。这与客户端无关,故障位于服务器所在的网页/网站上。此状态代码可被视为Web服务器的“全部捕获”服务器错误。