如何使用带有foreach循环的一个查询将数据插入多个列中


How can I insert data into multiple columns using one query with a foreach loop?

我有一个关联数组,它将每个"key"answers"value"插入到我的数据库表中。目前,对于循环的每个迭代,每个键都会运行一个单独的查询,但我希望它获取每个"键"answers"元素",并将它们成对插入一个查询中。

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

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

我希望这就是你想要的那种东西?

然后您应该像这样使用:

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

您不必使用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();
$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";

试试这个。。。

这样尝试

$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)";

如注释中所述,下面是一个示例:问号可以是一个值数组,因此每个问号都应该绑定到一个值。

    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;
    }