2013-04-24 50 views
0

我想实现安全查询使用预处理语句:PHP MYSQL错误处理 - 预处理语句

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 { 
(...) 

是它最好的方式做到这一点?此代码不可读。我可以使用类似尝试捕获块而不是if/else if?它会运作良好吗?

+0

例外会使大多数这种冗余。 – tadman 2013-04-24 15:05:36

回答

3

,你想,这将是更清楚:

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请求]

+0

我把坏的变量放在查询中,它没有抛出任何异常。我应该把执行()在if()语句中,并抛出新的异常...或切换mysqli报告模式? [链接](http://www.php.net/manual/en/mysqli-driver.report-mode.php)。当我将它切换到REPORT_ALL时,catch语句开始工作。没有设置报告模式...在catch里没有任何反应(我可以做出错误的查询,在catch块中插入exit()并且它不会被执行) – user1840547 2013-04-24 17:40:51

+0

当然你应该打开'error_reporting' ...但不是显示(最重要的是在生产环境中),最好记录错误和/或异常。 – shadyyx 2013-04-24 21:49:20

+0

代码低于这个 – user1840547 2013-04-26 19:27:21

0
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); 
} 

你愿意接受这个代码吗? :)

+0

这必须是对你的问题的编辑,而不是一个答案,除非它运行良好。我不知道'$ stmt'对象是什么(它是PDO对象还是MySQLi对象或某个特殊的DB对象?)。我不明白'$ stmt-> fetch()'应该做些什么。我有一个声明,它需要执行,之后没有任何提取...在我的答案中检查我编辑的代码... – shadyyx 2013-04-27 12:17:42