我的网站向此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
status
为500
,因为查询显然总会失败。 PDO会记录错误,因为PDOConnect包含
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
但是我得到的是200
,而不是500
。我是PDO的新手。当我使用MySQLi预处理语句时,我会从失败的PHP脚本中获得500
,但PDO的行为方式不同。我希望客户端知道查询失败,而不是让200
回来并认为一切正常。无论有没有try
和catch
,我都会得到相同的结果。我不理解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);
?>
答案 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服务器的“全部捕获”服务器错误。