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