Php 为什么mysqli_real_escape_string()需要两个参数?
有人能给我解释一下吗 让我们看一下这个脚本Php 为什么mysqli_real_escape_string()需要两个参数?,php,mysqli,php-5.3,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 $
<?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\u real\u escape\u string()
需要知道要将数据放入的数据库的字符编码
它不会自动假定一个特定的连接,因为如果您连接到多个数据库,您不希望它猜出您指的是哪一个
如果它已经在上面的脚本中,为什么还需要连接呢
函数不知道您想要哪个连接,您需要显式地传递它。如果打开多个数据库的多个连接,则必须显式传递一个连接。隐式传递最后一个连接在ext/mysql中是一种不好的做法,对于任何典型的软件开发来说都是不明智的
现在,为什么它需要一个连接呢?因为它需要知道连接编码。发出查询时,您正在向数据库发送一个简单的字节数据流。数据库以set连接编码解释这个字节流,将其转换为它可以读取的字符,以了解您想要从中获得什么。同一个字符在不同编码中的编码可能完全不同。因此,转义函数需要知道需要处理什么字符编码才能正确转义字符。如果操作不当,可能会利用SQL注入漏洞进行攻击。来自文档“考虑连接的当前字符集”。转义在字符集之间是不同的,或者可以是不同的。一个原因是转义更安全