从复选框中获取多个值并存储在DB php中

时间:2013-10-29 23:59:20

标签: php mysql pdo

无法将多个复选框值存储到DB中。不确定这是否是最有效的方式,但这是我唯一能想到的。如果有更好的方法,请分享。我还处于测试模式,所以还没有验证。

来自数据库的项目

 $get_products = $db->prepare("select * from item where user_id = '$id' ORDER BY add_date");

 $get_products->execute();

 while ($row = $get_products->fetch())
 {
   $item_id =  $row['item_id'];
   $user_id =  $row['user_id'];
   $item_name = $row['item_name'];

   $products .= "<br/><input type='checkbox' name='items[]' value='$item_id' />$item_name";
 }

FORM

<form method="post" action="confirm.php">

    <?php echo $products; ?>

    <input type="submit" value="Add Items" id="add_items"/>

    <input name="from_id" type="hidden" value="1">
    <input name="to_id" type="hidden" value="2">
    <input type="submit" name="submit" value="Submit" >
 </form>

PROCESS

if(isset($_POST['submit']))
{
         $from = $_POST['from_id'];
     $to = $_POST['to_id'];
     $items = $_POST['items'];

   if(empty($items))
   {
      $message = "no items in items";
      exit;
   }

        foreach($items as $i)
    {
          $items .= $i. "|";
    }
         json_encode($items);

$sql = $db->prepare("INSERT into trans(from_id, to_id,items)VALUES(:from_id, 
                         :to_id, :items");

$sql->bindValue('from_id', $from);
$sql->bindValue('to_id', $to);
$sql->bindValue('items', $items);

if($sql->execute())
{
    header("Location: profile.php?user=1");
    exit();
    }

1 个答案:

答案 0 :(得分:2)

我看到的第一个问题是,当您执行此操作时,用空字符串覆盖$items变量:

$items = $_POST['items'];

$items = "";

这意味着您将在空白字符串上运行foreach

虽然从您的复选框中存储值的更好方法是仅json_encode()原始$items变量。这会将您从表单中收到的值编码为JSON字符串,该字符串可以安全地存储在数据库中。

然后,当您想要从数据库中取回数据时,只需在JSON字符串上运行json_decode(),JSON字符串将转换回数组。

但是,如果你想从json_decode()返回一个关联数组,请确保将true传递给第二个参数,如下所示:

$indexed_array = json_decode($some_array);
$associative_array = json_decode($some_array, true);

修改

正在从表单传递数据,这是您在confirm.php文件中需要的内容:

if(isset($_POST['submit']))
{
  $from = $_POST['from_id'];
  $to = $_POST['to_id'];
  $items = $_POST['items'];

  if(empty($items))
  {
    $message = "no items in items";
    exit;
  }

  $items = json_encode($items);

  $sql = $db->prepare("INSERT into trans(from_id, to_id,items)VALUES(:from_id, 
                     :to_id, :items");

  $sql->bindValue('from_id', $from);
  $sql->bindValue('to_id', $to);
  $sql->bindValue('items', $items);

  if($sql->execute())
  {
    header("Location: profile.php?user=1");
    exit();
  }
}