检查PDO准备语句时出错

use*_*661 16 php mysql

我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

checkSuccess()执行以下操作:

function checkSuccess($success) {
    if ($success == false) {
        //TODO: custom error page. 
        echo "Error connecting to database with this query.";
        die();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

其次,甚至需要检查这些值,或者我应该在执行这行代码后检查结果:

$result = $selectQueryResult->fetch(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)

我已经有代码执行此操作:

if ($result) { //test if query generated results
    // do successful shit
}

else {
    echo "404";
    $app->response()->status(404); //create 404 response header if no results
Run Code Online (Sandbox Code Playgroud)

尽管我试图通过插入奇怪的,不匹配的或冗长的查询来破坏预备语句过程,但我的程序总是在$result没有返回false我运行的任何函数的情况下进行赋值checkSuccess().那么也许我根本不需要检查上面的逻辑呢?请记住,我在程序的早期检查数据库连接是否成功.

mis*_*shu 19

我更喜欢将错误模式设置为抛出这样的异常:

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)

我连接到数据库后立即.所以每个问题都会抛出一个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());
}
Run Code Online (Sandbox Code Playgroud)

功能将在哪里:

function handle_sql_errors($query, $error_message)
{
    echo '<pre>';
    echo $query;
    echo '</pre>';
    echo $error_message;
    die;
}
Run Code Online (Sandbox Code Playgroud)

事实上我使用的是一般功能

$debug = debug_backtrace();
echo 'Found in ' . $debug[0]['file'] . ' on line ' . $debug[0]['line'];
Run Code Online (Sandbox Code Playgroud)

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

  • @YourCommonSense关心分享更多内容吗?也..这只是一个与初始代码尝试类似的例子..它也可以记录到文件,发送消息或任何类型的错误处理..问题是关于如何捕获错误,而不是他们怎么做 (7认同)

Eme*_*ing 6

你必须抓住PDOException

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

PDO异常

  • @YourCommonSense 这有点苛刻,`catch` 中的代码实际上并没有吐出任何内容:`//Do your error processing here` 听起来对我来说是正确的。 (4认同)
  • 并确保 PDO 抛出异常:`$db-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);` (3认同)