Потеря данных с помощью mysqli_data_seek

#php #mysqli

#php #mysqli

Вопрос:

Я запускаю запрос и перебираю его, изменяя одно из полей с помощью приведенного ниже кода. Мне нужен измененный номер только на короткое время, и он не нужен для возврата в базу данных. Это работает правильно, и с помощью echos выводятся ожидаемые значения.

 while ($d1 = mysqli_fetch_array($d1_query))
{
    echo "Before: " . $d1['d1_name'] . ": " . $d1['d1_earn_rate'] . "<br>";

    if ( $e1['e_id'] == $h1['e_id'] )
        $d1['d1_earn_rate'] =  $d1['d1_earn_rate'] * 1.2;

    echo "After: " . $d1['d1_name'] . ": " . $d1['d1_earn_rate'] . "<br><br>";
}
  

После этого я хочу вычислить общее количество подмножеств результатов. Я использую mysqli_data_seek для сброса счетчика в первую строку, чтобы я мог перебирать его. Однако, когда я это делаю, он вычисляет общее количество на основе исходных чисел в запросе, а не исправленных.

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

 mysqli_data_seek($d1_query,0);
$counter = 0;
while ($counter < 15)
{
    $counter  ;
    $d1 = mysqli_fetch_array($d1_query);
    echo $d1['d1_name'] . ": " . $d1['d1_earn_rate'] . "<br>";
    $total_earn_rate  = $d1['d1_earn_rate'];
}
  

Комментарии:

1. не используйте эту функцию. Вместо этого изучайте массивы.

2. Присвоение $d1 не изменяет результаты запроса, оно просто изменяет переменную с копией строки.

3. Вы присваиваете $d1 , изменяете $d1 , затем присваиваете $d1 снова. Почему вы ожидаете, что все это изменит данные, возвращаемые mysqli_fetch_array ?!

4. Итак, если я правильно понимаю, mysqli_data_seek не перемещает счетчик обратно в строку 0. Это фактически перемещает указатель на исходный $d1[0] . Когда я вносил изменения, я делал это для этого конкретного экземпляра переменной field, которая исчезла, как только я перешел дальше. Что-то связанное с указателями и памятью, если я помню свои старые классы C.

5. @Здравый смысл — Вы, кажется, следуете всем моим вопросам. Я нашел ваш комментарий слишком широким и менее полезным. Более правильный (и вежливый) ответ был бы. «Эта функция не подходит для использования в данном случае. Предпочтительнее использовать массивы «. «не использовать эту функцию» коротко, грубо и не дает никаких объяснений, ПОЧЕМУ я не должен ее использовать. «Вместо этого изучайте массивы», хотя я могу сделать вывод, что это причина отказа от использования функции, это также подразумевает, что я не знаю массивов, что является предположительным и грубым. Это пример конструктивного ответа.

Ответ №1:

Похоже, вы слишком глубоко здесь размышляете. Вопрос довольно прост:

  • сервер MySQL хранит в своей памяти результирующий набор, результат вашего предыдущего запроса
  • mysqli_fetch_array извлекает данные с сервера MySQL в память PHP и возвращает их
  • вы присваиваете эти извлеченные данные $d1
  • вы манипулируете $d1
  • вы сбрасываете внутренний указатель MySQL на результирующий набор и повторяете описанный выше процесс

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

Комментарии:

1. Спасибо за четкий ответ. Я не знал обо всем этом, но это имеет смысл и теперь мне ясно.