我需要填写一个表格,用户可以在其中插入产品。该数据库具有“名称”,“ SKU”,“类型”,“属性”列。表单具有“名称”,“ SKU”,“价格”字段和带有三个选项的“类型”选择框-“家具”,“ DVD光盘”和“书籍”。
根据用户在“类型”选择中选择的内容显示其他表单字段。例如,如果用户从选择框中选择“家具”,则会出现三个字段,“高度”,“宽度”,“长度”。如果他选择“书籍”,则会出现“重量”字段,如果他选择“ DVD光盘”,则会出现“尺寸”字段。
用于隐藏/显示必填字段的jQuery函数尚未实现,所以不要介意。
编辑:例如,当我发布类型Disc和Size 700并执行“ var_dump($ _ POST);”时我得到:
array(8) { ["sku"]=> string(8) "BT944RUR" ["name"]=> string(22) "Third insert from page" ["price"]=> string(5) "56.25" ["type"]=> string(8) "DVD-disc" ["size"]=> string(3) "700" ["dimensions"]=> array(3) { ["height"]=> string(0) "" ["width"]=> string(0) "" ["length"]=> string(0) "" } ["weight"]=> string(0) "" ["submit"]=> string(6) "Submit" }
它从表单中收集Size值,但不会进一步传递。
HTML表单:
<form action="" method="post">
<div class="form-group">
<label for="sku">SKU</label>
<input type="text" class="form-control" id="sku" name="sku">
</div>
<div class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" id="name" name="name">
</div>
<div class="form-group">
<label for="price">Price</label>
<input type="text" class="form-control" id="price" name="price">
</div>
<div class="form-group">
<label for="type">Disabled select menu</label>
<select id="type" name="type" class="form-control">
<option></option>
<option>DVD-disc</option>
<option>Book</option>
<option>Furniture</option>
</select>
</div>
<div class="form-group">
<label for="size">Size</label>
<input type="text" class="form-control" id="size" name="size">
</div>
<div class="form-group">
<label for="dimensions[height]">Height</label>
<input type="text" class="form-control" id="height" name="dimensions[height]">
</div>
<div class="form-group">
<label for="dimensions[width]">Width</label>
<input type="text" class="form-control" id="width" name="dimensions[width]">
</div>
<div class="form-group">
<label for="dimensions[length]">Length</label>
<input type="text" class="form-control" id="length" name="dimensions[length]">
</div>
<div class="form-group">
<label for="weight">Weight</label>
<input type="text" class="form-control" id="weight" name="weight">
</div>
<input type="submit" name="submit" id="submit" class="btn btn-default">
</form>
到目前为止,PHP代码(将变量传递给插入):
if(isset($_POST['submit'])) {
$sku = $_POST['sku'];
$name = $_POST['name'];
$price = $_POST['price'];
$type = $_POST['type'];
$attributes = '';
if(isset($_POST['dimensions']) && !empty($_POST['dimensions'])) {
$attributes = implode(' x ', $_POST['dimensions']);
}
else if(isset($_POST['weight']) && !empty($_POST['weight'])) {
$attributes = $_POST['weight'];
}
else if(isset($_POST['length']) && !empty($_POST['length'])) {
$attributes = $_POST['length'];
}
$fields = [
'SKU'=>$sku,
'Name'=>$name,
'Price'=>$price,
'Type'=>$type,
'Attributes'=>$attributes
];
$product = new Products();
$product->insert($fields);
}
插入功能(在另一个文件中):
public function insert($fields) {
$implodeColumns = implode(', ', array_keys($fields));
$implodeValues = implode(", :", array_keys($fields));
$sql = "INSERT INTO products ($implodeColumns) VALUES (:".$implodeValues.")";
$result = $this->connect()->prepare($sql);
foreach ($fields as $key => $value) {
$result->bindValue(':'.$key, $value);
}
$resultExec = $result->execute();
if($resultExec) {
header('Location: index.php');
}
}
我认为if陈述是错误的。我可以通过这种方式将尺寸传递给数据库,但是如果我尝试发送尺寸或重量,它只会传递带有两个“ x”的epmty值。
还有另一个问题:我可以不使用条件语句来实现这一点吗?我愿意接受不同的方法。
答案 0 :(得分:0)
一些笔记。
由于您只对用户提交的值感兴趣,因此可以简化if语句:
if($_POST['dimensions']) {
$attributes = implode(' x ', $_POST['dimensions']);
}
else if($_POST['weight']) {
$attributes = $_POST['weight'];
}
else if($_POST['length']) {
$attributes = $_POST['length'];
}
但是我确实想知道为什么您没有在数据库中单独记录高度/宽度/长度吗?
如果我是您,我将更新数据库表以反映您从用户那里收集的信息(反之亦然),并且每次用户提交表单时都直接插入所有列,即使某些字段值已提交为空。如果您决定在数据库或前端表单中添加或删除列,这还具有简化以后生活的额外好处。
最后,请清除用户输入或使用准备好的SQL语句来避免SQL injection attacks。
答案 1 :(得分:0)
问题是您的第一个if
:
if(isset($_POST['dimensions']) && !empty($_POST['dimensions'])) {
从HTML中可以看到,维度是输入数组:长度,高度,宽度。 这意味着该变量永远不会为空。
$dimensions = [
'length' => '',
'width' => '',
'heigth' => '',
];
echo empty($dimensions) ? 'dimensions is empty': 'dimensions is not empty'; //output: dimensions is not empty
作为解决方案,可以在测试数组是否为空之前从数组中“清除”可空值。为此,您可以诉诸array_filter
echo empty(array_filter($dimensions)) ? 'dimensions is empty': 'dimensions is not empty'; //output: dimensions is empty