mysqli bind_param vs'“。$ var。”';有什么不同?

时间:2013-10-06 20:46:47

标签: php mysqli

我试图找出使用预准备语句和将变量转换/转换为字符串之间的区别,如下所示:

$sql = "SELECT `user_id`, `user_name` FROM table WHERE `user_id` = ? and `user_name`= ?";
$sqlPrepare = $conn->prepare($sql);
$sqlPrepare->bind_param('ss', $user_id, $user_name);
$sqlPrepare->execute();
$result = $ $sqlPrepare->get_result();
            if($result->num_rows ===0)
                         {
                        // Do work
                         }

VS

mysqli::real_escape_string($whatever_vars_needed);

$sql = "SELECT `user_id`, `user_name` FROM table WHERE `user_id` = '".$user_id."' and `user_name`= '".$user_name."'";
$sqlQuery = $conn->query($sql);
    if($sqlQuery->num_rows ===0)
                         {
                        // Do work
                         }

就防止sql注入而言,它们是否会起到同样的作用?如果是这样,是不是首选使用第二种方法,因为它确实节省了一些额外的输入?

我意识到我正在使用查询与准备,但即便如此,如果我将变量转换为字符串,我真的没有看到差异吗?

哪种方法比较好?

1 个答案:

答案 0 :(得分:3)

  

因为它确实节省了一些额外的打字

这是PHP亚文化的一个非常有趣的现象 出于某种原因,常规PHP用户不知道用户定义的函数或任何其他复杂的控件或数据结构。因此,他们唯一的“节省点打字”的想法是摆脱一些“不必要的”操作,如安全措施或错误报告。

浏览此网站上的标记,您可能会发现数以千计的短手,其中一些甚至非常聪明 - 但由于某些原因,它们都不涉及用户定义的函数 - 而只是原始的PHP函数。