#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. Спасибо за четкий ответ. Я не знал обо всем этом, но это имеет смысл и теперь мне ясно.