2014-01-16 4 views
0

Я пытаюсь добавить знаки астрологии каждому пользователю в моей базе данных. У меня уже есть дни рождения, и у меня есть цикл while, который помещает необходимую мне информацию в массив, но я не могу заставить оператор foreach работать, чтобы я мог использовать каждое значение в массиве для вычисления того, что мне нужно, и вставьте новую информацию обратно в базу данных. Это то, что я до сих пор:использовать php foreach для обновления базы данных

while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) { 
    $update = array(
     'user' => $row['username'], 
     'day' => $row['bday'], 
     'month' => $row['bmon'] 
    ); 
} 
print_r($update); 

print_r ($ обновление) успешно печатает последнюю запись в базе данных, как это:

Array ([user] => johnsmith [day] => 30 [month] => 6) 

Я пытался как 100 различных вещей, но это не так работая для меня. Это то, что я пытаюсь сделать:

foreach($update) { 

    $astrology = ""; 
    if(($month==1 && $day>19)||($month==2 && $day<19)){ 
     $astrology = 'Aquarius'; 
    }else if(($month==2 && $day>18)||($month==3 && $day<21)){ 
     $astrology = 'Pisces'; 
    }else if(($month==3 && $day>20)||($month==4 && $day<20)){ 
     $astrology = 'Aries'; 
    }else if(($month==4 && $day>19)||($month==5 && $day<21)){ 
     $astrology = 'Taurus'; 
    }else if(($month==5 && $day>20)||($month==6 && $day<21)){ 
     $astrology = 'Gemini'; 
    }else if(($month==6 && $day>20)||($month==7 && $day<23)){ 
     $astrology = 'Cancer'; 
    }else if(($month==7 && $day>22)||($month==8 && $day<23)){ 
     $astrology = 'Leo'; 
    }else if(($month==8 && $day>22)||($month==9 && $day<23)){ 
     $astrology = 'Virgo'; 
    }else if(($month==9 && $day>22)||($month==10 && $day<23)){ 
     $astrology = 'Libra'; 
    }else if(($month==10 && $day>22)||($month==11 && $day<22)){ 
     $astrology = 'Scorpio'; 
    }else if(($month==11 && $day>21)||($month==12 && $day<22)){ 
     $astrology = 'Sagittarius'; 
    }else if(($month==12 && $day>21)||($month==1 && $day<20)){ 
     $astrology = 'Capricorn'; 
    } 

    $query = "UPDATE useroptions SET astrology='$astrology' WHERE username='$user'" ; 
    $db_conx->query($query); 
    } 
+1

Почему бы вам не добавить вычисляемое поле в базу данных? Вот для чего нужны взгляды (если это даже необходимо). – Blindy

+0

Что происходит? Выполняется ли этот код успешно? Есть ли ошибки? – klugerama

+0

@klugerama yes 'foreach ($ update) {' определенно работает. не говоря уже о пустых переменных и '$ update', 1-мерном массиве. – Peter

ответ

1

Попробуйте это,

while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {    
     $user = $row['username']; 
     $day = $row['bday']; 
     $month = $row['bmon']; 

       $astrology = ""; 
       if(($month==1 && $day>19)||($month==2 && $day<19)){ 
        $astrology = 'Aquarius'; 
       }else if(($month==2 && $day>18)||($month==3 && $day<21)){ 
        $astrology = 'Pisces'; 
       }else if(($month==3 && $day>20)||($month==4 && $day<20)){ 
        $astrology = 'Aries'; 
       }else if(($month==4 && $day>19)||($month==5 && $day<21)){ 
        $astrology = 'Taurus'; 
       }else if(($month==5 && $day>20)||($month==6 && $day<21)){ 
        $astrology = 'Gemini'; 
       }else if(($month==6 && $day>20)||($month==7 && $day<23)){ 
        $astrology = 'Cancer'; 
       }else if(($month==7 && $day>22)||($month==8 && $day<23)){ 
        $astrology = 'Leo'; 
       }else if(($month==8 && $day>22)||($month==9 && $day<23)){ 
        $astrology = 'Virgo'; 
       }else if(($month==9 && $day>22)||($month==10 && $day<23)){ 
        $astrology = 'Libra'; 
       }else if(($month==10 && $day>22)||($month==11 && $day<22)){ 
        $astrology = 'Scorpio'; 
       }else if(($month==11 && $day>21)||($month==12 && $day<22)){ 
        $astrology = 'Sagittarius'; 
       }else if(($month==12 && $day>21)||($month==1 && $day<20)){ 
        $astrology = 'Capricorn'; 
       } 

       $query = "UPDATE useroptions SET astrology='$astrology' WHERE username='$user'" ; 
       $db_conx->query($query); 
    } 
+0

Это работало только для первой записи в базе данных. – user2250471

+0

Он работает на основе числа строк в запросе из таблицы –

+0

Вы можете опубликовать свой запрос mysql, убедитесь, что ваш запрос возвращает более одной строки –

1

При обращении месяц и день, вам нужно сделать доступ к элементам массива, и вы не для этого нужен цикл. Я бы изменить код так:

$astrology = ""; 
$month = $update['month']; 
$day = $update['day']; 

if(($month==1 && $day>19)||($month==2 && $day<19)){ 
    $astrology = 'Aquarius'; 
}elsif(($month==2 && $day>18)||($month==3 && $day<21)){ 
    $astrology = 'Pisces'; 
}elsif(($month==3 && $day>20)||($month==4 && $day<20)){ 
    $astrology = 'Aries'; 
}elsif(($month==4 && $day>19)||($month==5 && $day<21)){ 
    $astrology = 'Taurus'; 
}elsif(($month==5 && $day>20)||($month==6 && $day<21)){ 
    $astrology = 'Gemini'; 
}elsif(($month==6 && $day>20)||($month==7 && $day<23)){ 
    $astrology = 'Cancer'; 
}elsif(($month==7 && $day>22)||($month==8 && $day<23)){ 
    $astrology = 'Leo'; 
}elsif(($month==8 && $day>22)||($month==9 && $day<23)){ 
    $astrology = 'Virgo'; 
}elsif(($month==9 && $day>22)||($month==10 && $day<23)){ 
    $astrology = 'Libra'; 
}elsif(($month==10 && $day>22)||($month==11 && $day<22)){ 
    $astrology = 'Scorpio'; 
}elsif(($month==11 && $day>21)||($month==12 && $day<22)){ 
    $astrology = 'Sagittarius'; 
}elsif(($month==12 && $day>21)||($month==1 && $day<20)){ 
    $astrology = 'Capricorn'; 
} 

$user = $update['user']; 

$query = "UPDATE useroptions SET astrology='$astrology' WHERE username='$user'" ; 
$db_conx->query($query); 
} 

Как и в сторону, более гибкий способ сделать это было бы использовать собственные форматы DATESTAMP в базе данных и даты/времени объекта в PHP, вместо того, обрабатывать месяц/день так, как вы.

+1

Почему downvote? – ernie

+0

То же, что и выше, и это только обновляет первую запись в базе данных. – user2250471

0

Не используйте foreach, просто делайте это во время цикла, как сказал Криш-Р, но не перезаписывайте $query для обновления.

Лучшим способом было бы использовать подготовленный оператор для обновления.

<?php 
// prepare the update statement 
if (!($stmt = $db_conx->prepare("UPDATE useroptions SET astrology = ? WHERE username = ?")) { 
    die('Error preparing statement.'); 
} 
// create vars and bind them 
$username = ''; 
$astrology = ''; 
if(!($stmt->bind_param('ss', $astrology, $username))) { 
    die('Error binding variables'); 
} 
// loop over table 
while($row...) { 
    $update = ...; 

    /*weird long ifelses to set $astrology*/ 

    $username = $update['user']; 

    // execute the statement for each row 
    if(!($stmt->execute()) { 
     error_log("Update failed for username:'{$username}' with astrology:'{$astrology}' due to " . mysql_error($db_conx)); 
    } 
} 
// close the prepared statement 
$stmt->close(); 

?> 

Самый быстрый способ, вероятно, будет использование функции MySQL, чтобы вычислить астрологию на лету, таким образом, вы можете обновить все данные с помощью одного простого запроса, как здесь: http://sqlfiddle.com/#!2/0c6fa/1

В основном его a

UPDATE users SET astrology = 
IF ((bmonth = 1 && bday > 19)||(bmonth = 2 && bday < 19), 
'Aquarius', 
IF ((bmonth = 2 && bday > 18)||(bmonth = 3 && bday < 21), 
'Pisces', 
IF ((bmonth = 3 && bday > 20)||(bmonth = 4 && bday < 20), 
'Aries', 
IF ((bmonth = 4 && bday > 19)||(bmonth = 5 && bday < 21), 
'Taurus', 
IF ((bmonth = 5 && bday > 20)||(bmonth = 6 && bday < 21), 
'Gemini', 
IF ((bmonth = 6 && bday > 20)||(bmonth = 7 && bday < 23), 
'Cancer', 
IF ((bmonth = 7 && bday > 22)||(bmonth = 8 && bday < 23), 
'Leo', 
IF ((bmonth = 8 && bday > 22)||(bmonth = 9 && bday < 23), 
'Virgo', 
IF ((bmonth = 9 && bday > 22)||(bmonth = 10 && bday < 23), 
'Libra', 
IF ((bmonth = 10 && bday > 22)||(bmonth = 11 && bday < 22), 
'Scorpio', 
IF ((bmonth = 11 && bday > 21)||(bmonth = 12 && bday < 22), 
'Sagittarius', 
IF ((bmonth = 12 && bday > 21)||(bmonth = 1 && bday < 20), 
'Capricorn', 
'Alien' 
)))))))))))); 
Смежные вопросы