根据用户在PHP中的选择发布表单值

时间:2019-05-20 17:58:58

标签: php html

我需要填写一个表格,用户可以在其中插入产品。该数据库具有“名称”,“ 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值。

还有另一个问题:我可以不使用条件语句来实现这一点吗?我愿意接受不同的方法。

2 个答案:

答案 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

demo