Я относительно новичок в перемотке mysql/php. Я выполняю запрос, и после того, как я пометить текущий набор данных и перезапустить его, мне нужно запустить тот же набор, чтобы запускать сценарии оболочки, которые занимают очень много времени. Я запустил один и тот же скрипт как cron за несколько минут, поэтому я могу отметить другой набор и знаю, что я собираю другой набор данных для запуска медленных сценариев оболочки. По какой-то причине перемотка не работает, поэтому она не использует набор данных дважды:
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);
Но это все еще не позволяет мне повторно использовать этот запрос. Если у кого-то есть предложение о том, как получить перемотку для работы или способ обойти ее, например, сохранить результаты запроса, чтобы я мог повторно использовать их, не перезапуская запрос позже, и это тоже нормально.
Вы не можете использовать mysql_data_seek()
с функциями mysqli. Каждое расширение PHP для MySQL является отдельным, и вы не можете использовать функции из одного расширения с результатами запроса от другого расширения.
Вы хотите использовать эквивалентную функцию в расширении 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
, если есть другой код для запуска.
Или вы можете полностью принять исключения.