【问题标题】:Is there a shortcut for binding named PDO params for MySQL inserts?是否有为 MySQL 插入绑定命名 PDO 参数的快捷方式?
【发布时间】:2014-04-25 00:26:34
【问题描述】:

如果要使用命名参数,PDO 似乎需要大量重复。我正在寻找一种使其更简单的方法,使用列/数据对的单个实例——而不必多次重新键入列名甚至变量名。

我自己回答这个问题是因为我编写了一个我认为非常优雅的函数,基本上,我想展示它(并帮助希望做同样事情的人)。

我完全不确定我是否是第一个想到这一点的人,或者是否有任何我没有预见到的问题。如果您有更好的解决方案,请随时告诉我,或提供您自己的解决方案。

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

从@equazcion 的回答开始,但使用的代码方法略有不同:

function bindFields($fields) {
    return implode(",", array_map(function ($f) { return "`$f`=:$f"; },
        array_keys($fields)));
}

或者,如果您想要传统的 INSERT 语法而不是 MySQL 特定的 INSERT...SET 语法:

function bindFields($fields) {
    return "(" . implode(",", array_map(function ($f) { return "`$f`"; },
        array_keys($fields))) . ")"
    . " VALUES (" . implode(",", array_map(function ($f) { return ":$f"; },
        array_keys($fields))) . ")";
}

【讨论】:

  • 啊,我明白了。这比我的简单——你用一行就做到了,很好:) PS。对于其他人,请参阅我的使用答案。
【解决方案2】:
function bindFields($fields){
    end($fields);
    $lastField = key($fields);

    $bindString = ' ';
    foreach($fields as $field => $data){ 
            $bindString .= $field . '=:' . $field; 
            $bindString .= ($field === $lastField ? ' ' : ',');
    }
    return $bindString;
}

使用单个关联数组提供要插入的数据。然后,在该数组上使用 bindFields(),为 MySQL 查询生成 column = :column 对的字符串:

$data = array(
    'first_column' => 'column data string',
    'second_column' => 'another column data string',
    'another_column' => 678,
    'one_more_field' => 'something'
);

$query = "INSERT INTO tablename SET" . bindFields($data);

$link = new PDO("mysql:host='your-hostname.com';dbname='your_dbname'", 'db_username', 'db_pass');
$prepared = $link->prepare($query);
$prepared->execute($data);

bindFields($data) 输出:

 first_column=:first_column,second_column=:second_column,another_column=:another_column,one_more_field=:one_more_field 

【讨论】:

  • 一种有趣的方法,但我想知道它的实用性。在您的代码中,您真正需要将任意数量列的数据插入表中多少次?我认为如果你想这样做,你的代码中还有其他问题。
  • @MikeBrant,不一定。编写一个通用的insertIntoTable() 函数是很常见的,您可以将其重用于多个不同的表。
  • @BillKarwin:我不确定你的建议会如何发挥作用。你能举个例子吗?
  • 好的,我已经在单独的答案中发布了一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多