PHP: выборка записей MySQL по одной - PullRequest
1 голос
/ 29 апреля 2011

Я создал скрипт PHP, который создает логотипы из имен, которые поступают из базы данных MySQL с тысячами записей.

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

Как я могу выполнить итерацию по набору результатов, все еще получая самые последние данные при обработке следующей записи?

Вот что я сейчас использую:

        $sql = "SELECT * FROM names";
        $mysqli = new mysqli($server, $user, $password, $database);
        if ($mysqli->multi_query($sql)) {
          do {
            if ($result = $mysqli->store_result()) {
              while ($record = mysqli_fetch_assoc($result)) {
                $records[] = $record
              }
              $result->close();
            } 
          } while ($this->DB->next_result());
        }
        foreach($records as $record) {
          //create the logo from $record['name']
        }

Ответы [ 5 ]

4 голосов
/ 29 апреля 2011

Предполагая, что у вас есть уникальные идентификаторы для каждой записи в базе данных, и вы точно знаете, что этот сценарий может работать «навсегда», должно работать примерно так:

$result = mysql_query('SELECT `id` FROM `logos`');
$ids = array();

while($id = mysql_fetch_row($result)){
    $ids[] = $id[0];
}

// we now have all the ids stored in an array which we'll loop through.

foreach($ids as $id){
    $result = mysql_query('SELECT * FROM `logos` WHERE `id`=' . $id);
    $row = mysql_fetch_assoc();

    // process
}

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

Как уже говорили другие, вы не можете перебрать набор результатов, имея самые последние данные вв то же время.Это альтернатива.

1 голос
/ 29 апреля 2011

Я бы, вероятно, выбирал строки одну за другой, начиная с самого низкого идентификатора, а затем просто увеличивая этот идентификатор на единицу, пока не достиг бы максимального идентификатора.Если нет записи с таким идентификатором, просто перейдите к следующей.

0 голосов
/ 29 апреля 2011

Вы можете пойти на компромисс, скажем, 30 строк за раз. Вы можете реализовать какой-то механизм, который добавляет любые обновленные строки в список повторов.

Edit:

Как часто таблица обновляется? Изменение половины набора результатов отличается от изменения 30-го уровня. Это разовая операция? Если это делается часто, то вы будете снова и снова просматривать весь набор результатов в поисках изменений. Кроме того, что произойдет, если вы зайдете в строку 987, создадите логотип, а когда вы перейдете в строку 1032, кто-то изменит строку 987?

Если активность обновления минимальна, я бы попытался получить весь набор результатов, создать событие триггера обновления для регистрации изменений, выполнить все логотипы, а затем вернуться назад и обновить логотипы на основе ведения журнала. (Это может быть излишним.)

0 голосов
/ 29 апреля 2011

Так что же происходит, когда данные были преобразованы в изображение? Строка данных остается в таблице?

это не имеет значения, вы можете просто добавить LIMIT 1 в конец вашего SELECT, и вы получите первую запись, соответствующую вашему запросу.

0 голосов
/ 29 апреля 2011

Вы не можете. Вам нужно будет вручную шагать по строкам по одному за раз, каждый раз запрашивая одну строку. Когда вы отправляете запрос SELECT, MySQL буферизует результаты. Поэтому при изменении данных между выполнением запроса и извлечением строк вы получаете старые буферизованные данные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...