所以这只是我的代码的一部分,但唯一相关的东西:
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在评论中指出的那样,您显示的代码在MySQLi
和PDO
之间混淆了。
有很多不同之处,你基本上是在试着把一个六边形塞进一个七边形的洞里。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
。
您需要阅读MySQLi
和PDO
的一般语法差异,特别是bind_param
上的第一个参数的含义。
要在脚本中使用PDO
,您可以将类设置为:
$connect = new PDO(...$details...);
我将限定,如果你可以使用MySQLi这做不保证你也可以运行PDO。它们是不同的。你可以阅读更多关于正确的PDO设置在你的脚本在这里。