0

所以我有一个可选服装项目列表作为复选框,可能比下面的 5 个更多。

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

在所选项目的 jquery 中创建一个逗号分隔的数组。假设选择了以下内容:

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

在数据库中,每个客户在衣服表中都有这些选项,衣服项目下有“是”或“否”。但是,服装项目的名称略有不同,但映射到相同的选项:

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

使用 $_POST['clothes'],我试图遍历数组,将数据库中的相应字段更新为“是”,将非对应字段更新为“否”。我很难做到这一点。

'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 更新“衣服”表,以最有效的方式将每个相应的字段设置为“是”或“否”。在得到上面的普通衣服阵列后,我被卡住了,不知道如何进行。

有人能帮助我吗?

谢谢!

4

2 回答 2

1

我认为你在正确的轨道上。我只需添加一个包含字段映射的附加数组,例如

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

使用这个数组和前面的数组,您可以循环并根据$common字段中的键值相应地设置您的 SQL$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);

和这个一起飞翔,所以类似的东西......

于 2012-09-22T23:55:51.243 回答
0

为什么不更改您的 HTML 字段名称以匹配您的数据库名称,然后在数据库中设置默认值“否”...

$cols='INSERT INTO clothes ';
$values=' VALUES ';

$join='(';
foreach ($_POST as $key=>$val) {
    $cols.=$join . $key;
    $values=$join . ':' . $key;
    $join=',';
}
$qry=$cols . ')' . $values . ')';
$stmt = $dbh->prepare($qry);
foreach ($_POST as $key=>$val) {
    $stmt->bindParam(':' . $key, $_POST[$key]);
}    

但是您可能想检查发布的名称是否是有效的列名 - 您可以使用从表中获取列名和类型

DESC clothes;
于 2012-09-22T23:03:53.033 回答