【发布时间】:2014-04-25 00:26:34
【问题描述】:
如果要使用命名参数,PDO 似乎需要大量重复。我正在寻找一种使其更简单的方法,使用列/数据对的单个实例——而不必多次重新键入列名甚至变量名。
我自己回答这个问题是因为我编写了一个我认为非常优雅的函数,基本上,我想展示它(并帮助希望做同样事情的人)。
我完全不确定我是否是第一个想到这一点的人,或者是否有任何我没有预见到的问题。如果您有更好的解决方案,请随时告诉我,或提供您自己的解决方案。
【问题讨论】:
如果要使用命名参数,PDO 似乎需要大量重复。我正在寻找一种使其更简单的方法,使用列/数据对的单个实例——而不必多次重新键入列名甚至变量名。
我自己回答这个问题是因为我编写了一个我认为非常优雅的函数,基本上,我想展示它(并帮助希望做同样事情的人)。
我完全不确定我是否是第一个想到这一点的人,或者是否有任何我没有预见到的问题。如果您有更好的解决方案,请随时告诉我,或提供您自己的解决方案。
【问题讨论】:
从@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))) . ")";
}
【讨论】:
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
【讨论】:
insertIntoTable() 函数是很常见的,您可以将其重用于多个不同的表。