我提出以下问题...我必须确保以下查询也接受带有引号..的值 我尝试使用mysqli_real_escape_string,但是没有用..我附加了尝试..
1°将功能放置在帖子中
$idCantiere = $_POST["idCantiere"];
$nomeCantiere = mysqli_real_escape_string($_POST["nomeCantiere"]);
$sql = "INSERT INTO Cantiere(
idCantiere,
nomeCantiere)
VALUES(
'$idCantiere',
'$nomeCantiere')";
if (mysqli_query($mysqli, $sql))
{
echo "<script type='text/javascript'>alert('Cantiere Inserto');
</script>";
} else
{
echo "Error: " . $sql . "" . mysqli_error($mysqli);
}
2°在查询过程中放置功能
$idCantiere = $_POST["idCantiere"];
$nomeCantiere = $_POST["nomeCantiere"];
$sql = "INSERT INTO Cantiere(
idCantiere,
nomeCantiere)
VALUES(
'$idCantiere',
mysqli_real_escape_string('$nomeCantiere'))";
if (mysqli_query($mysqli, $sql))
{
echo "<script type='text/javascript'>alert('Cantiere Inserto');
</script>";
} else
{
echo "Error: " . $sql . "" . mysqli_error($mysqli);
}
我该如何解决问题?
答案 0 :(得分:3)
拖放mysqli_real_escape_string()
并仅使用准备好的语句,该语句很简单,可以防止sql注入。
<?php
$idCantiere = isset($_POST['idCantiere']) ? $_POST['idCantiere'] : null;
$nomeCantiere = isset($_POST['nomeCantiere']) ? $_POST['nomeCantiere'] : null;
$sql = $mysqli->prepare("INSERT INTO Cantiere (idCantiere,nomeCantiere) VALUES(?.?)");
$sql->bind_param("is",$idCantiere,$nomeCantiere);
if($sql->execute()){
//success message
}else{
//return error
}
?>
预处理语句是一种用于高效重复执行相同(或相似)SQL语句的功能。
准备好的语句基本上是这样的:
准备:创建一个SQL语句模板并将其发送到数据库。某些未指定的值称为参数(标记为“?”)。示例:INSERT INTO MyGuests VALUES(?,?,?) 数据库对SQL语句模板进行解析,编译和查询优化,并在不执行结果的情况下存储结果 执行:稍后,应用程序将值绑定到参数,然后数据库执行该语句。应用程序可以使用不同的值多次执行该语句 与直接执行SQL语句相比,准备好的语句具有三个主要优点:
Prepared语句减少了解析时间,因为对查询的准备仅执行一次(尽管该语句执行了多次) 绑定参数可最大限度地减少服务器的带宽,因为您需要每次仅发送参数,而不发送整个查询 对于SQL注入,准备好的语句非常有用,因为以后使用不同协议传输的参数值不需要正确地转义。如果原始语句模板不是从外部输入派生的,则不会发生SQL注入。
答案 1 :(得分:0)
您必须将连接变量作为第一个参数传递 例如:
$con=mysqli_connect("localhost","my_user","my_password","my_db");
$age = mysqli_real_escape_string($con, $_POST['age']);
结帐文档以获取更多详细信息。 http://php.net/manual/en/mysqli.real-escape-string.php
答案 2 :(得分:0)
您缺少函数中的一个参数
mysqli_real_escape_string($con,$sql);
答案 3 :(得分:0)
您可以尝试用php替换报价
$nomeCantiere = $_POST["nomeCantiere"];
str_replace("'", "''", $nomeCantiere );
如果您插入2个引号('')而不是一个mysql,那么该值将仅用1个引号放在表中
答案 4 :(得分:0)
您将参数传递给mysqli_real_escape_string()函数是错误的 在插入帖子之前,必须放置用于访问数据库的连接字符串
$connection=mysqli_connect("localhost","USER","PASSWORD","DB");
$nomeCantiere= mysqli_real_escape_string($connection, $_POST['nomeCantiere']);
您的第二次尝试是错误的,在发布过程中会在第一个..中重用我的代码行