在回滚mysql查询结果后,无法重新使用查询

时间:2018-04-05 18:26:21

标签: php mysql rewind

我对mysql / php倒带比较新。我正在执行一个查询,在我标记当前数据集并重新编写它之后,我需要运行相同的集来运行需要很长时间的shell脚本。我将在几分钟内运行与cron相同的脚本,因此我可以标记另一个集合并知道我正在获取不同的数据集来运行慢速shell脚本。出于某种原因,倒带没有工作,所以它没有使用两次数据集:

if(!($stmt = $mysqli->prepare("SELECT  node, model FROM Table WHERE vendor = 'Calix' AND model in ('C7','E7') AND  ((update_status NOT in ('u') OR (update_time IS NULL) OR ((DATEDIFF(NOW(),SW_ver_update_time)>14)) )) LIMIT 100"))) //AND ping_reply IS NULL AND software_version IS NULL 
{
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

if(!$stmt->bind_result($ip, $model))
{
    echo "Binding results failed: (" . $stmt->errno . ") " . $stmt->error;
}

if(!$stmt->execute())
{
    $tempErr = "Error select node, model c7,e7 status: " . $stmt->error;
    printf($tempErr . "\n");    //show mysql execute error if exists  
    $err->logThis($tempErr);
}

$stmt1 = $mysqli1->prepare("UPDATE Table SET update_status = 'u' , update_time = UTC_TIMESTAMP() WHERE node = ?");

while($stmt->fetch()) {
    print "current ip: " . $ip . "\n";
    $stmt1->bind_param("s", $ip);
    $stmt1->execute(); //write time stamp and 'u' on ones 'in process of Updating'
}
//rewind db pointer
mysql_data_seek($stmt, 0);

//Circulate through 100 dslams fetched that we marked as in process.  
//This takes a long time to execuate and will be running this script concurrently in 5 minutes 
//so we need to know what we're working on so we don't fetch them again.
while($stmt->fetch()) {
  print "hello current ip: " . $ip . "\n";
  //will execute shell script here 
  //I never see hello print statement
}

我查看了mysql_data_seek,但我没有看到使用fetch()的示例。倒带后我不能使用fetch()吗?这里的问题是什么?谢谢!

*更新: 我试过了

$stmt->data_seek(0);

但它仍然没有让我重复使用该查询。如果有人建议如何回放工作,或者解决它的方法,比如存储查询结果以便我可以重新使用它们而不需要在以后重新运行查询,那也没问题。< / p>

1 个答案:

答案 0 :(得分:0)

您不能将mysql_data_seek()与mysqli函数一起使用。 MySQL的每个PHP扩展都是独立的,您不能使用一个扩展中的函数和来自另一个扩展的查询结果。

您想要使用mysqli扩展程序中的等效函数:mysqli_stmt::data_seek()

重新评论:

您可以使用get_result(),然后在结果上调用fetch_all()。这将返回一个行数组,其中每一行都是MySQL查询返回的列数组。

if(!($stmt = $mysqli->prepare("SELECT  node, model FROM Table WHERE vendor = 'Calix' AND model in ('C7','E7') AND  ((update_status NOT in ('u') OR (update_time IS NULL) OR ((DATEDIFF(NOW(),SW_ver_update_time)>14)) )) LIMIT 100"))) //AND ping_reply IS NULL AND software_version IS NULL 
{
    error_log("Prepare failed: ({$mysqli->errno}) {$mysqli->error}");
    die();
}

if(!$stmt->execute())
{
    error_log("Error select node, model c7,e7 status: {$stmt->error}");
    die();
}

if (!($result = $stmt->get_result()))
{
    error_log("Error get result of select node, model c7,e7: {$stmt->error}");
    die();
}

$rows = $result->fetch_all(MYSQLI_ASSOC);

我还会使用error_log()来自动记录到您的http错误日志。如果出现错误,请致电die(),以便代码不会尝试继续下一步。在您的脚本中,您可能会以不同的方式对其进行结构化,例如使用return,如果还有其他代码要运行。

否则你可以完全接受exceptions