我正在尝试使用PDO预处理语句为MySQL数据库上的查询创建正确的错误处理。我希望程序在检测到预准备语句进程中的错误时退出。利用PDO准备好的语句流程中的每个步骤在失败时返回False
的事实,我把这个令人反感的黑客扔在一起:
global $allFields;
global $db;
global $app;
//dynamically append all relevant fields to query using $allFields global
$selectQuery = 'SELECT ' . implode($allFields, ', ') .
' FROM People WHERE ' . $fieldName . ' = :value';
//prepared statement -- returns boolean false if failure running query; run success check
$success = $selectQueryResult = $db->prepare($selectQuery);
checkSuccess($success);
$success = $selectQueryResult->bindParam(':value', $fieldValue, PDO::PARAM_STR);
checkSuccess($success);
$success = $selectQueryResult->execute();
checkSuccess($success);
checkSuccess()
执行以下操作:
function checkSuccess($success) {
if ($success == false) {
//TODO: custom error page.
echo "Error connecting to database with this query.";
die();
}
}
两件事。首先,这是非常冗长和愚蠢的。肯定有更好的办法。显然,我可以将布尔值存储在一个数组或类似的东西中,以便取出一行或两行代码,但仍然如此。
其次,甚至需要检查这些值,或者我应该在执行这行代码后检查结果:
$result = $selectQueryResult->fetch(PDO::FETCH_ASSOC);
我已经有了执行此操作的代码:
if ($result) { //test if query generated results
// do successful shit
}
else {
echo "404";
$app->response()->status(404); //create 404 response header if no results
尽管我尝试通过插入奇怪的,不匹配的或冗长的查询来破坏预先准备好的语句流程,但我的程序始终会在$result
赋值时进行false
赋值而不返回任何函数的checkSuccess()
我跑{{1}}。那么也许我根本不需要检查上面的逻辑呢?请记住,我在程序的早期检查数据库连接是否成功。
答案 0 :(得分:18)
我更喜欢将错误模式设置为抛出这样的异常:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
我连接到数据库后。所以每个问题都会抛出一个PDOException 所以你的代码是:
$selectQuery = '
SELECT
' . implode($allFields, ', ') . '
FROM
People
WHERE
' . $fieldName . ' = :value
';
try
{
$selectQueryResult = $db->prepare($selectQuery);
selectQueryResult->bindParam(':value', $fieldValue);
$selectQueryResult->execute();
}
catch(PDOException $e)
{
handle_sql_errors($selectQuery, $e->getMessage());
}
函数将是:
function handle_sql_errors($query, $error_message)
{
echo '<pre>';
echo $query;
echo '</pre>';
echo $error_message;
die;
}
实际上我使用的是一般功能,也有类似
的功能$debug = debug_backtrace();
echo 'Found in ' . $debug[0]['file'] . ' on line ' . $debug[0]['line'];
如果我正在运行多个查询,请告诉我问题在哪里
答案 1 :(得分:4)
你必须抓住PDOException
:
try {
//your code/query
} catch (PDOException $e) {
//Do your error handling here
$message = $e->getMessage();
}