mysqli 仅在后续调用同一函数时出错 - 'there is no next result set.'
mysqli error only on subsequent calls to same function - 'there is no next result set.'
我正在迭代 csv 文件的行。
在第 1 行,我调用了存储过程 (import_extended_data_sp),它成功了。
在第 2 行,调用失败并显示:
Strict Standards mysqli::next_result(): There is no next result set.
但是,调用与第一个调用完全相同,我很难理解为什么?
我现在已将测试值硬编码为参数,并检查 Sproc 是否没有问题两次给出相同的值。
第二次调用还是失败!?
我想知道 mysqli 是否有一些细微差别,我需要在进行第二次调用之前清除或重置某些内容?
<?php include("cnn.php");?>
<?php include("fn_db.php");?>
# ... get csv file (skipped for brevity) #
while($row = fgetcsv($file_data))
{
$line = array_combine($head, $row);
# This call works on every loop - no issues
$id = placemark_to_db($mysqli,$v_header,$line['id_placemark'],$line['name'],$line['swim_type'],$line['latitude'],$line['longitude'],$line['description']);
# This next line only succeeds on first call, but fails on next while loop
$x = xtended_to_db($mysqli,'99','[{"xtra":"oo"}]');
}
** fn_db.php >> xtended_to_db**
function xtended_to_db($cn,$id,$jsonarray){
# procedure returns a rowcount in output parameter
$cn->multi_query( "CALL import_extended_data_sp($id,'$jsonarray',@out);select @out as _out");
$cn->next_result();
$rs=$cn->store_result();
$ret = $rs->fetch_object()->_out;
$rs->free();
return $ret;
}
cnn.php
<?php
$mysqli = new mysqli("xxx.xxx.xxx.xxx","mydb","pass","user");
// Check connection
if ($mysqli -> connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
exit();
}
?>
修复此错误的最佳方法是完全避免 multi_query()
。虽然这听起来像是一个合理的存储过程用例,但事实是这个函数几乎没有用,而且非常危险。您可以使用准备好的语句的正常方式获得相同的结果。
function xtended_to_db(mysqli $cn, $id, $jsonarray) {
$stmt = $cn->prepare('CALL import_extended_data_sp(?,?,@out)');
$stmt->bind_param('ss', $id, $jsonarray);
$stmt->execute();
$stmt = $cn->prepare('select @out as _out');
$stmt->execute();
$rs = $stmt->get_result();
return $rs->fetch_object()->_out;
}
如果您固执己见并想继续使用 multi_query()
,那么您需要更加小心获取结果的方式。这个功能是极难得到正确的。我不会向您展示如何修复 multi_query()
,因为我认为变量输入太危险了。
最后一点,您真的应该考虑摆脱存储过程。它们很麻烦,几乎没有任何好处。肯定有比从 PHP 调用存储过程更好的方法来实现你想要的,但是在没有看到它的内容的情况下我不能给你更好的建议。
我正在迭代 csv 文件的行。
在第 1 行,我调用了存储过程 (import_extended_data_sp),它成功了。
在第 2 行,调用失败并显示:
Strict Standards mysqli::next_result(): There is no next result set.
但是,调用与第一个调用完全相同,我很难理解为什么?
我现在已将测试值硬编码为参数,并检查 Sproc 是否没有问题两次给出相同的值。
第二次调用还是失败!?
我想知道 mysqli 是否有一些细微差别,我需要在进行第二次调用之前清除或重置某些内容?
<?php include("cnn.php");?>
<?php include("fn_db.php");?>
# ... get csv file (skipped for brevity) #
while($row = fgetcsv($file_data))
{
$line = array_combine($head, $row);
# This call works on every loop - no issues
$id = placemark_to_db($mysqli,$v_header,$line['id_placemark'],$line['name'],$line['swim_type'],$line['latitude'],$line['longitude'],$line['description']);
# This next line only succeeds on first call, but fails on next while loop
$x = xtended_to_db($mysqli,'99','[{"xtra":"oo"}]');
}
** fn_db.php >> xtended_to_db**
function xtended_to_db($cn,$id,$jsonarray){
# procedure returns a rowcount in output parameter
$cn->multi_query( "CALL import_extended_data_sp($id,'$jsonarray',@out);select @out as _out");
$cn->next_result();
$rs=$cn->store_result();
$ret = $rs->fetch_object()->_out;
$rs->free();
return $ret;
}
cnn.php
<?php
$mysqli = new mysqli("xxx.xxx.xxx.xxx","mydb","pass","user");
// Check connection
if ($mysqli -> connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
exit();
}
?>
修复此错误的最佳方法是完全避免 multi_query()
。虽然这听起来像是一个合理的存储过程用例,但事实是这个函数几乎没有用,而且非常危险。您可以使用准备好的语句的正常方式获得相同的结果。
function xtended_to_db(mysqli $cn, $id, $jsonarray) {
$stmt = $cn->prepare('CALL import_extended_data_sp(?,?,@out)');
$stmt->bind_param('ss', $id, $jsonarray);
$stmt->execute();
$stmt = $cn->prepare('select @out as _out');
$stmt->execute();
$rs = $stmt->get_result();
return $rs->fetch_object()->_out;
}
如果您固执己见并想继续使用 multi_query()
,那么您需要更加小心获取结果的方式。这个功能是极难得到正确的。我不会向您展示如何修复 multi_query()
,因为我认为变量输入太危险了。
最后一点,您真的应该考虑摆脱存储过程。它们很麻烦,几乎没有任何好处。肯定有比从 PHP 调用存储过程更好的方法来实现你想要的,但是在没有看到它的内容的情况下我不能给你更好的建议。