【问题标题】:How to use both SELECT and INSERT query on single php prepared statement?如何在单个 php 准备语句上同时使用 SELECT 和 INSERT 查询?
【发布时间】: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


【解决方案1】:

您不能准备多个语句。这就是为什么您的准备失败并且$stmt 是布尔值(假)的原因。要修复它,请从您的 INSERT 查询中删除 SELECT LAST_INSERT_ID() 并将代码更改为此,使用 insert_id 获取最后一个插入 ID:

$insertRecord = "INSERT INTO ". $natureFlight ."(`typeFlight`, `dateTimeSubmit`, `emb`, `acType`, `reg`, `companyName`, `callSign`, `dateFlight`) VALUES (?,?,?,?,?,?,?,?)";
$stmt = $conn->prepare($insertRecord);
$stmt->bind_param("ssssssss", $typeFlight, $dateTimeSubmit, $emb, $acType, $reg, $companyName, $callSign, $dateFlight);
if (!$stmt) {
    $res['error'] = true;
    $res['message'] = $conn->error;
}
elseif ($stmt->execute()) {
    echo $conn->insert_id;
} 
else {
    $res['error'] = true;
    $res['message'] = $stmt->error;
}

【讨论】:

    【解决方案2】:

    使用 lastInsertId 代替 SELECT 语句

    $last_id = $conn->lastInsertId;
    

    希望这会对你有所帮助..!!

    【讨论】:

    • 我收到错误Fatal error: Uncaught Error: Call to undefined method mysqli::lastInsertId()
    • @Meet_Soni 我正在使用 PHP 准备好的语句
    • @Nawaraj 如果您遇到这种错误,请使用 $last_id = mysqli_insert_id($conn);让我知道同样的事情。也许它有效。
    • 不阻塞执行也不捕获最后一个id
    • 删除这个 SELECT LAST_INSERT_ID() 并把这个 if($stmt->execute()){ echo $conn->insert_id; } 并检查相同。
    猜你喜欢
    • 2018-12-11
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2020-05-03
    • 2019-12-20
    相关资源
    最近更新 更多