Как лучше делать запросы в PDO

Рейтинг: 1Ответов: 1Опубликовано: 13.08.2025

Подскажите как лучше делать запрос в 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]);

или разницы нет в этих запросах и они оба выполняют один и тот же функционал?

Ответы

▲ 0Принят

Разницы нет, функционал один и тот же.

Лучше всего сделать функцию вида

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.