【问题标题】:Save datas from multiple checkbox in a database将来自多个复选框的数据保存在数据库中
【发布时间】:2017-10-03 05:49:27
【问题描述】:

关于使用 PDO (PHP) 在数据库中保存来自多个复选框的数据(我的表单中很少)的 2 个问题。我只是展示代码的相关部分,让大家更简单。

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

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

警告: implode ( ) : 在线传递的参数无效 ...

$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>

【问题讨论】:

  • 虽然警告不是错误,但几乎总是意味着您的代码中有一些不正确的地方,可能您的某个产品没有被保存。您收到警告(或警告)的行中的代码是什么?
  • 谢谢你,没错,它的这些行:$p2 = implode(',',$product_2);和 $p3 = implode(',',$product_3); - 我第一次使用 $p1 = implode(',',$product_1);我没有收到警告。

标签: php arrays database post checkbox


【解决方案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);

【讨论】:

  • 现在只是问题的最后一部分。是否可以将数据(例如 3 个不同的名称(如选中的复选框)保存在我的数据库的一行中)返回到我的表单中,因此所有复选框都被正确选中。如果是,我使用哪个推荐。如果没有,我怎样才能让它工作?
  • 这是可能的,但需要一些工作,首先您使用explode() function 将从数据库中获取的值转换回数组,然后根据您添加的数组的值checked attribute 到 PHP 的适当输入标签,例如:&lt;input type="checkbox" name="product_1[]" value="apple" &lt;?php if(in_array("apple", $exploded_array)) echo "checked"?&gt;&gt;(参见(in_array() 函数文档)。
  • 对不起,我的回答迟了,我想先尝试再回答。这完美!非常感谢阿尔贝托!
猜你喜欢
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
相关资源
最近更新 更多