请有人向我解释一下。
让我们来看看这个剧本。
<?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()
从某个值的变量而不是从数据库中转义字符的事实。
如果是来自数据库,只有将相同的确切数据重新插入数据库才能使用它,是不是?
答案 0 :(得分:4)
由于mysqli_real_escape_string()
需要了解数据库的字符编码,因此您需要将数据放入其中。
它不会自动承担特定的连接,因为如果您已连接到多个数据库,则不希望它猜出您的意思。
答案 1 :(得分:4)
为什么它需要连接,如果它已经在上面的脚本中?
该功能不知道您想要哪个连接,您需要明确传递它。如果您打开多个数据库的多个连接,则必须显式传递一个连接。隐式传递最后一个连接是ext / mysql中普遍存在的一种不好的做法,对于任何典型的软件开发来说都不是理智的。
现在,它为什么需要连接?因为它需要知道连接编码。发出查询时,您将向数据库发送简单的字节数据流。数据库在设置连接编码中解释此字节流,将其转换为可以读取的字符,以便从中了解您的需求。在不同的编码中,相同的字符可以完全不同地编码。因此,转义函数需要知道它需要处理哪些字符编码才能正确转义字符。如果没有正确完成,可以利用SQL注入漏洞。