如何根据 WHERE 条件使用 mysqli 进行 SELECT 和 DELETE 和 RETURN 单行

Posted

技术标签:

【中文标题】如何根据 WHERE 条件使用 mysqli 进行 SELECT 和 DELETE 和 RETURN 单行【英文标题】:How can I use mysqli to SELECT and both DELETE and RETURN a single row based on WHERE condition 【发布时间】:2021-01-22 22:47:11 【问题描述】:

如何执行 mysqli php 查询,以便 SELECT 请求既返回行又删除 MySQL DB 中的同一行?

这个 php 脚本可以很好地根据最大数字邮政编码(一个示例)查询和返回单行,但我的修改没有完成删除行:

<?php

echo phpversion();
// Create connection
$con = mysqli_connect("localhost", "mysqluser", "mysqlpass", "mysqldb");

// Check connection
if (mysqli_connect_errno()) 
    echo "Failed to connect to MySQL: " . mysqli_connect_error();


// Select all from designated assigned bot
$sql = "SELECT * FROM mysqltable WHERE zipsize=( SELECT max(zipsize) FROM mysqltable ) LIMIT 1;";

// Confirm there are results
if ($result = mysqli_query($con, $sql)) 
    // We have results, create an array to hold the results
    // and an array to hold the data
    $resultArray = array();
    $tempArray = array();
    // Loop through each result
    while ($row = $result->fetch_object()) 

        // Add each result into the results array
        $tempArray = $row;

        array_push($resultArray, $tempArray);
    

    // Encode the array to JSON and output the results
    echo json_encode($resultArray);


// Close connections
mysqli_close($con);
?>

我尝试在不同的地方添加这一行以使用 Id 删除行,但没有成功,这是表中每一行的唯一代码(也尝试使用 $result 和 $resultArray 而不是 $row):

$delsql= mysqli_query($conn,"DELETE FROM mysqltable WHERE Id= $row['Id']"); 

【问题讨论】:

为什么只选择1行会有循环? 简短回答:我对 LIMIT>1 行使用相同的脚本,我只是忘记在此处编辑代码 还有一点建议:尝试学习 PDO 而不是 mysqli。它会让你的生活更轻松。 【参考方案1】:

如果您想选择数据,然后立即删除所选数据,那么您需要运行两个单独的查询。我真的不知道为什么你有这么多不必要的代码,但我会这样做:

<?php

// Create connection
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$con = new mysqli("localhost", "mysqluser", "mysqlpass", "mysqldb");
$mysqli->set_charset('utf8mb4'); // always set the charset

// Select all from designated assigned bot
$sql = 'SELECT * FROM mysqltable WHERE zipsize=( SELECT max(zipsize) FROM mysqltable ) LIMIT 1';
$resultArray = $con->query($sql)->fetch_all(MYSQLI_ASSOC);
echo json_encode($resultArray);

// now delete
$sql = 'DELETE FROM mysqltable WHERE zipsize=( SELECT max(zipsize) FROM mysqltable ) LIMIT 1';
$resultArray = $con->query($sql);

如果您不需要嵌套数组并且只获取单行,那么您可以将 fetch_all(MYSQLI_ASSOC) 替换为 fetch_assoc()

小心!除非您指定ORDER BY,否则可能会选择与您删除的行不同的行,因此这些查询可能会产生意外结果。

如果您在表中有一个主键/唯一键来唯一标识您选择/删除的行,那么您可以存储 id 列表,然后执行 WHERE IN() 查询。

例如:

// Select all from designated assigned bot
$sql = 'SELECT * FROM mysqltable WHERE zipsize=( SELECT max(zipsize) FROM mysqltable )';
$resultArray = $con->query($sql)->fetch_all(MYSQLI_ASSOC);
echo json_encode($resultArray);

// get all ids from our array
$ids = array_column($resultArray, 'Id');

// now delete
$sql = 'DELETE FROM mysqltable WHERE Id IN('.str_repeat('?,', count($ids) - 1) . '?)';
$stmt = $con->prepare($sql);
$stmt->bind_param(str_repeat('s', count($ids)), ...$ids);
$stmt->execute();

【讨论】:

您可以通过存储来自selectzipsize 的值,在delete 查询中为自己保存一个子查询。您还应该注意,没有 ORDER BYLIMIT 是没有意义的 - 因此您最终可能会删除与您选择的行不同的行... @Nick 这是一个很好的观点,我没有考虑过。我想那是在哪里删除 ID=?会更好。让我将其添加到答案中 假设有某种形式的id 列将是最佳解决方案。您需要一个 WHERE IN 表达式来处理多次删除。 如果方便的话,我可以添加一个数字 ID 列 通过编辑,这是完美的。多谢你们!!!! :) 我还修改了问题,将 Id 作为我添加为数字唯一标识符的列。

以上是关于如何根据 WHERE 条件使用 mysqli 进行 SELECT 和 DELETE 和 RETURN 单行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mysqli 准备语句中使用多个内部连接和多个 WHERE 子句? [复制]

MySQLi WHERE LIKE 多个条件

shopnc where 多条件查询如何写,急,在钱等

根据 IF 条件更改 WHERE 条件中使用的列

使用 group by 和 like 语句时如何让 SQL 使用 where 条件

Cursor Select 语句 where 条件根据条件而变化