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

How can I use mysqli to SELECT and both DELETE and RETURN a single row based on WHERE condition

提问人:Neal Barsch 提问时间:10/8/2020 最后编辑:Neal Barsch 更新时间:10/8/2020 访问量:171

问:

如何进行mysqli php查询,以便SELECT请求既返回该行又删除MySQL数据库中的同一行?

这个 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 删除该行但没有成功,Id 是表中每一行的唯一代码(也尝试使用 $result 和 $resultArray 而不是 $row):

$delsql= mysqli_query($conn,"DELETE FROM mysqltable WHERE Id= $row['Id']"); 
php mysql sql 选择 mysqli

评论

1赞 Dharman 10/8/2020
如果你只选择 1 行,为什么会有循环?
0赞 Neal Barsch 10/8/2020
简短的回答:我对 LIMIT>1 行使用相同的脚本,只是忘记在这里编辑代码
0赞 Dharman 10/8/2020
还有一句建议:尝试学习 PDO 而不是 mysqli。它会让你的生活更轻松。

答:

4赞 Dharman 10/8/2020 #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();

评论

3赞 Nick 10/8/2020
您可以通过存储 from 的值来在查询中保存子查询。您还应该注意 without 是没有意义的 - 因此您最终可能会删除与您选择的行不同的行......deletezipsizeselectLIMITORDER BY
1赞 Dharman 10/8/2020
@Nick这是我没有考虑过的好观点。我想那么 DELETE WHERE Id=?会更好。让我在答案中加上这一点
2赞 Nick 10/8/2020
假设有某种形式的列将是最佳解决方案。您需要一个表达式来处理多个删除。idWHERE IN
1赞 Neal Barsch 10/8/2020
如果它更容易,我可以添加一个数字 ID 列
0赞 Neal Barsch 10/8/2020
通过编辑,这是完美的。谢谢大家!!!:)我还修改了问题,将 Id 作为列包含在内,我将其添加为数字唯一标识符。