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

时间:2015-03-23 11:31:36

标签: php mysql loops pdo

我有一个关联数组,可以将每个'key'和'value'插入到我的数据库表中。目前,针对循环的每次迭代 的每个键 运行单独的查询,但是我希望它抓住每个'key'和'element',并将它们插入为在 一个 查询中配对。

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

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

试试这个......

答案 2 :(得分:0)

尝试这样

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

答案 3 :(得分:0)

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

OR

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

答案 4 :(得分:0)

然后你应该这样使用:

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

答案 5 :(得分:0)

如评论中所述,这是一个例子: 问号可以是一个值数组,因此每个问号都应该绑定到一个值。

    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;

    }