Php 在数据库中保存来自多个复选框的数据

Php 在数据库中保存来自多个复选框的数据,php,arrays,database,post,checkbox,Php,Arrays,Database,Post,Checkbox,关于使用PDO(PHP)在数据库中保存来自多个复选框的数据的两个问题(我的表单中只有几个复选框)。我只是展示了代码的相关部分,以使它对每个人都更简单 A) 我编写的代码可以正常工作(仍然正确保存所有数据),但它仍然给我一条失败消息,您可以在下面看到。为什么,或者我能做得更好 B) 它将选中的复选框保存为数据库中的数组。稍后,我想通过将数据库中的数据恢复到原始形式来更改数据—如果它像数组一样保存,会不会出现问题?如果是的话,你会推荐什么做得更好 警告:内爆():第行传递的参数无效。。。为了 由

关于使用PDO(PHP)在数据库中保存来自多个复选框的数据的两个问题(我的表单中只有几个复选框)。我只是展示了代码的相关部分,以使它对每个人都更简单

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

B) 它将选中的复选框保存为数据库中的数组。稍后,我想通过将数据库中的数据恢复到原始形式来更改数据—如果它像数组一样保存,会不会出现问题?如果是的话,你会推荐什么做得更好

警告:内爆():第行传递的参数无效。。。为了




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

$product_1 = $_POST['product_1'];
$product_2 = $_POST['product_2'];
$product_3 = $_POST['product_3'];
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
现在的问题是,这些变量与复选框数组相关,但是当页面中没有为某个组选择任何复选框时,该数组不会被添加到$\u POST(您可以使用
var\u dump($\u POST)

我怀疑在您的测试中,您只标记了产品_1的复选框,因此您得到了该产品的数组,而没有其他产品的数组。为了防止出现错误,您可以使用以下方法填充每个products变量:

$product_1 = $_POST['product_1'];
$product_2 = $_POST['product_2'];
$product_3 = $_POST['product_3'];
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

另外,您将准备好的语句与直接在查询字符串中插入值混合在一起,这是不好的,因为这可能导致,您应该对表的所有值使用
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);

虽然警告不是错误,但它几乎总是意味着代码中有不正确的地方,可能是某个产品没有保存。您得到警告(或警告)的那一行代码是什么?谢谢,没错,这是因为这些行:$p2=内爆(“,”,$product_2);$p3=内爆(',',$product_3);-我第一次使用$p1=内爆(',',$product_1);我没有收到任何警告。现在只是问题的最后一部分。是否可以将数据(例如,3个不同的名称(如复选框)保存在数据库的一行中)返回到我的表单中,以便正确选中所有复选框。如果是,我应该使用哪种推荐。如果没有,我如何使其工作?这是可能的,但需要做一些工作,首先使用将从数据库获得的值转换回数组,然后根据数组的值,使用PHP将添加到相应的输入标记中,例如:
对不起,我迟了回答,我想在回答之前先尝试一下。那太好了!非常感谢你,阿尔贝托!
$product_1 = $_POST['product_1'];
$product_2 = $_POST['product_2'];
$product_3 = $_POST['product_3'];
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 = "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);