【问题标题】:PDO Doesn't send a 500 code upon failurePDO 失败时不发送 500 代码
【发布时间】:2018-07-02 15:12:51
【问题描述】:

我的网站向这个 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 表不存在。我希望XMLHttpRequeststatus500,因为查询显然总是会失败。 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 总是“尝试”,从不“抓住”。 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);
?>

【问题讨论】:

  • 200 是因为 AJAX 请求成功 - 它到达了您的 PHP 脚本。如果您希望 PHP 脚本通过 AJAX 返回 500 错误,您必须捕获它并用它做您想做的事情。您的 PHP 脚本也可以正常工作,它传递了 500,因为查询错误。

标签: php mysql ajax mysqli pdo


【解决方案1】:

确保 PDO 选项设置正确。通过 PDO 构造函数的 $option 参数设置 PDO::ATTR_ERRMODE =&gt; 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);

然后处理Exception并发送500 http错误码:

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

【讨论】:

  • @aswine 见How to send 500 Internal Server Error error from a PHP script。也许在没有echo 的情况下尝试丹尼尔的答案。
  • @Mikey 查看我的编辑。 catch 语句不运行。
  • 这不是我回答的“唯一”点。通过构造函数启用PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION 选项很重要。请向我们展示PDOConnect.php的内容
  • @DanielO。我明白。当我说“我刚刚尝试过”时,我的意思是通过构造函数设置错误模式。我编辑了我的问题以包含 PDOConnect.php 的内容。
  • 好的,谢谢。您已将选项设置为PDO::ERRMODE_WARNING 这不一样。请将此值设置为PDO::ERRMODE_EXCEPTION
【解决方案2】:

您也可以在 try...catch 语法中尝试此操作,以了解您在 PDO 查询中遇到的错误。

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

然后请注意,200 响应意味着您的 Ajax 请求成功。如果您收到 500 响应,请检查您的配置。 500 内部服务器错误是一个非常普遍的 HTTP 状态代码。这意味着网站上出现了问题,并且网络服务器无法指定确切的内容,因此无法满足客户端提出的请求。这与客户端无关,故障出在服务器上请求的网页/网站中。这个状态码可以被认为是 Web 服务器的“包罗万象”的服务器错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2019-05-24
    相关资源
    最近更新 更多