对我的第一份预备声明的反馈

时间:2013-03-10 16:36:51

标签: php mysql security prepared-statement sql-injection

我刚刚完成了我的第一份准备好的声明,出于安全原因转换为使用它们。我已经对它进行了测试并且它有效但我正在寻找关于代码本身的反馈(建设性的批评欢迎),尽管我理解它是相当基本的。另外,我有几个疑问:

  1. 如果你使用准备好的陈述,我说你不需要使用mysqli_escape_string吗?
  2. 使用mysqli_stmt_get_result功能会减少我必须做的写作量并且有效吗?
  3. 是否需要使用mysqli_stmt_close?我是否正确地说,如果不使用此功能,我将无法在该脚本中创建另一个预准备语句?
  4. 这是我的代码:

    <?php
    //prepared statement example
    include 'database.php';
    $query = "SELECT ID FROM users WHERE email = ?";
    $email = 'myemail@gmail.com';
    $statement = mysqli_stmt_init($connect);
    
    mysqli_stmt_prepare($statement, $query);
    mysqli_stmt_bind_param($statement, 's', $email);
    mysqli_stmt_execute($statement);
    mysqli_stmt_bind_result($statement, $id);
    mysqli_stmt_fetch($statement);
    
    echo $id;
    ?>
    

1 个答案:

答案 0 :(得分:2)

  

如果您使用预准备语句,我说您不需要使用mysqli_escape_string吗?

是。这是你要问的不好的迹象 - 意味着你不清楚all that mess works是怎么回事。

  

使用mysqli_stmt_get_result函数会减少我必须做的写作量并且有效吗?

是。但这里有坏消息:并不总是支持。因此,在某些安装上,它将无法正常工作。

  

是否需要使用mysqli_stmt_close?我是否正确地说,如果不使用此功能,我将无法在该脚本中创建另一个预准备语句?

为什么,没有。
您只需在此变量中重新创建另一个预准备语句即可。

顺便说一下,它强烈建议使用PDO而不是mysqli。它更加一致和用户友好 只是尝试绑定一个数组以便在IN()运算符中使用,并查看。

毕竟,它需要的代码少2倍:

$stm = $pdo->prepare($query);
$stm->execute(array($email));
$id = $stm->fetchColumn();