2017-09-26 98 views
1

2有关使用PDO(PHP)在数据库中保存来自多个复选框的数据的问题(我的表单中包含很少数据)。我只是展示代码的相关部分,以使其对每个人都更简单。 A)我写的代码工作正常(仍然保存所有数据),但它仍然给我一个失败的消息,你可以在下面看到。为什么,或者我能做得更好?保存数据库中多个复选框中的数据

B)它将选中的复选框保存为数据库中的数组。后来,我想通过从数据库中获取数据将数据更改回原始格式来更改数据 - 如果将其保存为数组,它会产生问题吗?如果是的话,你会建议如何做得更好。

警告:破灭():上线通过参数无效......对于

$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

虽然警告不是错误,几乎总是意味着有东西是不是就在你的代码,可能你的某个产品没有被保存。你得到警告(或警告)的行中的代码是什么? –

+0

谢谢你,这是正确的,它的这些行:$ p2 = implode(',',$ product_2);和 $ p3 = implode(',',$ product_3); - 我第一次使用$ p1 = implode(',',$ product_1);我没有收到警告。 – Jessy642

回答

1

由于$product_1$product_2$product_3似乎从HTML输入数组我想你在的代码类似于另一部分有关这个:

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

现在,问题是这些变量与复选框数组有关,但是当在页面f中没有选中复选框时或一组,而不是获得该组的空数组该数组未添加到$ _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); 
+0

现在只是问题的最后一部分。 是否有可能将数据(例如3个不同的名称(如选中的复选框)保存在我的数据库的一行中)返回到我的表单中,因此所有复选框都被正确检查。如果是的话,我会用哪个表扬。如果不是,我该如何让它工作? – Jessy642

+0

这是可能的,但它需要一些工作,首先你使用['explode()'函数](http://php.net/manual/en/function.explode.php)来转换你从数据库返回一个数组,然后根据数组的值,将['checked'属性](https://www.w3schools.com/Tags/att_input_checked.asp)添加到使用PHP的相应输入标记中,例如:>(参见([ in_array()'](http://php.net/manual/en/function.in-array.php)函数文档)。 –

+0

对不起,我迟到了,我想先回答。你这么多阿尔贝托! – Jessy642

相关问题