【问题标题】:PDO Insert Should Throw Exception, But Doesn't [duplicate]PDO 插入应该引发异常,但不会 [重复]
【发布时间】:2019-01-10 21:00:50
【问题描述】:

我有一个简单的脚本,可以在正常条件下理想地工作。出于测试目的,我试图让它抛出异常。这是一个 PHP PDO 插入。如果未插入新行,我希望它抛出异常。

这是我的代码:

$query = "INSERT INTO reservations (requestor, location)
    VALUES (:requestor, :location)";
$statement = $pdo->prepare($query);

try {
    $statement->execute([
            'requestor' => $requestor_id,
            'location' => $request_location
    ]);
    echo "Success.";
}
catch(Exception $e) {
    echo "Sorry, but your request was not completed properly.<br>";
    echo "Message: " . $e->getMessage();
}

这非常有效。但是,如果我使用代码使其不起作用,通过更改表列名称或绑定参数,它仍然会给出成功消息。正如预期的那样,我没有插入新行。见下文:

$query = "INSERT INTO reservations (requestorzzz, locationzzz)
    VALUES (:requestor, :location)";
$statement = $pdo->prepare($query);

try {
    $statement->execute([
            'requestorzzz' => $requestor_id,
            'locationzzz' => $request_location
    ]);
    echo "Thank you! Your request was received.";
}
catch(Exception $e) {
    echo "Sorry, but your request was not completed properly.<br>";
    echo "Message: " . $e->getMessage();
}

我确实收到了 php 错误消息,但没有抛出异常。没有创建新列(自然),但我需要它去捕获以通知用户他们的请求没有发生。是不是我做错了什么?

【问题讨论】:

  • 是否设置了例外? php.net/manual/en/pdo.error-handling.php
  • prepare() 也放入try 块内。
  • 好的,谢谢。请随时将这些 cmets 作为答案,我会支持它们。这些都有助于解决我的问题。
  • 在我们的应用程序中,我们经常将整个脚本包装在一个大的 try 块中,因此任何地方的任何 PDO 异常都会中止它。
  • 感谢马克,但就个人而言,我认为它应该是(either) 一个社区 wiki 答案,而不是应该由 @AlexHowansky 和我留下的 cmets 做出代表。编辑: 作为My PDO Statement doesn't work的副本关闭。

标签: php pdo try-catch


【解决方案1】:

2 分。

首先由@Funk Forty Niner 指出。默认情况下 PDO 发送警告,而不是异常。您必须设置错误模式:

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

第二:在你的执行方法中使用“命名参数”而不是“列名”

$statement->execute([
        ':requestor' => $requestor_id,
        ':location' => $request_location
]);

【讨论】:

  • 当绑定参数可选时在键中使用:。这是有充分理由的 - 所以我们可以只绑定 -&gt;execute($data) 而无需转换键。
猜你喜欢
  • 2015-12-12
  • 2015-01-25
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多