【问题标题】:PHP MYSQL error handling - prepared statementsPHP MYSQL 错误处理 - 准备好的语句
【发布时间】:2013-04-24 15:04:20
【问题描述】:

我正在尝试使用准备好的语句来实现安全查询:

if (!($stmt = $db->prepare($q['query1']))) {
    myException("Prepare failed: (" . $db->errno . ") " . $db->error);
} else if (!$stmt->bind_param("si", $variable1, $variable2)) {
    myException("Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error);
} else if (!$stmt->execute() || !$stmt->store_result()) {
    myException("Execute failed: (" . $stmt->errno . ") " . $stmt->error);
} else {
 (...)

这是最好的方法吗?此代码不可读。我可以使用 try catch 块代替 if/else if 吗?效果会好吗?

【问题讨论】:

  • 例外情况会使大部分内容变得多余。

标签: php mysql error-handling


【解决方案1】:

如你所想,这会更清楚:

try {
    $stmt = $db->prepare($q['query1']);

    $stmt->bind_param("si", $variable1, $variable2);
    $stmt->bind_param("is", $variable3, $variable4);

    if($stmt->execute()) {
        $stmt->store_result();
        $stmt->bind_result($result);
        $stmt->close();
    } else {
        throw new Exception("error");
    }
} catch (\Exception $e) {
    echo $e->getMessage();
}

[由于 OP 请求,代码已被编辑]

【讨论】:

  • 我在查询中放入了错误的变量,它没有抛出任何异常。我应该将 execute() 放在 if() 语句中并抛出新的异常......还是切换 mysqli 报告模式? link 。当我将它切换到 REPORT_ALL 时,catch 语句开始工作。如果不设置报告模式...catch 内部什么也没有发生(我可以进行错误查询,在 catch 块中插入 exit() 并且它不会被执行)
  • 当然,您应该打开error_reporting...但是与其显示错误(最重要的是在生产环境中),不如记录错误和/或异常。
【解决方案2】:
try {
    $stmt = $db->prepare($q['query']);
    $stmt->bind_param("s", $s);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($result);

    if ($stmt->fetch()) {
        $stmt->close();
        return $result;
    }
    else
        throw new Exception("error");
} catch (Exception $e) {
    myExceptionHandler($e);
}

您会接受该代码吗? :)

【讨论】:

  • 这必须是对您的问题的编辑,而不是答案,除非它运行良好。我不知道$stmt 对象是什么(它是PDO 对象还是MySQLi 对象或一些特殊的DB 对象?)。我不明白$stmt->fetch() 有什么用处。我你有一个声明,它需要被执行,之后没有什么可以获取的......检查我在我的答案中编辑的代码......
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多