Как лучше делать запросы в PDO
Подскажите как лучше делать запрос в PDO В переменной $sql может быть любой запрос SELECT, INSERT и т.д.
пример
$sql = "SELECT * FROM test WHERE id = ?";
или
$sql = "INSERT INTO test (id) VALUES (?)";
Передать параметры через bindParam
$sth = $dbh -> prepare($sql);
$sth -> bindParam(1, $id);
$sth -> execute();
или же
$sth = $dbh -> prepare($sql);
$sth -> execute([$id]);
или разницы нет в этих запросах и они оба выполняют один и тот же функционал?
Ответы (1 шт):
Автор решения: Ипатьев
→ Ссылка
Разницы нет, функционал один и тот же.
Лучше всего сделать функцию вида
function pdo($pdo, $sql, $args = NULL)
{
$stmt = $pdo->prepare($sql);
$stmt->execute($args);
return $stmt;
}
и с её помощью выполнять запросы в одну-две строчки.
// получение строк, затронутых DELETE/UPDATE/INSERT
$deleted = pdo($pdo, "DELETE FROM users WHERE id=?", [$id])->rowCount();
// insert
$sql = "INSERT INTO users (name, email, password) VALUES (?,?,?)";
pdo($pdo, $sql, [$name, $email, $password]);
// update с именованными плейсхолдерами
pdo($pdo, "UPDATE users SET name=:name WHERE id=:id",['id'=>$id,'name'=>$name]);
// Получение не обычного массива, а словаря id => name
$dic = pdo($pdo, "SELECT id, name FROM users")->fetchAll(PDO::FETCH_KEY_PAIR);
и так далее
Использование bindValue() действительно позволяет указать тип, но скорее всего вы никогда не столкнётесь с ситуацией, когда это было бы нужно. Единственное место, где может воникнуть проблема - это параметры LIMIT, но это решается выключением режима эмуляции PDO.