2012-09-22 164 views
0

所以我有一個可選服裝項目列表作爲複選框,可能會有比下面5更大的數字。MySql - 在數據庫匹配列中插入數組值(匹配和不匹配)

shoes, pants, skirt, socks, jacket //list of possible choices 

在所選項目的jquery中創建一個逗號分隔的數組。比方說,有以下選擇:

shoes, socks, jacket //array posted as $_POST['clothes'] 

在db,每個客戶都有在衣服上表中的這些選項與「否」的服裝項目下的「是」或。然而,服裝項目被命名有點不同,但映射出相同的選擇:

'clothes' table before insert 
customer_id dress_shoes elegant_pants long_skirt ankle_socks biker_jacket 
    1   no   yes   no   no   no 

隨着$ _ POST [「衣服」],我通過數組試圖循環,更新相應的字段'是',並在數據庫中將不相應的字段設置爲'no'。我很難做到這一點。

'clothes' table after insert 
customer_id dress_shoes elegant_pants long_skirt ankle_socks biker_jacket 
    1   yes   no   no   yes   yes 

我做了一個array_intersect獲得的物品將其標記爲「是」:

$clothesArray = array("shoes", "socks", "jacket"); // Posted clothes 
$clothesArrayAll = array("shoes", "pants", "skirt", "socks", "jacket"); // All clothes 
$common = array_intersect($clothesArrayAll,$clothesArray); 
print_r($common); 
Array ([0] => shoes [3] => socks [4] => jacket) 

我試圖以某種方式遍歷$ clothesArrayAll,給一個「是」普通的衣服,對陣列中的所有其他人都是「不」。然後,我試圖通過PDO更新'服裝'表格,以最有效的方式將每個相應的字段設置爲'是'或'否'。我被困在上面的常用衣服陣列後,不知道如何繼續。

有人可以幫我嗎?

謝謝!

+1

那麼,它的SQL你那麼與那時相處得很困難?您將需要一種方法來映射PHP和實際數據庫之間的列名稱。 – TMan

+0

@TMan喋喋不休 - 是否有一個特定的原因,PHP和SQL之間的名稱不匹配? – endyourif

+0

@TMan它將$ clothesArrayAll映射到數據庫中的列,並將SQL有效地提交給它們。我想在PHP中可能會有一種方法來映射它們,也許在陣列中玩耍,並不確定。 – Wonka

回答

1

我認爲您處於正確的軌道上。我只需添加一個包含字段映射的附加數組,例如

$mappingArray = array('shoes' => 'dress_shoes', 'socks' => 'ankle_socks', ...); 

有了這個陣列和以前可以遍歷,並設置相應的SQL基礎上,$common場與在$mappingArray

編輯以實例的關鍵值(可能不是最優化) :

$finalArray = array(); 

foreach ($mappingArray as $key => $value) { 
    $finalArray[$value] = in_array($key, $common) ? 'yes' : 'no'; 
} 

$finalArray現在有一個是/爲每個你的數據庫表匹配值沒有聲明。

編輯包括PDO:我真的更新上述循環如下:

$finalArray = array(); 
$sql = "INSERT INTO cloths (" . implode(",", array_values($mappingArray)) . ") VALUES (:" . implode(",:", array_values($mappingArray)) . ")";; 
foreach ($mappingArray as $key => $value) { 
    $finalArray[":" . $value] = in_array($key, $common) ? 'yes' : 'no'; 
} 

$q = $conn->prepare($sql); 
$q->execute($finalArray); 

打算跟一個蒼蠅,所以類似的東西...

+0

你介意展示一個例子來展示最後一句話嗎? – Wonka

+0

剛剛編輯,讓我知道如果這有效。 – endyourif

+0

感謝您的更正,我討厭我重定向到一個新的頁面進行編輯,因爲我看不到原來的代碼了:( – endyourif

0

爲什麼不改變你的HTML字段名來匹配您的數據庫名稱,設置的「不」的atabase則默認...

​​

但你可能要檢查的發佈名稱爲有效列名稱 - 您可以使用表格中的列名稱和類型

DESC clothes; 
+0

我試圖避免在html表單中使用數據庫名稱,而是將它們映射到php中出於安全目的。任何想法我怎麼能做到這一點? – Wonka

+0

你爲什麼認爲這應該有助於安全?在這方面你有更多的事情需要擔心,特別是如果你認爲將數組映射到插入是困難的。 – symcbean