【发布时间】:2014-03-26 09:40:31
【问题描述】:
我正在尝试创建自己的注册表单,但我对准备好的语句有疑问。
这个想法是创建一个准备好的语句来将信息插入到用户表中,然后从生成的内容中获取 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 变量成功回显。脚本中的下一个是我的第二个准备好的语句,当它尝试运行时,我收到错误消息:
致命错误:在第 17 行对 D:\filepath\register.php 中的非对象调用成员函数 bind_param()
似乎我的变量没有被带到第二个准备好的语句中。
【问题讨论】:
-
您在第二个查询中使用
'而不是反引号 (`)。 -
您不需要像
$returnedId一样获取和重用该值。您可以在第二个INSERT查询中直接调用 MySQL 的LAST_INSERT_ID()。 -
@MichaelBerkowski:最好在 PHP 中捕获它。以防万一以后有其他插入。
-
@MarcB 我认为
header("Location:..)表示不会有,但当然是有效的点。
标签: php mysql mysqli prepared-statement insert-id