【发布时间】:2019-09-22 04:04:28
【问题描述】:
我正在尝试插入一条记录并使用准备好的语句获取该记录的 ID。为此,我编写了一个查询"INSERT INTO ". $natureFlight ."(typeFlight, dateTimeSubmit, emb, acType, reg, companyName, callSign, dateFlight) VALUES (?,?,?,?,?,?,?,?); SELECT LAST_INSERT_ID();",它在 MySQL 控制台中运行良好,但在使用准备好的语句时无法运行。如果我从查询中删除SELECT LAST_INSERT_ID();,那么它可以使用准备好的语句插入记录。
我搜索解决方案,我找到了this,但对我不起作用。
这是代码
$natureFlight = $_POST['selectedNatureFlight'];
$typeFlight = $_POST['selectedTypeFlight'];
$dateTimeSubmit = $_POST['dateTime'];
$emb = $_POST['emb'];
$acType = $_POST['acType'];
$reg = $_POST['reg'];
$companyName = $_POST['companyName'];
$callSign = $_POST['callSign'];
$dateFlight = $_POST['dateFlight'];
$insertRecord = "INSERT INTO ". $natureFlight ."(`typeFlight`, `dateTimeSubmit`, `emb`, `acType`, `reg`, `companyName`, `callSign`, `dateFlight`) VALUES (?,?,?,?,?,?,?,?); SELECT LAST_INSERT_ID();";
$stmt = $conn->prepare($insertRecord);
$stmt->bind_param("ssssssss", $typeFlight, $dateTimeSubmit, $emb, $acType, $reg, $companyName, $callSign, $dateFlight);
if($stmt->execute()){
$stmt->bind_result($id);
while($stmt->fetch()) {
echo $id;
}
} else{
$res['error'] = true;
$res['message'] = $stmt->error;
}
运行后出现错误
Fatal error: Uncaught Error: Call to a member function bind_param() on bool in
D:\xampp\htdocs\test\proc\flightPDF\src\body\user\records.php:40 Stack trace: #0 {main} thrown in
D:\xampp\htdocs\test\proc\flightPDF\src\body\user\records.php on line 40
第 40 行包含 $stmt->bind_param("ssssssss", $typeFlight, $dateTimeSubmit, $emb, $acType, $reg, $companyName, $callSign, $dateFlight);
【问题讨论】:
-
如果你在 PHP 中插入记录,你可以在执行时使用 $conn->lastInsertId() 获取最后插入 id。不需要查询 last id 查询字符串。请在您的查询字符串中删除它。
-
@AuNguyen 好的,我会试试这个
-
使用 $conn->lastInsertId() 后,我收到错误
Fatal error: Uncaught Error: Call to undefined method mysqli::lastInsertId() -
不知道 MySQL 中 last insert id 的可靠性如何,但在其他数据库中存在 bug。我发现的最佳解决方案是按您插入的相同内容进行选择,按 id desc 排序。这不是万无一失的。您必须考虑在您的插入和选择之间可能会出现另一个具有相同信息的插入的机会......(是的,我不太担心)
-
请提供脚本代码来创建你的$conn。你是用mysqli还是PDO连接mysql? PDO:$conn->lastInsertId(),mysqli:$conn->insert_id
标签: php mysql prepared-statement