【问题标题】:PHP: Iterate over multiple arrays and build SQL INSERT queryPHP:迭代多个数组并构建 SQL INSERT 查询
【发布时间】:2014-05-12 13:36:45
【问题描述】:

我有获取多个数组的 PHP 代码:

<?php
$checkKey = $_POST['key'];

if ($key === $checkKey)
{

  $a = array_values($_POST['a']);
  $b = array_values($_POST['b']);
  $c = array_values($_POST['c']);
  $d = array_values($_POST['d']);

  if ( (count($a) !== count($b)) || (count($a) !== count($c)) || (count($a) !== count($d)) )
  {
    die ('Not enough parameters!');
  }
  else
  {

  }


}
?>

我想遍历所有数组并构建一个 SQL INSERT 查询,如下所示:

INSERT INTO xyz (a,b,c,d) VALUES (1,2,3,4), (4, 5, 6, 7);

值存储在每个数组中的位置(即在本例中,a 包含值 1 和 4,b 包含值 2 和 5,等等)

我怎样才能做到这一点?

【问题讨论】:

  • 旁注(向前看):如果您确实让某人给您一个有效的答案,请记住keykeysMySQL reserved words .
  • 我认为$key 是在某处定义的?您可能需要在使用前检查是否设置了 $a、$b、$c 和 $d (isset()),除非您可以保证所有这些都存在。为什么在比较 count() 时使用“不等价”!== 而不是“不等”!=? SQL有一个数组类型——你在用那个吗?
  • 使用抽象模型或准备好的语句或某种查询构建器会更简单、更清晰。

标签: php mysql


【解决方案1】:

只需使用for() 循环来迭代从0count($a) 的索引(您可以使用任何数组,它们检查为相同大小)。

$sql = 'insert into xyz (a, b, c, d) values ';
for ($i = 0, $l = count($a); $i < $l; ++$i) {
     $sql .= "('".
         // it's really important to escape the input!
         mysqli_real_escape_string($link, $a[$i]).','.
         mysqli_real_escape_string($link, $b[$i]).','.
         mysqli_real_escape_string($link, $c[$i]).','.
         mysqli_real_escape_string($link, $d[$i]).
     "'), ";
}
$sql = substr($sql, 0, -2); // trim down the last ', '

【讨论】:

    【解决方案2】:

    使用这个:

    function transpose($array) {
        array_unshift($array, null);
        return call_user_func_array('array_map', $array);
    }
    //example
    $a=array(1,3);
    $b=array(2,4);
    $c=array(5,4);
    $d=array(10,12);
    
    $r= transpose(array($a,$b,$c,$d));
    $sql='INSERT INTO xyz (a,b,c,d) VALUES ';
    foreach($r as $values){
    $sql.='('.implode(',',$values).'),';
    }
    $sql=rtrim($sql,',');
    echo $sql;
    

    【讨论】:

      【解决方案3】:

      我认为没有内置的 php 函数,所以你可以这样做:

      <?PHP
      
      $count = count($a);
      $sqlout = 'INSERT INTO xyz (a,b,c,d) VALUES ';
      
      for($i=0; $i<$count; $i++)
      {
         $sqlout .= ( $i>0 ? ',' : '') . '('. $a[$i] .', '. $b[$i] .', '. $c[$i] .', '. $d[$i] .') ';
      }
      
      
      ?>
      

      并确保转义您的输入以避免 SQL 注入!

      【讨论】:

      • 行间缺少,
      【解决方案4】:

      简单循环

      <?php
      $checkKey = $_POST['key'];
      
      if ($key === $checkKey)
      {
      
          $a = array_values($_POST['a']);
          $b = array_values($_POST['b']);
          $c = array_values($_POST['c']);
          $d = array_values($_POST['d']);
      
          if ( (count($a) !== count($b)) || (count($a) !== count($c)) || (count($a) !== count($d)) )
          {
              die ('Not enough parameters!');
          }
          else
          {
              $sql_array = array();
              foreach($a AS $key=>$values)
              {
                  $sql_array[] = "(".(int)$a[$key].",".(int)$b[$key].",".(int)$c[$key].",".(int)$d[$key].")";
              }
              if (count($sql_array) > 0)
              {
                  $sql = "INSERT INTO xyz (a,b,c,d) VALUES ".implode(",", $sql_array);
                  // Execute it here
              }
          }
      
      
      }
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-29
        • 2015-09-07
        • 2011-12-26
        • 2017-04-30
        • 2017-09-01
        • 1970-01-01
        • 2016-07-20
        相关资源
        最近更新 更多