PDO 预准备语句的错误检查

2022-08-30 19:59:35

我正在尝试使用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();
    }
}

两件事。首先,这是非常冗长和愚蠢的。一定有更好的方法。显然,我可以将布尔值存储在数组或其他东西中,以取出一行或2行代码,但仍然如此。

其次,是否有必要检查这些值,或者我应该在执行这行代码后检查结果:

$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

尽管我试图通过插入奇怪的,不匹配的或冗长的查询来中断预准备语句进程,但我的程序总是能够到达赋值,而不会返回我运行的任何函数。所以也许我根本不需要检查上面的逻辑?请记住,我在程序的前面检查了成功的数据库连接。$resultfalsecheckSuccess()


答案 1

我预先将错误模式设置为抛出这样的异常:

$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'];

告诉我如果我运行多个查询,问题出在哪里


答案 2

你必须抓住:PDOException

try {
    //your code/query
} catch (PDOException $e) {
    //Do your error handling here
    $message = $e->getMessage();
}

PDOException


推荐