我正在尝试创建自己的注册表单,但我对准备好的语句有疑问。
这个想法是创建一个准备好的语句来将信息插入到用户表中,然后从生成的内容中获取 insert_id 以在另一个插入语句中使用
这是我的注册脚本的一个版本
<?php
$returnedId = '';
include "includes/dbconnect.php";
$stmt = $db->prepare("INSERT INTO `users`(`Username`, `Email`, `Password`) VALUES (?, ?, ?)");
$stmt->bind_param('sss', $_POST['username'], $_POST['email'], $_POST['password']);
$stmt->execute();
$returnedId = $stmt->insert_id;
$stmt->close();
echo $returnedId;
$allergystmt = $db->prepare("INSERT INTO 'user_allergy' ('user_id', 'allergy_id') VALUES (?, ?)");
$allergystmt->bind_param('ss', $returnedId, $_POST['check_list']);
$allergystmt->execute();
$allergystmt->close();
header('Location: index.php');
?>
第一个准备好的语句正确运行并将信息插入表中,之后 $returnId 变量成功回显。脚本中的下一个是我的第二个准备好的语句,当它尝试运行时,我收到错误消息:
Fatal error: Call to a member function bind_param() on a non-object in D:\filepath\register.php on line 17
看来我的变量没有被带入第二个准备好的语句中。
最佳答案
您的第二个查询存在语法错误,无法准备
。由于您没有对这样的数据库故障进行错误处理,因此您后面的代码只会出错:
$allergystmt = $db->prepare("INSERT INTO 'user_allergy' ('user_id', 'allergy_id') VALUES (?, ?)");
^--- ^--^--- ^-- etc...
您不能在表名和字段名上使用 '
引号。 '
表示字符串。这些字段/表名称都不是保留字,因此根本不需要引用它们:
$allergystmt = $db->prepare("INSERT INTO user_allergy (user_id, allergy_id) VALUES (?, ?)");
if (!$allergystmt) { die($dbh->errorInfo()); }
请注意添加了 errorInfo() 输出。永远不要假设数据库操作成功。始终假设失败,并将成功视为惊喜。
关于php - 准备好的 INSERT 语句以获取 insert_id 以在第二个准备好的 INSERT 语句中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21992632/