-1

我试图弄清楚使用准备好的语句和将变量转义/转换为字符串之间的区别,如下所示:

$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 注入而言,它们是否具有相同的目的?如果是这样,是否最好使用第二种方法,因为它确实节省了一些额外的输入?

我意识到我正在使用查询与准备,但即便如此,如果我将变量转换为字符串,我也看不出有什么区别?

哪种方法更好?

4

1 回答 1

3

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

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

浏览本网站上的标签,您可能会发现数以千计的简写,其中一些甚至非常聪明——但由于某种原因,它们都没有涉及用户定义的函数——而只是原始的 PHP 函数。

于 2013-10-06T20:57:09.810 回答