Почему вы не должны использовать mysql_fetch_assoc более 1 раза?

Некоторые люди говорят, что вы не должны использовать 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 предоставляет для этой цели. Это также минимизирует время блокировки таблицы.