PHP试图简化涉及行集的重复脚本

PHP试图简化涉及行集的重复脚本,php,mysql,pdo,Php,Mysql,Pdo,我试图简化我在PHP中所做的重复脚本。我已经研究了一些循环选项,但由于它涉及从MySQL存储过程返回的行集,因此无法正常运行。我用同样的脚本大约15次来返回所有数据。最终,我希望将json_编码数组传递回调用它的ajax。当我尝试将其放入循环时,得到的结果是一个500错误或一个构造糟糕的数组 $stmt->execute(); $values = array(); $stmt->execute(); $values = array();

我试图简化我在PHP中所做的重复脚本。我已经研究了一些循环选项,但由于它涉及从MySQL存储过程返回的行集,因此无法正常运行。我用同样的脚本大约15次来返回所有数据。最终,我希望将json_编码数组传递回调用它的ajax。当我尝试将其放入循环时,得到的结果是一个500错误或一个构造糟糕的数组

    $stmt->execute();
    $values = array();
    
    $stmt->execute();
    $values = array();
    $rowCount = $stmt->rowCount();
    
    if ($rowCount > 0) {
       $row = $stmt->fetchAll(PDO::FETCH_NUM);
       
       $values = array();
       
       foreach ($row as $rowvalue) {
           $values[] = array($rowvalue[0], $rowvalue[1], $rowvalue[2], $rowvalue[3], $rowvalue[4], $rowvalue[5]);
       }
       
       $stmt -> nextRowset();
       $row = $stmt->fetchAll();
       
       foreach ($row as $rowvalue) {
           $values[] = array($rowvalue[0], $rowvalue[1], $rowvalue[2], $rowvalue[3], $rowvalue[4], $rowvalue[5]);
       }
       
       $stmt -> nextRowset();
       $row = $stmt->fetchAll();
       
       foreach ($row as $rowvalue) {
           $values[] = array($rowvalue[0], $rowvalue[1], $rowvalue[2], $rowvalue[3], $rowvalue[4], $rowvalue[5]);
       }
       ...
       echo json_encode($values);
    }      
已更新以使用以下代码示例:

    $sql = 'CALL fo_SELECT_Operations_Detail(?,?,?)';
    $facility = $_POST['facility'];
    $startweek = $_POST['startweek'];
    $endweek = $_POST['endweek'];
    
    $sql->bindParam(1, $facility, PDO::PARAM_STR);
    $sql->bindParam(2, $startweek, PDO::PARAM_STR);
    $sql->bindParam(3, $endweek, PDO::PARAM_STR);
    $stmt = $conn->query($sql);
    
    $values = array();
    
    do {
        $rows = $stmt->fetchAll(PDO::FETCH_NUM);
        foreach ($rows as $r) {
           $values[] = array($r[0], $r[1], $r[2], $r[3], $r[4], $r[5]);
       }
    
    } while ($stmt->nextRowset());
    
    // all processed so now send JSON
    echo json_encode($values);

我们都忘记了,创建行集的SP也会创建一个恼人的空行集,它必须下一个被删除,但实际上并没有被卸载。
&&$stmt->columnCount()
负责调用
nextRowset()
,但实际上并不试图以任何方式处理它

$sql = 'CALL fo_SELECT_Operations_Detail(?,?,?)';
$stmt->prepare($sql);
    
$stmt->bindParam(1, $_POST['facility'], PDO::PARAM_STR);
$stmt->bindParam(2, $_POST['startweek'], PDO::PARAM_STR);
$stmt->bindParam(3, $_POST['endweek'], PDO::PARAM_STR);

$stmt = $conn->execute();

$values = array();

do {
    $rows = $stmt->fetchAll(PDO::FETCH_NUM);
    foreach ($rows as $r) {
       $values[] = [$r[0], $r[1], $r[2], $r[3], $r[4], $r[5]];
   }

} while ($stmt->nextRowset()  && $stmt->columnCount());

// all processed so now send JSON
echo json_encode($values);

是的,它确实工作得很好,直到您尝试将其放入json_编码并传回ajax,然后它就失败了。好吧,那么如果错误日志中或500错误行附近有任何消息,存储过程就会按预期工作。它返回结果,我可以单独移动到每一行集合,而不会出现问题。只是当它被放入一个循环时,它就崩溃了。对不起,我想说的是我发布的原始脚本。然而,为了成功地获得所有结果,我必须调用一个行集,遍历它,退出该部分,调用下一个行集,遍历它,等等。这意味着我将重复代码15次以上。当我打同样的电话,但使用你的例子,它没有执行。不过,存储过程正在正确返回。现在正在处理错误代码,不幸的是在cpanel中编辑,无法轻松访问ini文件,因此试图找出如何回显错误。应该有一个PHP错误日志,有时它与Apache错误日志合并。谢谢,这会导致500个错误。我更新了上面的示例以合并您的示例。