【问题标题】:Most efficient way to insert associative array with matching array to table keys将具有匹配数组的关联数组插入到表键的最有效方法
【发布时间】:2017-06-06 10:31:04
【问题描述】:

给定以下数组;

[0] => array(
    col1 => val1,
    col2 => val2,
    col3 => val3
),
[2] => array(
    col1 => val1,
    col2 => val2,
    col3 => val3
),
[3] => array(
    col1 => val1,
    col2 => val2,
    col3 => val3
)

还有一个列名相同的数据库表col1col2col3

将其插入数据库最有效的方法是什么?

我目前有这样的东西;

$i = 0;
$db_columns = '';

$column_values = array();

foreach ($rows as $k => $row)
{
    $columns = array();
    $fields = array();

    foreach ($row as $a => $b) 
    {
        $column_values[$a.$i] = $b;
        $columns[] = ':'.$a.$i;
        $fields[] = $a;
    }

    // build up sql values
    $db_columns .= ($db_columns ? ', ' : '').'('.implode(', ', $columns).')';

    $i++;
}

// perform insert
$sql = "INSERT INTO table (".implode(', ', $fields).") 
    VALUES $db_columns";

$query = $db->prepare($sql);
$status = $query->execute($column_values);

这将像这样构建查询字符串;

INSERT INTO table (col1, col2, col3)
VALUES (:col10, :col20, :col30), (:col11, :col21, :col31), (:col12, :col22, :col32)

用数组来匹配绑定变量:col10:col20:col30:col11等...

所以一切都很好。它可以满足我的需求并且可以工作,但是考虑到输入数组键与表匹配,代码对我来说似乎过于复杂。必须有更清洁的方法来做到这一点。

【问题讨论】:

  • 使用问号参数发送合并数组
  • 这看起来很容易受到 SQL 注入的攻击,或者可能受到由字段内容创建的语法错误的攻击。
  • 您没有发布完整的表结构,但是如果您要添加到表中的所有列,则无需命名列;意思是删除(col1, col2, col3)
  • splash58 听起来确实会删掉一大块代码。我没有想到这一点。会尝试。 ADyson 数组不是由用户输入生成的。所有数组键都是在代码的其他地方手动设置的,所以 AFAIK 这些不应该是问题。
  • @Novocaine eval.in/812609

标签: php mysql arrays pdo


【解决方案1】:

您可以通过使用问号参数稍微简化代码。例如,顺便说一句:

$db_columns = '(' .  implode('),(', array_fill(0, count($rows), implode(',', array_fill(0, count($rows[0]), '?')))) . ')';

$sql = "INSERT INTO table (".implode(', ', array_keys($rows[0])).") 
    VALUES $db_columns";

$query = $db->prepare($sql);
$status = $query->execute($column_values);    
$query->execute(array_merge(...array_map('array_values', $rows)));

demo on eval.in

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多