С точки зрения безопасности это должно быть безопасно, если запрос в $ sql правильно использует привязку param. Если переменная $ sql построена следующим образом, ваш код вам не поможет.
//DO NOT TRY THIS AT HOME
$sql = "SELECT * FROM `users` WHERE user='" . $_POST['user'] . "'";
Но я могу увидеть и другие проблемы с вашим кодом.
1) Ваш try ... catch
блоки бесполезны. Когда вы используете PDO::ERRMODE_SILENT
, PDO не вызывает никаких исключений. При возникновении ошибки будут установлены только свойства $pdo->errorCode
или $statement->errorCode
.
2) Вы открываете слишком много соединений. Я предполагаю, что у вас есть код, которым вы поделились в какой-то функции, которую вы планируете вызывать как queryDb($sql, $params);
Это означает, что каждый раз, когда вы будете вызывать эту функцию, вы создадите новый экземпляр PDO
и откроете новое соединение. Возможно, вы захотите переместить деталь, которая создает экземпляр PDO, в файл db-config, а затем использовать этот единственный экземпляр каждый раз, когда вы собираетесь создать новую инструкцию, используя $pdo->prepare()
.
3) Использование die
. Обычно в примерах используется die
или exit
, когда запрос идет не так. Но в реальном приложении это будет означать, что пользователь увидит уродливую пустую страницу с одним предложением, говорящим о том, что что-то пошло не так. Лучше добавить исключение, которое будет обработано выше в вашем приложении. Это позволило бы приложению отображать макет страницы с меню и другими вещами, даже если запрошенное действие не выполнено.
4) Вы не устанавливаете значение переменной $ output в первой части кода «Query DB»,Хотя я не уверен, что вы просто пропустили это при копировании или у вас есть это в вашем реальном коде.