如何将数组数据插入到mysql表格中。

6
我有两个表,分别为op_groupoptions。这两个表都是用数组值填充的。例如,我想要将披萨的详细信息插入到我的表中。
具体操作如下:
1. 将Cheese pizza和Sausage pizza插入到op_group表中。 2. 其他数据将被插入到options表中。这些选项应该根据相关的外键op_group id插入。
如下图所示: Menu Details 以下是我的尝试,虽然所有详细信息都已插入,但是没有针对相关的op_group进行插入。
$opg_name=$_POST['opg_name'];
$price=$_POST['price'];
        
$itemCountz = count($opg_name);
$itemValues=0;
$queryValue1 = "";
                
for($i=0; $i<$itemCountz; $i++) {
  $itemValues++;
  if($queryValue1!="") {
    $queryValue1 .= ",";
  }
  $queryValue1 = "INSERT INTO op_group  
                  (opg_id,ml_id,cat_id,res_id,res_name,op_grp)                 
                 VALUES(NULL,'".$ml_id."','".$cat_id."','".$res_id."','".$res_name."','".$_POST["opg_name"][$i]."')";
    
  $result1= mysql_query($queryValue1)or die(mysql_error());                                 
  
  $query6= "SELECT  * FROM op_group ORDER BY opg_id DESC LIMIT 1" ;
  $result6= mysql_query($query6);
        
  while($row6 = mysql_fetch_assoc($result6)){
    $opg_id=$row6['opg_id'];
  }
                                                            
  $itemCount2 = count($price);
  $itemValues1 = 0;
                
  $queryValue2 = "";
  for($j=0;$j<$itemCount2;$j++) {
    if(!empty($_POST["op_name"][$j])||!empty($_POST["price"][$j])) {
      $itemValues1++;
      if($queryValue2!="") {
        $queryValue2 .= ",";
      }
                        
      $queryValue2 = "INSERT INTO options (op_id,opg_id,ml_id,cat_id,res_id,res_name,opt,price) VALUES (NULL,'".$opg_id."','".$ml_id."','".$cat_id."','".$res_id."','".$res_name."','".$_POST["op_name"][$j]."','".$_POST["price"][$j]."')";
    }           
  }
  
  $result2=mysql_query($queryValue2)or die(mysql_error());
}

这段代码的结果如下:

结果

选项表插入的数据如下所示: 选项表

如何解决这个问题?


你可以使用PHP的serialize()函数将数组值存储到数据库中,然后在检索时unserialize()解码。或者可以使用json_encode()和json_decode()来存储和检索。 - Shelim
$query6= "SELECT * FROM op_group ORDER BY opg_id DESC LIMIT 1" ;这是一个问题,你在选择所有op_group条目的同时,对于每个op_group,都插入了所有选项,而没有检查它是否属于芝士披萨或香肠披萨。 - Achal Saraiya
@AchalSaraiya 它只选择已插入的 opg_id。($opg_id=$row6['opg_id'];)。这些例子中它会输出 221 和 222。我如何检查相关选项组的选项? - Tje123
你可以摆脱所有那些“.”和“-”的符号。不要按照你建议的方式存储数据。只需保持一切正常化即可。 - Strawberry
1个回答

1
您看到每个选项组中的选项重复出现的原因是因为您的$queryValue2在最外层的for($i = 0; $i < $itemCountz; $i++)循环中针对每个选项组重复执行。

目前,您当前的$_POST输入方式相当混乱(重复的行属性也是如此)。我建议您按每个选项组分组HTML输入字段。您可以尝试以下内容:

<div>
  <input type="text" id="first_order" name="orders[0][name]" /><br />
  <input type="text" name="orders[0][options][0][price]" /><br />
  <input type="text" name="orders[0][options][0][size]" /><br />   
  <input type="text" name="orders[0][options][1][price]" /><br />
  <input type="text" name="orders[0][options][1][size]" /><br /> 
</div>

<div>
  <input type="text" id="second_order" name="orders[1][name]" /><br />
  <input type="text" name="orders[1][options][0][price]" /><br />
  <input type="text" name="orders[1][options][0][size]" /><br />   
  <input type="text" name="orders[1][options][1][price]" /><br />
  <input type="text" name="orders[1][options][1][size]" /><br /> 
</div>

注意我如何使用HTML name属性将食物选项按食物分组。然后,如果您提交此表单,您会发现$_POST数组看起来像这样:
Array
(
    [orders] => Array
    (
        [0] => Array
        (
            [name] => "Cheese Pizza"
            [options] => [0] => Array([size] => "8'" 
                                      [price] => "12")
                         [1] => Array([size] => "12'" 
                                      [price] => "14")
        )

        [1] => Array
        (
            [name] => "Sausage Pizza"
            [options] => [0] => Array([size] => "8'" 
                                      [price] => "13")
                         [1] => Array([size] => "12'" 
                                      [price] => "16")
        )
    )
)

现在,您可以使用类似以下代码来整理后端PHP代码:
foreach ($_POST['orders'] as $orders) {

  // .. some codes

  foreach($orders as $order) {
    // .. add codes to insert into op_groups where $order['name'] will give you the pizza name

    foreach($order['options'] as $details) {
      // .. add codes to insert into options where $details['size'] and $details['price'] will give you the corresponding values
    }
  }
}

此外,您可以使用 mysqli.insert-id 获取最后插入行的行 ID。然后,您可以摆脱那个愚蠢的 $query6 和它的 while 循环。

当然,在使用之前不要忘记对您的 $_POST 输入进行清理!

我有点累了,如果有错误,我明天会修正它们。希望能帮到您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接