gpt4 book ai didi

php - 如果发生错误,让 PHP 多查询继续

转载 作者:可可西里 更新时间:2023-11-01 13:32:25 25 4
gpt4 key购买 nike

我得到了这个代码:

// Some starting variables
$test = new mysqli("localhost","root","","testdatabase");
$Query = array();
$Query[] = "SELECT 'wos' FROM items WHERE itemID = 3";
$Query[] = "SELECT 'wos' FROM items WHERE itemID";
$Query[] = "SELECT 'wos' FROM items WHERE itemID = 5";
$Query = implode(";",$Query);
$Errors = array();

// Execute multi query

if ($test->multi_query($Query)) {
do {
// fetch results
$Result = $test->store_result();
print_r($Result);
if($test->errno === 0) {
echo $Result->num_rows . "<br>";
}
else {
$Errors[] = $test->error;
}
$Result->close();

if (!$test->more_results()) {
break;
}
if (!$test->next_result()) {
$Errors[] = $test->error;
break;
}
} while (true);
}

如您所见,我有许多 X 个后续查询,并且想要执行所有这些查询。因此,如果查询 2 失败,我想继续多查询以让以下查询运行。我该怎么做?

此外,如果发生错误,我想将此错误保存在 $Errors 中。但是,目前它并没有完全按预期工作,因为我只能保存错误消息而不能保存相应的查询。如果没有失败的查询,只有错误消息并没有真正的帮助。所以我想要类似这样的内容:"Query 3 failed ('SELECT ...'): 'ERROR MESSAGE'"

这怎么可能?我可以使用 $test->error 获取循环中的当前错误,但我没有类似 $test->currentsubsequentquery 的东西。我该怎么做?

最佳答案

这里的问题可以称为 MySQL 协议(protocol)中的限制。当使用多查询时(从 MySQL 的角度来看:将多语句选项设置为 On 然后发送查询)服务器将拆分它并一个接一个地执行它们。答案将在不引用来源的情况下发送。客户端(在本例中为 PHP/mysqli)可以找出错误与哪个实际语句相关的唯一方法是解析完整的查询字符串并尝试进行一些映射。但这在很多情况下都行不通 - 一些语句,尤其是 CALL,可以返回多个无法映射到语句的结果集。

如果您想了解有关错误的更多信息,有两种选择:

丑陋的是做 $Query = implode(";\n\n",$Query); 然后解析提供的行的错误消息并匹配它们。

或者根本不使用 multi_query。 multi_query 用于处理返回多个结果集的存储过程调用。在上述情况下使用 multi_query 只会为您节省一点点延迟,因为服务器可以直接处理下一个查询而无需等待下一个查询命令,但即使这样也可以通过使用 mysqlnd 的异步查询操作来实现。

关于php - 如果发生错误,让 PHP 多查询继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14257663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com