准备好INSERT语句以使insert_id在第二个准备好的INSERT语句中使用

时间:2014-02-24 15:59:29

标签: php mysql mysqli prepared-statement insert-id

我正在尝试创建自己的注册表单,但我对准备好的语句有问题。

这个想法是创建一个准备好的语句来将信息插入到用户表中,然后从中获取生成的内容中的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()

似乎我的变量没有被带入第二个准备好的陈述中。

1 个答案:

答案 0 :(得分:1)

您的第二个查询存在语法错误,但未能prepare。由于您没有对此类数据库故障进行错误处理,因此您以后的代码只会出现错误:

$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()输出。永远不要假设数据库操作成功。总是假设失败,并将成功视为一个惊喜。