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 调用存储过程更好的方法来实现你想要的,但是在没有看到它的内容的情况下我不能给你更好的建议。