Насколько я знаю, использование prepared statement уже само по себе гарантированная защита от SQL инъекций (т.к. данные посылаются на сервер отдельно от запроса и сервер делает все необходимое, что бы экранировать данные).
Однако, использование prepared намного более объемное по коду чем использование PDO::query для единичных запросов. Сравним:
$stmt = $DBH->prepare("SOME SQL QUERY");
$stmt->execute($array_with_data);
$result = fetchAll();
Или даже так:
$stmt = $DBH->prepare("SOME SQL QUERY");
$stmt->bindParam('param1', $param1);
$stmt->bindParam('param2', $param2);
$stmt->bindParam('param3', $param3);
$stmt->execute();
$result = fetchAll();
Сравним с тем же самым, что получается при использовании просто PDO::query:
$result = $DBH->query("SOME SQL QUERY WITH DATA")->fetchAll();
И ВСЕ :)
Кроме того, приготовленные запросы сложнее отлаживать, ибо финального запроса как такового просто не существует. А для обычных запросов всегда можно их вывести и посмотреть что там не так (где там кавычка пропущена, запятая и т.д.).
Однако, я так понимаю, второй вариант никак не защищает от инъекций, если данные в запросе заранее не были правильно экранированы.
Вопросы:
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости