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

0

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

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

Теги:

1 ответ

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

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

  • 0
    Я никогда не слышал об этом! Спасибо! Я пытался $ stmt-> data_seek (0); до моего второго пока stmt-> fetch и до сих пор не вижу оператора print внутри этого второго цикла.
  • 1
    Честно говоря, я никогда не использовал data_seek (). Я бы просто поместил строки результирующего набора в массив PHP, после чего вы можете получить доступ к любому, который захотите. MySQL на самом деле не поддерживает курсоры в любом случае, так что, если это работает вообще, MySQL потребует сохранения всех строк в памяти в любом случае.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню