如何在php中将动态数组插入数据库?

Posted

技术标签:

【中文标题】如何在php中将动态数组插入数据库?【英文标题】:How to insert dynamic array into the database in php? 【发布时间】:2013-07-09 06:35:53 【问题描述】:

我正在处理动态数组,我需要将这些数组插入数据库中。当我将动态数组插入数据库而不是在一行中显示它的覆盖三行时。

插入编码

this is my array

$asma[]=GA::select($ga->population,'total',3);

这是插入查询,我需要在六列中插入详细信息,因为我的输出包含六个值。

    $Voltage = array();
    $Duration = array();
    $Number = array();

    foreach($asma as $key => $value) 
    

       foreach ( $value as $ind => $hObject ) 
       
          $Voltage[] = $hObject->Voltage;
          $Duration[] = $hObject->Duration;
          $Number[] = $hObject->Number;               

     // endforeach
    for(i=0;i<row_count;i++)
    


  $q = "INSERT INTO ga (fe, fe1, fe2,fe3,fe4,fe5,fe6,f7,f8, timestamp,username ) VALUES (%d, %d, %d,%d, %d, %d,%d, %d, %d, '%s' ,'$login_session')";
    $qs = sprintf( $q, $Voltage[$i],$Duration[$i],$Number[$i],

                       date("Y-m-d H:i:s") );
    $result = mysql_query($qs);
    if ( ! $result ) 
         die( 'Insert failed ' . mysql_errno() . ' ' . mysql_error() );                
    
?>

如果用户从选项中选择1,我需要在one 行中存储六个值。如果用户从选项中选择two,那么two 将覆盖数据库中的行。 这是我的输出

Array
(
    [0] => H Object
        (
            [Voltage] => 18
            [Number] => 1
            [Duration] => 6
        )

    [1] => H Object
        (
            [Voltage] => 38
            [Number] => 4
            [Duration] => 14
        )

    [2] => H Object
        (
            [Voltage] => 38
            [Number] => 4
            [Duration] => 14
        )

它是这样存储在数据库中的

Volatge     Duration Number Volatge Duration Number Volatge Duration      Number
18           6       1       18      6        1      18        6        1
38          14       4       38      14       4      38       14        4
38          14       4       38      14       4      38       14        4

我需要这样存储

 Volatge     Duration Number Volatge Duration Number Volatge Duration      Number
  18           6        1      38      4       14      38     14             4

请帮帮我

【问题讨论】:

列名不能重复,尽量垂直存储 列名在数据库中不重复我需要水平列名在数据库中来自 fe,fe1,fe2,fe3,fe4,fe5,fe6,f7,f8 @Sundar 帮助我 @Seean 帮我解决这个问题 您的 for 循环无效 php for(i=0;i&lt;row_count;i++)。每个人都应该有一个$ - for($i=0;$i&lt;$row_count;$i++)。此外,您的 sprintf 变量数量错误。在$q 中,您有 9 个 %d,但在 $qs 中,您只给了 3 个。您希望其他 6 个来自哪里。 【参考方案1】:

您需要将查询移出 foreach 循环。这是一种方法-

$Voltage = array();
$Duration = array();
$Number = array();

foreach($asma as $key => $value) 


   foreach ( $value as $ind => $hObject ) 
      $Voltage[] = $hObject->Voltage;
      $Duration[] = $hObject->Duration;
      $Number[] = $hObject->Number;               ,
   

 // endforeach
$q = "INSERT INTO ga (fe, fe1, fe2,fe3,fe4,fe5,fe6,f7,f8, timestamp,username ) VALUES (%d, %d, %d,%d, %d, %d,%d, %d, %d, '%s' ,'$login_session')";
$qs = sprintf( $q, $Voltage[0],$Duration[0],$Number[0],
                   $Voltage[1],$Duration[1],$Number[1],
                   $Voltage[2],$Duration[2],$Number[2],
                   date("Y-m-d H:i:s") );
$result = mysql_query($qs);
if ( ! $result ) 
     die( 'Insert failed ' . mysql_errno() . ' ' . mysql_error() );                


编辑

要添加第二行,您可以将其更改为类似这样的内容(注意,我看不到您在哪里为 1/2 定义了选择,所以我只输入了 $user_select)-

$Voltage = array();
$Duration = array();
$Number = array();

foreach($asma as $key => $value) 


   foreach ( $value as $ind => $hObject ) 
      $Voltage[] = $hObject->Voltage;
      $Duration[] = $hObject->Duration;
      $Number[] = $hObject->Number;               ,
   

 // endforeach
$q = "INSERT INTO ga (fe, fe1, fe2,fe3,fe4,fe5,fe6,f7,f8, timestamp,username ) VALUES (%d, %d, %d,%d, %d, %d,%d, %d, %d, '%s' ,'$login_session')";
$qs = sprintf( $q, $Voltage[0],$Duration[0],$Number[0],
                   $Voltage[1],$Duration[1],$Number[1],
                   $Voltage[2],$Duration[2],$Number[2],
                   date("Y-m-d H:i:s") );
if($user_select==2)  // if user select 2
    $q = ", (%d, %d, %d,%d, %d, %d,%d, %d, %d, '%s' ,'$login_session')";
    $qs = sprintf( $qs.$q, $Voltage[3],$Duration[3],$Number[3],
                             $Voltage[4],$Duration[4],$Number[4],
                             $Voltage[5],$Duration[5],$Number[5],
                             date("Y-m-d H:i:s") );

$result = mysql_query($qs);
if ( ! $result ) 
     die( 'Insert failed ' . mysql_errno() . ' ' . mysql_error() );                


编辑 #2 这是另一个版本。您的 for 循环无效 php for(i=0;i&lt;row_count;i++)。每个人都应该有一个$ - for($i=0;$i&lt;$row_count;$i++)。此外,您的 sprintf 变量数量错误。在您的 $q 中,您有 9 个 %d,但在 $qs 中,您只给了 3 个。您希望其他 6 个来自哪里。在此我已将您的循环更改为增加 3 - for($i=0;$i&lt;$row_count;$i+=3),并使用 $Voltage[$i+1], $Duration[$i+1], $Number[$i+1], $Voltage[$i+2], $Duration[$i+2], $Number[$i+2], 填写剩余的 6 个 %ds

$Voltage = array();
$Duration = array();
$Number = array();

foreach($asma as $key => $value) 


   foreach ( $value as $ind => $hObject ) 
   
      $Voltage[] = $hObject->Voltage;
      $Duration[] = $hObject->Duration;
      $Number[] = $hObject->Number;               

 // endforeach
for($i=0;$i<$row_count;$i+=3)


  $q = "INSERT INTO ga (fe, fe1, fe2,fe3,fe4,fe5,fe6,f7,f8, timestamp,username ) VALUES (%d, %d, %d,%d, %d, %d,%d, %d, %d, '%s' ,'$login_session')";
  $qs = sprintf( $q, $Voltage[$i],$Duration[$i],$Number[$i],
                     $Voltage[$i+1],$Duration[$i+1],$Number[$i+1],
                     $Voltage[$i+2],$Duration[$i+3],$Number[$i+3],

                   date("Y-m-d H:i:s") );
  $result = mysql_query($qs);
  if ( ! $result ) 
     die( 'Insert failed ' . mysql_errno() . ' ' . mysql_error() );                
 
?>

【讨论】:

当用户从可用输入中选择一个但如果用户从输入中选择两个则数据库中的两行具有相同的数据时,这在一个输入中运行良好 我认为您将能够弄清楚如何添加第二行。给我几分钟,我会回来给你举个例子。 如果用户选择 2,我已经编辑了如何添加第二行 如果用户选择 3 或 4 或 5 作为输入意味着不同的输出出现在不同的输入上,那么用户选择 2 的数组名称如 3 ,4,5我让它变得动态 数据库中的插入取决于用户输入的平均数据插入行数。【参考方案2】:
<?php 
//code not tested check it

//Logic is changed instead of for looping many times
$data = array();

$j = 0;

foreach($asma as $key => $value)

$i = 0;

foreach ( $value as $ind => $hObject )

    if($i==0)
    
        $data[$j]['fe'] = mysql_escape_string($hObject->Voltage);

    else

        $data[$j]['fe'.$i] = mysql_escape_string($hObject->Voltage);
    

    $i++;

    $data[$j]['fe'.$i] = mysql_escape_string($hObject->Duration);
    $i++;

    $data[$j]['fe'.$i] = mysql_escape_string($hObject->Number);
    $i++;



$j++;

// endforeach

//multiple array
 foreach($data as $array)
 


 //unique array
//$array3 = array_merge($Voltage,$Duration,$Number);

$fields = implode(',',array_keys($array));

//if you want append any new field append it
$fields .= ','.'timestamp,username';

$vals = "'".implode("','",array_values($array))."'";

//if you want append any new values append it
$vals .= ",'".time()."','".$login_session."'";


$q = "INSERT INTO ga (".$fields.") VALUES(".$vals.")";

$result = mysql_query($q);
if ( ! $result ) 
    die( 'Insert failed ' . mysql_errno() . ' ' . mysql_error() );

 

【讨论】:

尝试使用mysqli扩展而不是mysql 它只插入 1 个输入值而不是其他意味着如果用户选择 2 那么只有一行插入到数据库中而不是一个 n 并且时间戳现在不根据会话 @ashy 时间和登录会话,您可以根据需要修改或在不必要时将其删除 它没有在数据库中插入数据 没有错误,但它总是在数据库中插入第一行而不是插入多行

以上是关于如何在php中将动态数组插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 php 中将数组值作为键值对插入到数据库表中

如何在 Laravel 5.6 中将数组插入数据库

PHP 表单使用动态输入插入数据数组

如何在node.js中将json数组数据插入mysql?

如何在PHP中将接受/拒绝插入到db中

如何在 wamp 服务器的 phpmyadmin 中将此数据数组插入 mysql