2014-01-16 53 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); 
} 

順便說一句,這樣做的更靈活的方式是在數據庫和PHP的日期/時間對象,使用本地時間戳格式,而不是按照你的方式來處理月/日。

+1

爲什麼downvote? – ernie

+0

與上面的答案相同 - 這隻會更新數據庫中的第一個條目。 – user2250471

0

不要使用foreach,只要在像Krish-R說的while循環中做,但不要覆蓋$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' 
))))))))))));