Связывание нескольких значений в pdo
Есть ли простой способ привязки нескольких значений в PDO без повторной обработки? Взгляните на следующий код:
$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)");
$result_set->bindValue(':username', '~user');
$result_set->bindValue(':password', '~pass');
$result_set->bindValue(':first_name', '~John');
$result_set->bindValue(':last_name', '~Doe');
$result_set->execute();
Здесь я привязывал значения повторяющимся способом, который 4 раза. Итак, есть ли простой способ привязки нескольких значений в PDO?
Ответы
Ответ 1
Вы всегда можете связывать значения в аргументах execute()
, пока вы в порядке со значениями, которые обрабатываются как PDO::PARAM_STR
(строка).
$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)");
$result_set->execute(array(
':username' => '~user',
':password' => '~pass',
':first_name' => '~John',
':last_name' => '~Doe'
));
Вы можете использовать массив, переданный как любой массив:
$user = "Nile";
$pdo->execute(array(":user" => $user));
Ответ 2
Если вы хотите связать на основе типа (string, int и т.д.), тогда нет. Если у вас все в порядке, привязывая все как строку:
$stmt = $db->prepare("...");
$stmt->execute(array(
'foo' => 'bar',
'something' => 'else',
'third' => 'thing',
));
Ответ 3
Чтобы по-настоящему никогда ничего не вводить дважды, вы можете использовать массив для предоставления данных и использовать функцию в этом же массиве для вывода части привязки запроса MySQL. Например:
function bindFields($fields){
end($fields); $lastField = key($fields);
$bindString = ' ';
foreach($fields as $field => $data){
$bindString .= $field . '=:' . $field;
$bindString .= ($field === $lastField ? ' ' : ',');
}
return $bindString;
}
Имена данных и столбцов относятся к одному ассоциативному массиву ($data
). Затем используйте bindFields($data)
для генерации строки из column = :column
для объединения в запрос MySQL:
$data = array(
'a_column_name' => 'column data string',
'another_column_name' => 'another column data string'
);
$query = "INSERT INTO tablename SET" . bindFields($data);
$result = $PDO->prepare($query);
$result->execute($data);
bindFields($data)
вывод:
a_column_name=:a_column_name,another_column_name=:another_column_name