Ошибка в скрипте обновления php/mysql

Я пытаюсь создать сценарий обновления, но где-то возникает ошибка, из-за которой цикл while никогда не заканчивается.

Что я пытаюсь сделать, так это установить поле базы данных с результатом кода обновления. Поэтому у меня есть 2 цикла while. Первый цикл должен пройти через все user_id, второй цикл while должен вычислить процент всех полей профиля, которые заполнил каждый пользователь.

Я предполагаю, что это логическая ошибка, потому что если я запускаю код обновления без первого цикла while, указав точный user_id, он работает нормально. Или может быть проблема в том, что некоторые user_id больше не существуют?

Пожалуйста, взгляните на код:

$count_userid = 1;

       while($count_userid < 10000)
        {  

    // profile percentage

              $resultpercentage = mysql_query("SELECT profilevalue_1, profilevalue_2, profilevalue_3 FROM table_profilevalues WHERE profilevalue_user_id = '$count_userid' LIMIT 1");

            while ($row = mysql_fetch_row($resultpercentage)) {
              $empty_count = 0;
              $count = count($row);
              for ($i = 0; $i < $count; $i++)
                if ($row[$i] === '' || $row[$i] === '-1' || $row[$i] === 'NULL')
                  $empty_count++;
              $profile_percent_user = ((int) (100 * (1 - $empty_count / ($count - 1))));


              // SAVE PROFILE PERCENTAGE
              $profile_percentage_query = "UPDATE table_users SET user_profilepercentage='$profile_percent_user' WHERE user_id='$count_userid' LIMIT 1";
              $database->database_query($profile_percentage_query);
            } 

          $count_userid++;
        }

Кто-нибудь видит здесь проблему?

С наилучшими пожеланиями


person Community    schedule 03.12.2012    source источник
comment
Просто просматриваю ваш код, но почему вы не можете сделать все это на SQL с помощью одного оператора UPDATE? Кроме того, для отладки добавьте в свой код несколько операторов эха, чтобы вы могли видеть, что происходит и где вы можете застрять. Вы уверены, что цикл не заканчивается, а просто занимает много времени?   -  person Brad    schedule 03.12.2012
comment
Здравствуйте, Брэд, как бы вы сделали это с помощью одного оператора SQL UPDATE? Есть ли в SQL функция цикла? И да, цикл while кажется бесконечным, я пробовал с ‹5, тогда веб-сайт недоступен, и нагрузка на сервер возрастает.   -  person    schedule 03.12.2012
comment
Я не верю, что есть необходимость в каком-либо цикле, не так ли? Можете ли вы описать, что вы пытаетесь сделать? Я читаю ваш код, и мне не ясно, чего вы пытаетесь достичь. Похоже, вы могли бы просто сделать UPDATE table_users SET user_profilepercentage=AVG(profilevalue_1, profilevalue_2, profilevalue_3) или что-то подобное.   -  person Brad    schedule 03.12.2012
comment
Во-первых, $resultpercentage будет содержать 1 значение из-за вашего LIMIT 1 в SQL-запросе, верно? Итак, что же представляет собой следующий цикл while? И следующее count всегда будет только 1, что сводит на нет цикл for, который следует за ним.   -  person rg88    schedule 03.12.2012
comment
@Brad Я хочу сделать так, чтобы в каждом цикле он переходил к user_id, проверял все заполненные поля профиля, вычислял процент и помещал этот процент в столбец моей таблицы пользователей. Ваш код UPDATE установит 0 для первого user_id, и он не будет зацикливаться, верно?   -  person    schedule 03.12.2012
comment
@Карлос, зачем это делать? UPDATE коснется всего, что разрешено пунктом WHERE. Если нет пункта WHERE, все будет обновлено. Попытайся.   -  person Brad    schedule 03.12.2012
comment
@ gaoshan88 Я установил LIMIT на 1, потому что в каждом цикле нужно просто выбрать 1 ресурс и обновить 1 ресурс для каждого зацикленного user_id. Это неправильно? Должен ли я удалить?   -  person    schedule 03.12.2012
comment
Циклы предназначены для перебора коллекций. Если у вас есть только 1 результат, вам не нужен цикл.   -  person rg88    schedule 03.12.2012
comment
@Brad Извините, вы правы, он проходит через все строки, но все равно устанавливает 0 в результате команды AVG. Может ли проблема заключаться в том, что у меня есть две разные таблицы, в одной из которых я подсчитываю поля профиля, а затем помещаю результат в таблицу разных пользователей?   -  person    schedule 03.12.2012
comment
@ gaoshan88 Вы были правы, проблема была в LIMIT 1, удалил его, теперь он работает! Если вы опубликуете это как ответ, я могу отметить его как правильный ответ. Благодарю вас!   -  person    schedule 03.12.2012


Ответы (1)


Во-первых, $resultpercentage будет содержать 1 значение из-за вашего «LIMIT 1» в SQL-запросе, верно? Итак, что же такое цикл while? И следующий счетчик всегда будет равен 1, что сводит на нет цикл for, который следует за ним.

Вкратце: удалите «LIMIT 1», чтобы вы могли перебирать весь результат.

person rg88    schedule 03.12.2012