0

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

来自数据库的项目

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

过程

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();
    }
4

1 回答 1

2

我看到的第一个问题是,$items当你这样做时,你正在用一个空白字符串覆盖你的变量:

$items = $_POST['items'];

$items = "";

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

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

然后,当您想从数据库中取回数据时,只需json_decode()在 JSON 字符串上运行,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();
  }
}
于 2013-10-30T00:07:43.357 回答