2012-09-22 265 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