После перемотки результатов запроса MySQL, не работает, чтобы повторно использовать запрос

Я относительно новичок в 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);

Но это все еще не позволяет мне повторно использовать этот запрос. Если у кого-то есть предложение о том, как перемотать работу или как обойти это, например, сохранить результаты запроса, чтобы я мог использовать их повторно, не выполняя повторно запрос, это тоже нормально.

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 вместо этого, если есть другой код для запуска.

Или вы можете полностью принять исключения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]