从数据库

时间:2017-09-26 23:21:08

标签: php arrays database post checkbox

2关于使用PDO(PHP)在多数复选框中保存数据的问题(我的表格中我很少有)。我只是展示了代码的相关部分,以使每个人都更加简单。

A)我写的代码工作(仍然正确保存所有数据),但它仍然给我一个失败的消息,你可以在下面看到。为什么,或者我能做得更好?

B)它将已选中的复选框保存为数据库中的数组。后来我想通过将数据库中的数据恢复为原始形式来更改数据 - 如果它像数组一样保存会产生问题吗?如果是的话,你会建议做什么呢。

  

警告:implode():在行上传递无效的参数... for

$p2 = implode(',',$product_2);
$p3 = implode(',',$product_3);
$p1 = implode(',',$product_1);  which I defined first seems to be fine 
<?php
    if(isset($_POST['send']))
    {   
        require("php/tconnect.php");    

        $id = $_POST['id'];
        $name = $_POST['name'];
        $date = $_POST['date'];
        $p1 = implode(',',$product_1);
        $p2 = implode(',',$product_2);
        $p3 = implode(',',$product_3);  

        $sql = "INSERT INTO database (id, name, date) VALUES (:id, :name, :date, '$p1', '$p2', '$p3')";
        $stmt = $dbh->prepare($sql);
        $stmt->bindValue(':id', $id);
        $stmt->bindValue(':name', $name);
        $stmt->bindValue(':date', $date);

        $stmt->execute();

        echo "Datas saved";             
    }
?>

HTML

    <input type="checkbox" name="product_1[]" value="apple" id="product_1_apple">
    Apple 
</label>
<label class="checkbox-inline">
    <input type="checkbox" name="product_1[]" value="Banana" id="product_1_banana">
    Banana
</label>

,接下来的表格看似相似

    <input type="checkbox" name="product_2[]" value="water" id="product_2_water">
    Water 
</label>
<label class="checkbox-inline" >
    <input type="checkbox" name="product_2[]" value="juice" id="product_2_juice">
    Juice 
</label>

1 个答案:

答案 0 :(得分:1)

由于$product_1$product_2$product_3似乎与HTML中的输入数组相关,我认为您在代码的另一部分中有这样的内容:

$product_1 = $_POST['product_1'];
$product_2 = $_POST['product_2'];
$product_3 = $_POST['product_3'];

现在,问题是这些变量与一个复选框数组有关,但是如果在组的页面中没有选中复选框,而不是为该组获取一个空数组该数组不会添加到$ _POST (您可以使用var_dump($_POST)查看)。

我怀疑在您的测试中,您只是标记了product_1的复选框,因此您获得了该产品的数组,但其他产品没有。为了防止错误,您可以使用以下内容填充每个产品变量:

if(isset($_POST['product_1']))  // if the array is defined in $_POST
    $product_1 = $_POST['product_1'];  // fill with the array from the form
else $product_1 = array();  // fill with empty array, you get the empty string with implode()

// repeat for product_2 and product_3


此外,您正在混合准备好的语句,这些语句很好,直接在查询字符串中插入值,这很糟糕,因为它可以导致SQL Injection,您应该使用bindValue()来表示所有值表:

$sql = "INSERT INTO database (id, name, date) VALUES (:id, :name, :date, :p1, :p2, :p3)";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':id', $id);
$stmt->bindValue(':name', $name);
$stmt->bindValue(':date', $date);
$stmt->bindValue(':p1', $p1);
$stmt->bindValue(':p2', $p2);
$stmt->bindValue(':p3', $p3);