mysqli_real_escape_string不插入数据库

时间:2019-03-04 10:58:42

标签: php html mysql database

我提出以下问题...我必须确保以下查询也接受带有引号..的值 我尝试使用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);
        }

我该如何解决问题?

5 个答案:

答案 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']); 

您的第二次尝试是错误的,在发布过程中会在第一个..中重用我的代码行