【问题标题】:prepared INSERT statement to get insert_id to use in a second prepared INSERT statement准备好的 INSERT 语句以获取 insert_id 以在第二个准备好的 INSERT 语句中使用
【发布时间】: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


【解决方案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() 输出。永远不要假设数据库操作是成功的。始终假设失败,并将成功视为惊喜。

【讨论】:

  • 引号成功了,为愚蠢的错误道歉,这是我近 2 年来第一次看 PHP!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多