Я относительно новичок в 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 ().
Re ваши комментарии:
Ты можешь использовать 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);
Я также показываю использование журнал ошибок() который автоматически входит в ваш журнал ошибок http. Если есть ошибка, я звоню die()
поэтому код не пытается перейти к следующему шагу. В вашем скрипте вы можете структурировать его по-другому, например, использовать return
вместо этого, если есть другой код для запуска.
Или вы можете полностью принять исключения.
Других решений пока нет …