В начале изучения PDO я тоже частенько путался в выборе метода при работе с базой данных. Для тех кто не читал или читал одним глазком статью с примерами работы PDO, напомню что существует три способа, которые мы можем задействовать чтобы выполнить команду mysql.
Эти методы: exec(), query() и prepare+execute(). Так в чем же отличие между ними? Первые два метода мало чем отличаются друг от друга и по сути призваны нам помогать при использовании простых запросов без всяких условий.
Например:
$query = "SELECT * FROM table"; $sth = $db->query($query); $result = $sth->fetchAll();
query() запускает стандартный оператор SQL и требует, чтобы вы должным образом экранировали все данных, чтобы избежать SQL инъекций и других вопросов. Поэтому его надо использовать в запросах без внешних данных.
Execute() запускает подготовленное выражение, которое позволяет выполнять привязку параметров, чтобы избежать необходимости экранировать или проверять параметры. Метод execute также прекрасно работают когда вы повторяете запрос несколько раз.
Пример подготовленных выражений:
$sth = $db->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindParam(':calories', $calories); $sth->bindParam(':colour', $colour); $sth->execute(); //$calories и $color не нужно экранировать, так как данные отделены от запросов
Еще пример с повторными запросами:
$sth = $db->prepare("SELECT * FROM table WHERE foo = ?"); $sth->execute(array(1)); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); $sth->execute(array(2)); $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
Поэтому лучшая практика, это все-же придерживаться связки подготовленных выражений и execute для повышения безопасности.
последний пример кривой, а именно $stmt