将查询结果数组保存在 php 中

keep a queries result array in storage in php

我正在进行查询,我正在从数据库 table 中检索所有行,其中某个列 = 'xx'.

然后我需要存储从结果中检索到的数组。

然后我需要从数据库中删除所有这些行,但我仍然需要在执行删除后访问存储的数组。这听起来可能有点奇怪,但这是我需要做的。

到目前为止:

$Get_Appointments = "SELECT *
                FROM TempSchedule2 
                WHERE CreatedBy = 'xx'";

$stmt = mysqli_stmt_init($con);
mysqli_stmt_prepare($stmt, $Get_Appointments);  
mysqli_stmt_execute($stmt);
if ($Apts = mysqli_stmt_get_result($stmt)){
    $numRows = mysqli_num_rows($Apts);
    echo 'numrows is '.$numRows.'<br>';
    global $arrayToSave;
    $arrayToSave = mysqli_fetch_array($Apts);
    while($row=mysqli_fetch_array($Apts)){
        //echo 'in the while?';
        $scheduleID = $row['scheduleID'];
        $DeleteApt_Query = "DELETE FROM tempschedule2 WHERE scheduleID = ?";
        $stmt = mysqli_stmt_init($con);
        mysqli_stmt_prepare($stmt, $DeleteApt_Query);   
        mysqli_stmt_bind_param($stmt, "i", $scheduleID);

        if (mysqli_stmt_execute($stmt)){
            //executed 
            echo 'deleted';

        }
        else {
            echo 'not deleted because '.mysqli_error($con);
            $ErrorForLog = date("Y-m-d") . "\r\n" . mysqli_error($con). "\r\nInfo Attempted to delete apt id : " . $scheduleID. "\r\n\r\n"; 
            error_log($ErrorForLog, 3, "Logs.txt");
        }

    }

    echo 'savedArray here is ';
    var_dump($arrayToSave);

发生的事情是由于某种原因没有删除一行。然后在执行删除查询的循环之后,我是 var_dumping 全局 $arrayToSave(我希望是整个数组),结果是数组中的一个元素没有被删除。所以似乎认为全局数组正在循环内被修改?这是我第一次不得不在 php 中使用 global,所以我可能没有正确使用它。

试试这个:

$arrayToSave = mysqli_fetch_array($Apts);更改为$arrayToSave = array();

然后在while循环开始后直接添加$arrayToSave[] = $row

您在循环之前获取一行,从而将其从结果中移除 $Apts:

$arrayToSave = mysqli_fetch_array($Apts);

所以 $arrayToSave 只包含一行并且该行没有循环。你想删除它并可能做这样的事情:

while($row=mysqli_fetch_array($Apts)){
    $arrayToSave[] = $row;

交替使用mysqli_fetch_all():

$arrayToSave = mysqli_fetch_all(($Apts);
foreach($arrayToSave as $row) {
    //do stuff
}

mysqli_fetch_array 抓取下一行并将其变成一个数组。它不会获取整个结果集并将其转换为数组。这就是您将其放在 while 语句中的原因。遍历所有行。所以循环并保存结果,然后 运行 之后删除。

$results = array();
while($row = mysqli_fetch_array($apts){
    $results[] = $row;
}
//Now Delete
$DeleteApt_Query = "DELETE FROM tempschedule2 WHERE scheduleID = ?";
$stmt = mysqli_stmt_init($con);
mysqli_stmt_prepare($stmt, $DeleteApt_Query);   
mysqli_stmt_bind_param($stmt, "i", $scheduleID);

if (mysqli_stmt_execute($stmt)){
    //executed 
    echo 'deleted';
 } else {
    echo 'not deleted because '.mysqli_error($con);
    $ErrorForLog = date("Y-m-d") . "\r\n" . mysqli_error($con). "\r\nInfo Attempted to delete apt id : " . $scheduleID. "\r\n\r\n"; 
    error_log($ErrorForLog, 3, "Logs.txt");
}

此外,您需要小心 运行在您仍在迭代前一个查询的结果时执行另一个查询。当您 运行 另一个查询时,第一个查询的数据会被清除。

global在这个地方没用,可以放心删除。

您所做的是将第一个检索到的行放入 $arrayToSave 并遍历其余行。您可能想要做的是在 while 循环开始后将所有 $row 放入一个二维数组中,其中包含类似 $arrayToSave[] = $row; 的内容。