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

标签 php mysqli error-handling parameterized-query

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

对不起,如果这是一个新手问题,但 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 Parameterized Queries - Cache Duration [duplicate]//关闭 $stmt 不是必需的,因为 PHP 最终会这样做。

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

最佳答案

很有帮助的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);

        }
    }

关于php - 如何使用 PHP/MySQLi 正确运行和检查参数化数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25518582/

相关文章:

php - 启动时,每 10 秒运行一次 AJAX 请求

PHP MySQL 排序多维数组

php - 排序具有不同位数的MySQL数据

mysql - Mysqli导致内存使用情况

ruby-on-rails - Rails : Displaying state_machine validation errors

php - 按多列对多维数组进行排序

php - Mysql 就像非对象上的bind_param()

php - Mysql多级循环查询

javascript - WebSocket 重试次数有限制吗?

php - 使用PHP的动态输入字段的错误消息