2009-08-06 89 views
4

我不知道爲什麼這不起作用。 while循環更新DB中的日期只更新第一行?


function query($sql) {

 $this->result = @mysql_query($sql, $this->conn); 

    return($this->result != false); 

} 

函數convert(){ $ this-> db-> open(); $ sql_update =「」; $ this-> db-> query(「SELECT * FROM ACCOUNTS」); $ str =''; ($ row = $ this-> db-> fetchassoc()){ $ jobNum = $ row ['JOBNUMBER']; $ old_date = $ row ['INSTALLDATE']; $ new_date = date(「Y-m-d」,strtotime($ old_date)); $ sql_update =「UPDATE ACCOUNTS SET INSTALLDATE ='$ new_date'WHERE JOBNUMBER ='$ jobNum'」; ($ sql_update)或die($ this-> response-> throwResponseError(MSG_DATABASE_ERROR。mysql_error())); $ str。= $ jobNum。 「 - 」。 $ new_date。 「
」; }

return $str; 
} 

如果我與該行註釋掉運行它,它返回所有我想要的結果。但是當我取消註釋實際運行更新的行時,它會更新第一條記錄並停止循環。爲什麼?

回答

2

當您運行更新時,它將使您的db中的隱藏語句吊杆和與其相關的結果無效。

db->query("SELECT …") -- creates the handler 

-- 1st iteration 
db->fetchassoc() -- fetches the first row 
db->query("UPDATE …") -- creates another handler and destroys the old one 

-- 2nd iteration 
db->fetchassoc() -- no rows returned by `UPDATE`, nothing to fetch 

你正在嘗試做的,可以做更容易地使用單個語句:

UPDATE accounts 
SET  installed = DATE_FORMAT(STR_TO_DATE(installed, @current_format_string), '%Y-%d-%m') 

,其中@current_format_string是你日期的格式現在。

更新:

嘗試運行此查詢:

UPDATE accounts 
SET  installdate = DATE_FORMAT(STR_TO_DATE(installdate , '%m/%d/%Y'), '%Y-%d-%m') 

之前運行UPDATE查詢,您可能需要使用SELECT檢查結果:

SELECT DATE_FORMAT(STR_TO_DATE(installdate, '%m/%d/%Y'), '%Y-%d-%m') 
FROM accounts 
+0

所以,我會是最好把所有的變量都推到一個數組中,然後爲每個變量賦值?或者我該如何解決它? – mlebrun15 2009-08-06 17:40:58

+0

完美。我老實說花了幾個小時,看不出有什麼干擾。非常感謝! – mlebrun15 2009-08-06 17:44:21

+0

'@ mlebrun15':真正好的一點是,你可以在'MySQL'一邊進行,就像在帖子中顯示的一樣。 – Quassnoi 2009-08-06 17:48:59