繁体   English   中英

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

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

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

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

我希望这是您想要的东西?

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

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

然后,您应该这样使用:

$columns = implode(", ", array_keys($elements));
$values  = implode(", ", array_values($elements));
$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;

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM