php: зацикливание результатов от запроса MySQL до счетчика приращений (ассоциативный массив) - PullRequest
0 голосов
/ 22 сентября 2011

Я извлекаю данные из базы данных MySQL и создаю из нее отчеты. Мне нужно рассчитывать, когда выполняются определенные условия, и, поскольку запросы к БД довольно дороги (и у меня будет много трафика), я зацикливаюсь на результатах одного запроса, чтобы увеличить счетчик.

Кажется, что он работает (счетчик увеличивается), и результаты несколько близки, но счетчики неверны.

На данный момент в таблице 411 записей, но я получаю числа вроде 934 со счетчика ['total'] и 927 для ['males'], и это определенно не может быть правильным. Тем не менее, я получаю 4 от ['females'], что правильно ...

Я почти уверен, что это работало прошлой ночью, но сейчас это не так - я совершенно сбит с толку. (есть только 411 записей)

$surveydata = mysql_query("SELECT `age`,`e_part`,`gender` FROM $db_surveydata;") or die(mysql_error());
$rowcount = mysql_num_rows($surveydata);
$age=array('18+'=>0,'<18'=>0,'total'=>0);
$e_part=array('yes'=>0,'no'=>0,'total'=>0);
$genders=array('male'=>0,'female'=>0,'trans'=>0,'don\'t know'=>0,'total'=>0);

while ($responses = mysql_fetch_assoc($surveydata)) {
    foreach ($responses as $response){
        switch ($response){
            case $responses['age']:
                if ($responses['age'] > 18) {$age['18+']++;$age['total']++;}
                // i tried putting the ['total'] incrementer in the if/else
                // just in case, but same result
                else {$age['<18']++;$age['total']++;}
                break;
            case $responses['e_part']:
                if ($responses['e_part']) {$e_part['yes']++;}
                else {$e_part['no']++;}
                $e_part['total']++;
                break;
            case $responses['gender']:
                switch ($responses['gender']){
                    case 1:$genders['male']++;break;
                    case 2:$genders['female']++;break;
                    case 3:$genders['trans']++;break;
                    case 9:$genders['don\'t know']++;break;
                    default:break;
                }
                $genders['total']++;
                break;
            default:break;
        } // end switch
    } //end for
} // end while

спасибо!

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

mysql_fetch_assoc() извлекает одну строку из таблицы. Затем вы перебираете эту строку, обрабатывая каждое отдельное поле. Затем длинный набор if() проверяет, в каком поле вы находитесь. Вся эта структура может быть изменена на:

while($response = mysql_fetch_assoc($surveydata)) {
    if ($responses['age'] > 18) {
        $age['18+']++;
    } else {
        $age['<18']++;
    $age['total']++;}

    if ($responses['e_part']) {
        $e_part['yes']++;
    } else {
        $e_part['no']++;
    }
    $e_part['total']++;

    switch ($responses['gender']){
        case 1:$genders['male']++;break;
        case 2:$genders['female']++;break;
        case 3:$genders['trans']++;break;
        case 9:$genders['don\'t know']++;break;
        default:break;
    }
    $genders['total']++;
}
1 голос
/ 22 сентября 2011

это проблема:

foreach ($responses as $response){
        switch ($response){
            case $responses['age']:

switch $ response ищет совпадения

foreach ($responses as $k=>$v){
    switch ($k){
        case 'age':
            if ($v > 18) ....
0 голосов
/ 22 сентября 2011

Нет необходимости в switch ($response); Вы не можете действительно включить такой массив. И даже если бы вы могли, «значения», которые вы получаете, не имели бы никакого смысла - я думаю, что если это вообще сработает, то значение, которое вы включаете, будет либо «Массив», либо длиной массива. (Я забыл, как PHP обрабатывает массивы как скаляры.)

Тебе захочется что-то подобное ...

$total = 0;
while ($response = mysql_fetch_assoc($surveydata))
{
    if (isset($response['age']))
    {
        ++$age[($response['age'] < 18) ? '<18' : '18+'];
        ++$age['total'];
    }
    if (isset($response['e_part']))
    {
        ++$e_part[($responses['e_part']) ? 'yes' : 'no'];
        ++$e_part['total'];
    }
    if (isset($response['gender']))
    {
        switch ($response['gender'])
        {
             case 1: ++$genders['male']; break;
             case 2: ++$genders['female']; break;
             case 3: ++$genders['trans']; break;
             case 9: ++$genders["don't know"]; break;
        }
        ++$genders['total'];
    }
    ++$total;
}

Преимущество if (isset(...)) состоит в том, что если 'age', 'e_part' или 'пола' равно нулю, соответствующий код для подсчета не будет активирован. Он работает примерно так же, как и ваш код, за исключением смущающего цикла - и минус подсчета поля, даже если оно пустое, потому что в каждой строке будут одинаковые поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...