2010-12-21 15 views
0

我對mysql和php很新。我需要把一個數組從PHP到數據表:mysql中的數組數據mysql

數組是這樣的:

$memberdata 
    Key value 
    apple 5 
    banana 8 
    salmon 3 
    candle 4 
    .......... 
    and 100 more... 

我的MySQL表看起來像這樣:

MemberTable 
    ID(INT11)=PK MemID(INT11)  stuff(varchar)  value(INT2) 
    1    23    apple    5 
    2    23    banana    8 
    3    23    salmon    3 
    4    23    candle    4 
    5    45    banana    1 
    6    45    apple    9 

所以每個成員;這裏的成員23和45可以有相同的東西,但有其他的值,所以對於每個成員我有一個PHP數組數組。 (mysql ID是自動增量)。

我的問題:是否有可能將數組直接存儲到MySQL表中...? 在一本書,我看他們做一個foreach循環,並在循環,他們打開到數據庫的連接,所以,我認爲也許是對耗時:

書例如:

$cxn = mysqli_connect($host,$user,$pass,$dbname); 
$MemID = "23"; 
$query_pre = "INSERT INTO MemberTable ('MemID','stuff','value') VALUES ("; 
Foreach ($memberdata as $stuff => $value) 
{ 
$query = $query_pre . "$MemID,$stuff,$value)"; 
$result = mysqli_query($cxn, $query) or die ("Couldn't execute query"); 
} 

問候, Thijs

+0

使用foreach是最好的方法。 – 2010-12-21 19:35:22

回答

1

那麼這是非常奇怪的書。 雖然一般的想法是正確的,但這個特定的代碼包含PHP和mysql錯誤。

它應該是這樣的(未測試):

$cxn = mysqli_connect($host,$user,$pass,$dbname); 
$MemID = "23"; 
$prequery = array(); 
Foreach ($memberdata as $stuff => $value) 
{ 
    $stuff = mysqli_real_escape_string($stuff); 
    $value = mysqli_real_escape_string($value); 
    $prequery[] = "($MemID,'$stuff','$value')"; 
} 
$query = "INSERT INTO MemberTable (MemID,stuff,value) VALUES ".implode(",",$prequery); 
$result = mysqli_query($cxn, $query) or die (mysqli_error($cxn).$query); 
+0

嗨,這個implode函數將所有的數據放在一個字符串中,然後在MySQL中的一個datacell?因爲數組可以超過8000個字符(longtext) – Thijs 2010-12-22 12:43:21

+0

@Thijs是的,顯然。至少嘗試閱讀函數描述。或者你不會學到任何東西。但是,Mysql的默認數據包是2M。檢查你的最終查詢是否適合它(提示:strlen()) – 2010-12-22 13:52:33

0

您避免了爲每個關聯的數組元素運行單獨的插入查詢的大錯誤。這就是很多初學者所做的,使用這個PHP MySQL擴展時效率非常低。此聲明附帶假設您正在爲每個查詢執行一個事務。

由於這只是一個查詢,所以它的效率與您所能得到的一樣高。如果你想找到一個不同的PHP MySQL擴展(即PDO),它有一個像你這樣擁有一個數組的函數,那麼它將在後臺執行這個巨大的查詢,然後執行它。

因此,簡而言之,你正確地做到了。

+0

這不是他,而是書。而這段代碼永遠不會工作。 – 2010-12-21 20:14:31

1

您上面寫的實現是我知道將數據存入表的最有效方式。你可能要考慮的一件事是確保記錄在插入之前不是已經存在記錄的重複。有多種方法可以做到這一點,包括(這不是最有效的方法,但它的工作原理)在執行插入操作之前清除表格的該部分,如果其記錄數是0,或者使用INSERT OR UPDATE語法,在這裏找到:MySQL reference docs

我希望這有助於!

凱爾

-1

您對插入的做法是正確的,但你的數據不被標準化。記住這一點,如果你的桌子尺寸開始變得太大。你的MemID和StuffID將是唯一的關鍵。

-1

一種奇怪的方式來存儲用戶的信息。

您可以將數組直接存儲在一行中。使用serialize函數,例如$ sqlinput = serialize($ array)並將$ sqlinput插入該用戶的數據庫中。然後,當從DB中調用它時,請使用unserialize()。或者,您可以將數組插入單個字符串中,然後將其插入到數據庫中,然後在重新調用時再次將其分解。