将查询结果数组保存在 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;
的内容。
我正在进行查询,我正在从数据库 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;
的内容。