为什么mysqli_real_escape_string()需要两个参数?

时间:2014-08-20 18:58:50

标签: php mysqli php-5.3

请有人向我解释一下。

让我们来看看这个剧本。

<?php
$con=mysqli_connect("localhost","my_user","my_password","my_db");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// escape variables for security

$firstname = mysqli_real_escape_string($con, $_POST['firstname']);
$lastname = mysqli_real_escape_string($con, $_POST['lastname']);
$age = mysqli_real_escape_string($con, $_POST['age']);

$sql="INSERT INTO Persons (FirstName, LastName, Age)
VALUES ('$firstname', '$lastname', '$age')";

if (!mysqli_query($con,$sql)) {
  die('Error: ' . mysqli_error($con));
}
echo "1 record added";

mysqli_close($con);
?>

如果mysqli_real_escape_string()的作业是转义字符串中的字符,为什么它需要与它连接,如果它已经在上面的脚本中? 不要忘记mysqli_real_escape_string()从某个值的变量而不是从数据库中转义字符的事实。

如果是来自数据库,只有将相同的确切数据重新插入数据库才能使用它,是不是?

2 个答案:

答案 0 :(得分:4)

由于mysqli_real_escape_string()需要了解数据库的字符编码,因此您需要将数据放入其中。

它不会自动承担特定的连接,因为如果您已连接到多个数据库,则不希望它猜出您的意思。

答案 1 :(得分:4)

  

为什么它需要连接,如果它已经在上面的脚本中?

该功能不知道您想要哪个连接,您需要明确传递它。如果您打开多个数据库的多个连接,则必须显式传递一个连接。隐式传递最后一个连接是ext / mysql中普遍存在的一种不好的做法,对于任何典型的软件开发来说都不是理智的。

现在,它为什么需要连接?因为它需要知道连接编码。发出查询时,您将向数据库发送简单的字节数据流。数据库在设置连接编码中解释此字节流,将其转换为可以读取的字符,以便从中了解您的需求。在不同的编码中,相同的字符可以完全不同地编码。因此,转义函数需要知道它需要处理哪些字符编码才能正确转义字符。如果没有正确完成,可以利用SQL注入漏洞。