繁体   English   中英

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

[英]Post form values based on user selection in PHP

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

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

一些注意事项。

由于您仅对用户是否提交了值感兴趣,因此可以简化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注入攻击

问题是你的第一个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

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM