如何使用PHP / MySQLi正确运行和检查参数化数据库查询

时间:2014-08-27 03:40:46

标签: php mysqli error-handling parameterized-query

在阅读了有关参数化查询的相关问题之后,我意识到它们是完全(除非你内插表值或其他东西)防止SQL注入的方法,即使它们有点(好吧) ,非常)冗长和重复。但是,我一直在想如何正确地测试它们的错误处理,以及在某些情况下甚至是否需要错误处理。

很抱歉,如果这是一个新手问题,但不是PHP和MySQL安装在同一台服务器上?除非人们关心连接查询的语法或数据库连接代码或其他什么,否则我并不完全确定需要检查每个语句的错误,如:

if ($stmt->bind_param('s',$logon)) {
   if ($stmt->execute()) {
      if ($stmt->bind_result()) {

      } else { return 'bat'; }
   } else { return 'bar'; }
} else { return 'foo'; }

// or else:

$stmt->bind_param('s',$logon)) or trigger_error('Could not bind parameters!',E_USER_ERROR);

// etc.

作为旁注,如果由于某种原因$stmt连接未关闭,而mysqli连接是,那是否会导致某种内部服务器错误?或者关闭实际的mysqli连接也可以做到这一点吗?为什么要首先关闭$stmt

无论如何,谢谢你的回应。

更新:MySQL参数化查询 - 缓存持续时间[重复] //关闭$ stmt是不必要的,因为PHP无论如何都会这样做。

备注$stmt -> prepare(...)与服务器进行交互。

1 个答案:

答案 0 :(得分:0)

非常有帮助的AND运算符可以帮助简化所有if-else语句。虽然我确信还有其他更好的方法可以同时防止多个未捕获的异常,但这有望帮助其他寻求将来编写参数化查询的合理简单方法的人,或者实际上是嵌套查询:

// Procedural style:

$con = mysqli_connect('localhost','blah','foo','bar');
$query1 = "SELECT xyz FROM blah WHERE xyz = ?";
$username = 'ABC';


if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
} else {
    if (($stmt =
        mysqli_stmt_init($con) ) and
        mysqli_stmt_prepare($stmt,$query1) and
        mysqli_stmt_bind_param($stmt,'s',$username) and
        mysqli_stmt_execute($stmt) and
        mysqli_stmt_bind_result($stmt,$name) and
       ( mysqli_stmt_fetch($stmt) !== FALSE) ) { 
          // Be careful of the functions that can return null
          var_dump($name);
       }
}

// Object Oriented Style:

$con = new mysqli('localhost','blah','foo','bar');  
    if ($con->connect_errno) {
        printf("Connect failed: %s\n", $con->connect_error);
    } else {
        if ( ($stmt = $con->prepare($query1)) and 
            $stmt->bind_param('s',$username) and 
            $stmt->execute() and
            $stmt->bind_result($name) and 
            ($stmt->fetch() !== FALSE)) {
             var_dump($name);

        }
    }