SQL注入:试图避免它,但得到一个错误


SQL Injection: trying to avoid it but got an error

所以这只是我的代码的一部分,但唯一相关的东西:

if ($check == 0) {     
                    $host = "localhost";
                    $user = "root";
                    $pass = "";
                    $db = "myfirstdb";
                    $connect = new mysqli($host,$user,$pass,$db);
                    if ($connect->connect_error){ 
                        die("Connection failed: " . $connect->connect_error);
                    } else {
                        echo "Connected successfully!";
                    }
                    //$sql = "INSERT INTO table1 (firstname , lastname , phone , email , date) VALUES (:fname, :lname, :phone, :email, :date)";
                    $secure = $db->prepare("INSERT INTO table1 (firstname , lastname , phone , email , date) VALUES (:fname, :lname, :phone, :email, :date)");
                    $secure->bindParam(':fname' , $firstname);
                    $secure->bindParam(':lname' , $lastname);
                    $secure->bindParam(':phone' , $phone);
                    $secure->bindParam(':email' , $email);
                    $secure->bindParam(':date' , $date);
                    $secure->execute();
                    /*if ($connect->query($sql) === TRUE) {
                        echo "New record created successfully";
                    } else {
                        echo "Error: " . $sql . "<br>" . $connect->error;
                    }*/
                    $connect->close(); 

我的问题是每当我执行代码错误弹出:

在C:'xampp'htdocs'example'Index.php:206中调用一个成员函数prepare()在字符串上的堆栈跟踪:#0 {main}在C:'xampp'htdocs'example'Index.php中抛出

我试图避免SQL注入使用这段代码,但我不确定我是否理解它。

您没有在正确的变量上准备语句。你需要做的是:

$connect->prepare("INSERT INTO table1 (firstname , lastname , phone , email , date) VALUES (:fname, :lname, :phone, :email, :date)");
编辑:

  $db = "myfirstdb";
  $connect = new mysqli($host,$user,$pass,$db);

你的对象是你设置为"新类"的变量,所以在这种情况下,你的对象是$connect,这是一个新的 mysqli类实例。您的原始脚本(导致错误)使用$db变量,这是一个字符串不是对象。

对象

只能使用->prepare(并使用->语法)。

除了使用yourillusiontoo的答案之外,正如Marc B在评论中指出的那样,您显示的代码在MySQLiPDO之间混淆了。

有很多不同之处,你基本上是在试着把一个六边形塞进一个七边形的洞里。mysql使用?作为占位符,而PDO使用脚本中的命名占位符。

例如你的代码是:
 $connect = new mysqli($host,$user,$pass,$db);

这意味着您正在使用mysqli DB处理程序,因此您需要用?替换:placeholder,然后按照它们出现在SQL字符串中的顺序设置变量,例如:

   $secure = $connect->prepare("INSERT INTO table1 
                    (firstname , lastname , phone , email , date)
                    VALUES (?, ?, ?, ?, ?)");
   $secure->bind_param('sssss' , 
                      $firstname, $lastname , $phone, $email ,$date);

所以第一个?是变量类型声明之后的第一个变量(sess sssss的集合),所以第一个?在这个实例中指的是$firstname?的数量和bind参数中给出的变量数量必须匹配。

注意MySQLi的类方法是->bind_param而不是->bindParam

您需要阅读MySQLiPDO的一般语法差异,特别是bind_param上的第一个参数的含义。

要在脚本中使用PDO,您可以将类设置为:

$connect = new PDO(...$details...);

我将限定,如果你可以使用MySQLi这做保证你也可以运行PDO。它们是不同的。你可以阅读更多关于正确的PDO设置在你的脚本在这里

相关文章: