是否存在用于MySQL插入的命名PDO参数的快捷方式?

时间:2014-04-25 00:26:34

标签: php mysql pdo

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

我自己回答这个问题,因为我写了一个功能,我认为这样做非常优雅,基本上,我想展示它(并帮助那些想要做同样事情的人)。

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

2 个答案:

答案 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