2016-10-12 24 views
4

我有一張數百列的表格。表格結構不在我的控制之下(由第三方控制)。該表還有可怕的字段名稱,空格,單引號等等,表值也是如此。該表通過cron每小時更新一次。 cron作業每次都會截斷並重建表。我還保留該表的歸檔表,我使用REPLACE INTO語句根據需要更新或插入。mysql更換成數百列的表格

我的挑戰 - 我不想明確定義所有350個字段名稱和值,並且在我的REPLACE INTO語句中再次這樣做,因爲這將花費很長時間,並且如果表更改將需要維護。我寧願使用數組。這裏是沒有工作,但希望給予的目標的想法(我知道這是不推薦使用MySQL,但它是什麼它是多種原因):

$listings = mysql_query("SELECT * FROM current.table"); 

while ($listing = mysql_fetch_assoc($listings)){ 

    //prepare variables 

    $fields = array_keys($listing); 
    $fields = implode('`, `', $fields); 
    $fields = "`$fields`"; 

    $values = array_values($listing); 
    $values = implode("`, `", $values); 
    $values = "`$values`"; 

    mysql_query('REPLACE INTO archive.table ($fields) VALUES ($values)'); 

} 
+1

定義 '不工作'。你有沒有發現問題在哪個階段發生? – Utkanos

+1

在查詢中使用'mysql_error()'。你發佈的內容似乎是合法代碼,但是值需要引用'''並且爲了可能的注入而逃脫,而不是打勾''''。而對第二個查詢的封裝使用''''''mysql_query(「REPLACE INTO archive.table($ fields)VALUES($ values)」);' –

+0

爲什麼不使用'DROP TABLE archive.table; CREATE TABLE archive。 table LIKE current.table; INSERT INTO archive.table SELECT * FROM current.table'? – eithed

回答

3

發佈爲社區維基,沒有代表需要因爲它解決了OP的問題(根據評論中的建議)。

!「啊哈上的mysql_query聲明錯誤的單引號是罪魁禍首我也沒有mysql_real_escape_string在$值和使用單引號代替蜱的工作就像一個魅力謝謝你最終的答案: - !塔維什」

對查詢使用mysql_error()。您發佈的內容似乎是合法代碼,但是需要引用'escaped以表示可能的注入,未勾選。 對第二個查詢的封裝使用雙引號"

mysql_query("REPLACE INTO archive.table ($fields) VALUES ($values)"); 

以及其他建議。

OP的最終代碼(從意見採取):

while ($listing = mysql_fetch_assoc($listings)){ 
    $fields = array_keys($listing); 
    $fields = implode(', ', $fields); 
    $fields = "$fields"; 
    $values = array_values($listing); 
    $values = implode(", ", $values); 
    $values = mysql_real_escape_string($values); 
    $values = str_replace("`","'",$values); 
    $values = "'$values'"; 
    mysql_query("REPLACE INTO archive.table ($fields) VALUES ($values)"); 
} 
+0

再次感謝! while($ listing = mysql_fetch_assoc($ listings)){$ fields = array_keys($ listing); $ fields = implode(',',$ fields); $ fields =「$ fields」; $ values = array_values($ listing); $ values = implode(「,」,$ values); $ values = mysql_real_escape_string($ values); $ values = str_replace(「'」,「'」,$ values); $ values =「'$ values'」; mysql_query(「REPLACE INTO archive.table($ fields)VALUES($ values)」); \t} – Tavish

+1

@Tavish非常歡迎。我確實從你的問題下的評論中提取你的代碼,*歡呼聲* –