如果要使用命名参数,PDO似乎需要大量重复。我正在寻找一种简化方法,使用单个列/数据对实例 - 无需多次重新键入列名甚至变量名。
我自己回答这个问题,因为我写了一个功能,我认为这样做非常优雅,基本上,我想展示它(并帮助那些想要做同样事情的人)。
我不确定我是第一个想到这一点,还是有任何问题我没有预见到。如果你有更好的东西,请随时告诉我,或者提供你自己的解决方案。
答案 0 :(得分:4)
从@ 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))) . ")";
}
答案 1 :(得分: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