当前位置: 首页 > 面试题库 >

错误检查PDO准备的语句[重复]

单于翰飞
2023-03-14
问题内容

这个问题已经在这里有了答案

我的PDO声明无效 (1个答案)

2年前关闭。

我正在尝试使用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()。所以也许我根本不需要检查上面的逻辑?请记住,我在程序的前面检查了数据库连接是否成功。


问题答案:

我倾向于将错误模式设置为引发如下异常:

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

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



 类似资料:
  • 问题内容: 今天有人告诉我,我确实应该在应用程序中使用PDO和准备好的语句。在我了解好处的同时,我也在努力了解如何将其实现到我的工作流程中。除了它使代码更简洁外,我是否应该有一个特定的数据库类来容纳所有准备好的语句,还是应该在每次运行查询时都创建一个?我发现很难理解何时应使用标准PDO查询以及何时应使用准备好的语句。任何示例,技巧或教程链接将不胜感激。 问题答案: pdo :: prepare()

  • 问题内容: 这个问题已经在这里有了答案 : 从PDO准备好的语句中获取原始SQL查询字符串 (16个答案) 5个月前关闭。 有没有一种方法可以检索用于生成PDO Prepared语句对象的查询? 问题答案: 尝试$ statement-> queryString 。

  • 问题内容: 这个问题已经在这里有了答案 : mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误? (1个答案) 3年前关闭。 我正在努力弄清MySQli,但我对错误报告感到困惑。我正在使用MySQLi’prepare’语句的返回值来检测执行SQL时的错误,如下所示: 但是,prepare语句的返回值是否仅检测SQL语句的前

  • 问题内容: 这个问题已经在这里有了答案 : 如何在LIMIT子句中应用bindValue方法? (10个答案) 5年前关闭。 我在应用程序中使用PDO。但是在包含的查询中使用准备好的语句时遇到问题。有什么问题? 代码: 错误: 检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“ 0”,“ 20”附近使用 问题答案: 关于在带有预备语句的MySQL上发布LIMIT关键字,以下代码可以

  • 问题内容: 我使用准备好的语句编写了select语句。每次尝试运行它都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做