[英]PHP: PDO MySQL error
我真的不知道 MySQL,但我尝试。
我在 PHP 中有这个脚本
$sql = $DB->prepare("INSERT INTO `users`(`id`, `firstname`, `lastname`, `email`, `password`) VALUES ($this->firstname, $this->lastname, $this->email, $this->password))");
当我使用
print_r($sql->errorInfo());
它给了我这个错误
警告:PDOStatement::execute(): SQLSTATE[HY093]: 无效的参数号:没有参数被绑定在 C:\\Bitnami\\wampstack-5.5.27-0\\apache2\\htdocs\\OOPLogin\\register.php on line 115 Array ( [0] => HY093 [1] => [2] => )
如果有人能帮助我,我将不胜感激。
谢谢你。
编辑:我把它改成
$sql = $DB->prepare("INSERT INTO `users`(`firstname`, `lastname`, `email`, `password`) VALUES ($this->firstname, $this->lastname, $this->email, $this->password))");
现在它给了我
Array ( [0] => 42000 [1] => 1064 [2] => 您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,以获取在 '@gmail.com 附近使用的正确语法, ff0b80f26259f9c0178aeed5198bac48))' 在第 1 行)
假设您使用 PDO,您需要使用准备好的语句绑定参数。
这是一个示例,使用PDO::prepare
文档作为参考:
$statement = $DB->prepare("INSERT INTO `table` (`id`) VALUES (?)");
$statement->execute(array($user_id));
使用mysqli
作为替代的其他示例...
$statement = $DB->prepare("INSERT INTO `table` (`id`) VALUES (?)");
$statement->bind_param("i", $user_id);
$statement->execute();
您需要绑定每个参数,而不是将它们内联准备好的语句。
您滥用了prepare()
函数。 使用准备好的语句时,您应该使用?
或:name
作为您的值的占位符。 这可以防止您从用户输入构建恶意 SQL 查询。
此外,您列出了 5 个字段,但只给出了 4 个值。 如果id
是一个AUTO_INCREMENT
字段,那么它可以从查询中省略。
最后,您的查询中有太多)
,
$sql = $DB->prepare("INSERT INTO `users`(`firstname`, `lastname`, `email`, `password`)
VALUES (:firstname, :lastname, :email, :password)");
现在您只需将一组值传递给execute()
以绑定到占位符。
$sql->execute(array(
'firstname' => $this->firstname,
'lastname' => $this->lastname,
'email' => $this->email,
'password' => $this->password
));
PS 您的原始代码不起作用,因为您忘记在字符串周围加上引号。
INSERT INTO `users` (`email`) VALUE ('test@example.com');
您的 ID-column 没有相应的值可以插入,如果该列是 auto-incrementint,您可以跳过它,如下所示:
$sql = $DB->prepare("INSERT INTO `users`(`firstname`, `lastname`, `email`, `password`) VALUES ($this->firstname, $this->lastname, $this->email, $this->password))");
您需要插入的值与列数一样多
插入查询需要在表字段和值中以相同的顺序具有相同的参数。
所以,如果你有id
, firstname
, lastname
, email
, password
你需要有idValue
, firstnameValue
, lastnameValue
, emailValue
, passwordValue
尝试查询是否格式良好的一个好方法是执行echo $sql
或var_dump($sql)
并将结果粘贴到诸如 Mysql Workbench 或 HeidiSql 之类的 sql ID 查询上
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.