Некоторые люди говорят, что вы не должны использовать mysql_fetch_assoc
более одного раза, почему?
например: я хочу отобразить две таблицы с пользователями, которые заплатили за членство, а другие – у пользователей, которые этого не сделали, поэтому вместо запроса базы данных 2 раза я запрашиваю его один раз и получаю переменную $result
с обоими типами пользователей, тогда я запускаю loop mysql_fetch_assoc
и посмотрите, если list['membership'] = 'paid'
затем echo …
Второй раз я цикл цикла mysql_fetch_assoc
и посмотреть, если list['membership'] = 'free'
тогда echo …
Что использует меньше ресурсов, учитывая, что я получил равное количество пользователей, которые зарегистрировались и не зарегистрированы.
Подумайте о том, что ваш результат запроса задан как колбаса, а mysql_fetch_assoc () – как нож, который разрезает кусок этой колбасы. Каждый раз, когда вы приносите строку, другой кусок колбасы обрезается, и это всегда НОВЫЙ кусок колбасы. Вы не можете пойти и отрезать ранее вырезанный кусок, потому что его уже съели.
Цитата Typer85 ( ссылка ):
Пожалуйста, имейте в виду, что результат ресурса, который вы передаете этой функции, можно считать переданным по ссылке, потому что ресурс – это просто указатель на ячейку памяти.
Из-за этого вы не можете дважды пропустить результат ресурса в том же скрипте, прежде чем возвращать указатель обратно в начальную позицию.
Например:
<?php // Assume We Already Queried Our Database. // Loop Through Result Set. while( $queryContent = mysql_fetch_row( $queryResult ) { // Display. echo $queryContent[ 0 ]; } // We looped through the resource result already so the // the pointer is no longer pointing at any rows. // If we decide to loop through the same resource result // again, the function will always return false because it // will assume there are no more rows. // So the following code, if executed after the previous code // segment will not work. while( $queryContent = mysql_fetch_row( $queryResult ) { // Display. echo $queryContent[ 0 ]; } // Because $queryContent is now equal to FALSE, the loop // will not be entered. ?>
Единственным решением для этого является сброс указателя, чтобы он снова указывал на первую строку перед вторым сегментом кода, поэтому теперь полный код будет выглядеть следующим образом:
<?php // Assume We Already Queried Our Database. // Loop Through Result Set. while( $queryContent = mysql_fetch_row( $queryResult ) { // Display. echo $queryContent[ 0 ]; } // Reset Our Pointer. mysql_data_seek( $queryResult ); // Loop Again. while( $queryContent = mysql_fetch_row( $queryResult ) { // Display. echo $queryContent[ 0 ]; } ?>
Конечно, вам нужно будет выполнить дополнительные проверки, чтобы убедиться, что количество строк в результате не равно
0
иначеmysql_data_seek
сам вернетfalse
и будетmysql_data_seek
ошибка.Также обратите внимание, что это относится ко всем функциям, которые
mysql_fetch_row
наборы результатов, включаяmysql_fetch_row
,mysql_fetch_assos
иmysql_fetch_array
.
Когда кто-то говорит, что вы не mysql_fetch_assoc()
дважды вызвать mysql_fetch_assoc()
, они означают против того же ресурса. Результат ресурса, который вы передаете в mysql_fetch_assoc()
, выполняется по ссылке. Вам нужно будет сбросить позицию указателя, прежде чем вы сможете mysql_fetch_assoc()
использовать mysql_fetch_assoc()
.
EDIT: И для этого попробуйте использовать mysql_data_seek()
.
Похоже, что вы хотите обработать результат запроса в виде массива (строк) массивов (полей). Но это не то, что предоставляет библиотека mysql. То, что я часто делаю, на самом деле скопирует строки в массив массивов (просто цикл на mysql_fetch до пустого), а затем сделайте то, что я хочу, с помощью собственного набора строк, используя функции массива, которые PHP предоставляет для этой цели. Это также минимизирует время блокировки таблицы.