php - 如何在单个 php 准备语句上同时使用 SELECT 和 INSERT 查询?

标签 php mysql prepared-statement

我正在尝试插入一条记录并使用准备好的语句获取该记录的 ID。为此,我编写了一个查询 "INSERT INTO "。 $natureFlight ."(typeFlight, dateTimeSubmit, emb, acType, reg, companyName, callSign, dateFlight) VALUES (?,?,?,?,?,?,?,?); 选择 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);

最佳答案

您不能准备多个语句。这就是为什么您的准备失败并且 $stmt 是 bool 值 (false) 的原因。要修复它,请从您的 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;
}

关于php - 如何在单个 php 准备语句上同时使用 SELECT 和 INSERT 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58045938/

相关文章:

Mysql 连接和排序

php - 如何从 MySql 检索信息而忽略特殊字符?

javascript - 如何在 cookie JavaScript 中添加图片?

javascript - 使用 ajax 发送 rowID 并将选定的行附加到新表

php - 分页以显示最大值并限制其余值

python - 如何使用 Python 将带有引号和换行符的字符串插入到 sqlite 数据库中?

php - 从可能的 Y 中随机显示 X 个 div

c++ - SQLFetch() 失败,SQLState 24000(无效游标)

java.sql.SQLDataException : An attempt was made to get a data value of type 'BOOLEAN' from type 'DATE' 异常

php - 我们如何知道 PDO 正在逃避 SQL 注入(inject)?