2009-08-06 10 views
4

なぜこれがうまくいかないのか分かりません。 DBの日付を更新するループは最初の行のみを更新しますか?


function query($sql) {

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

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

} 

function convert(){ $ this-> db-> open(); $ sql_update = ""; $ this-> db-> query( "SELECT * FROM ACCOUNTS"); $ str = ''; while($ 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'"; $ this-> db-> query($ sql_update)またはdie($ this-> response-> throwResponseError(MSG_DATABASE_ERROR。mysql_error())); $ str。= $ jobNum。 " - " $ new_date。 "
"; }

return $str; 
} 

私はコメントアウトその行でそれを実行した場合、それは私が望むすべての結果を返します。しかし、実際に更新を実行する行のコメントを外すと、最初のレコードが更新され、ループが停止します。どうして?

答えて

2

updateを実行すると、dbの隠れステートメントハンドラとそれに関連付けられた結果が無効になります。 @current_format_stringは、あなたの日付は現在フォーマットされている方法です

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

、:

何をしようとする
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  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

ので、私は次のようになりすべてのvarsを配列にプッシュし、それぞれを実行する方が良いでしょうか?どのように私はそれを修正することができますか? – mlebrun15

+0

完了。私は正直なところ、数時間過ごして、何が干渉しているのか分からなかった。どうもありがとうございます! – mlebrun15

+0

'@ mlebrun15':本当に良いのは、あなたが' MySQL '側でそれをポストに示すようにしていることです。 – Quassnoi

関連する問題