【问题标题】:How can I insert data into multiple columns using one query with a foreach loop?如何使用带有 foreach 循环的一个查询将数据插入多个列?
【发布时间】:2015-03-23 11:31:36
【问题描述】:

我有一个关联数组,可以将每个“键”和“值”插入到我的数据库表中。目前,针对循环的每个键为每次迭代运行单独的查询,但是我希望它获取每个“键”和“元素”,并将它们插入为一个查询中的对。

PHP:

$elements = array(
    'column_1' => 'data1',
    'column_2' => 'data2',
    'column_3' => 'data3'
);

foreach($elements as $key=>$value) {
    $key = $key;
    $value = $value;

    DB::query('INSERT INTO `table` (' . $key . ') VALUES (?);', array($value));
}

【问题讨论】:

  • 您必须将参数绑定到问号。
  • 我不明白你的意思,你能解释一下吗?
  • 我在下面发布了一个示例

标签: php mysql loops pdo


【解决方案1】:

您可以使用sprintf() 来决定要插入哪些列,例如:
sprintf("INSERT INTO '%s' ('%s', '%s') VALUES ('%s', '%s')", $array[tableName], $array[col1name], $array[col2name], $array[col1val], $array[col2val]);

我希望这是您正在寻找的那种东西?

【讨论】:

  • 它也需要是一个循环,因为我有许多生成的数组元素
  • 你循环出返回,例如$qry = sprintf(); while ($result = mysql_fetch_array($qry)) { /* Do work on array retrurned */ }
【解决方案2】:

那么你应该这样使用:

$columns = implode(", ", array_keys($elements));
$values  = implode(", ", array_values($elements));
$sql = "INSERT INTO `table` ($columns) VALUES ($values)";

【讨论】:

    【解决方案3】:

    您不必使用 foreach 来创建查询。您可以使用implode()array_keys()array_values() 函数的组合:

    $elements = array(
        'column_1' => 'data1',
        'column_2' => 'data2',
        'column_3' => 'data3'
    );
    
    $fieldNames = array_keys($elements));
    $fieldsQueryPart = '`' . implode('`, `', $fieldNames . '`';
    $valuesQueryPart = implode(',', array_fill(0, count($fieldNames), '?'));
    $values = array_values($elements);
    
    DB::query('INSERT INTO `table` (' . $fieldsQueryPart . ') VALUES (' . $valuesQueryPart . ');', $values);
    

    编辑: 因为我认为您使用的是普通的PDO,所以应该替换您的DB::query() 行。你必须先创建PDO 对象:

    $pdo = new PDO($dsn, $user, $password);
    

    然后你需要准备声明:

    $statement = $pdo->prepare('INSERT INTO `table` (' . $fieldsQueryPart . ') VALUES (' . $valuesQueryPart . ');');
    

    最后两步是将值绑定到查询并执行它或者只是执行将值传递给execute()方法

    $statement->execute($values);
    

    foreach ($values as $key => $value) {
        $statement->bindValue($key + 1, $value);
    }
    $statement->execute();
    

    【讨论】:

    • @mightyspaj3 是query() 标准PDO::query() 还是你自己的方法?
    • 我需要使用我的 DB::query,我有一个需要它的 OOP 系统
    • 有一个错误 => $fieldNames = array_keys($elements)); 应该是 $fieldNames = array_keys($elements);$fieldsQueryPart = '`' . implode('`, `', $fieldNames . '`'; 应该是 => $fieldsQueryPart = '`' . implode('`, `', $fieldNames) . '`';
    【解决方案4】:
    $count = 0;
    $fields = '';
    foreach($elements as $col => $val) {
          if ($count++ != 0) 
       $fields .= ', ';
          $col = mysql_real_escape_string($col);
          $val = mysql_real_escape_string($val);
          $fields .= "`$col` = $val";
       }
    
       $query = "INSERT INTO `table` SET $fields";
    

    试试这个...

    【讨论】:

    • 如果每次迭代都会重置字段,那应该如何工作,我希望将所有值和键插入到一个查询中
    【解决方案5】:

    这样试试

    $columns = implode(", ", array_keys($elements));
    $escaped = array_map('mysql_real_escape_string', array_values($elements));
    $values  = implode(", ", $escaped);
    $sql = "INSERT INTO `table` ($columns) VALUES ($values)";
    

    【讨论】:

    • 我可以用 MySQL_real_escape_string 替换什么?我正在使用准备好的语句,所以我不需要它
    【解决方案6】:

    正如评论中提到的,这里有一个例子: 问号可以是一个值数组,所以每个问号都应该绑定一个值。

        public function query($sql, $params = array()) {
    
            $this->_error = false;
    
            if ($this->_query = $this->_pdo->prepare($sql)) {
    
                $x = 1;
    
                if (count($params)) {
    
                    foreach ($params as $param) {
    
                        $this->_query->bindValue($x, $param);
    
                        $x++;
    
                    }
    
                }
    
                if ($this->_query->execute()) {
    
                    $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
                    $this->_count = $this->_query->rowCount();
    
                } else {
    
                    $this->_error = true;
    
                }
    
            } else {
    
                $this->_error = true;
    
            }
    
            return $this;
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2014-05-10
      相关资源
      最近更新 更多