после прекращения использования устаревших функций mysql_ * я переключился на mysqli. Но затем я заметил, что незаготовленные операторы не защищены от SQL-инъекции. Затем я снова изменил свой код.
У меня была следующая функция, которая проверяет, существует ли переменная $ ID в базе данных и печатает значение заголовка для этой строки:
function showPostTitle($ID, $mysqli) { $result = $mysqli -> query("SELECT ID, title FROM blog where ID = $ID"); $row = $result -> fetch_array(MYSQLI_BOTH); echo $row['title']; }
Я изменил это на следующее:
function showPostTitle($ID, $mysqli) { $stmt = $mysqli -> prepare("SELECT ID, title FROM blog WHERE ID = ?"); $stmt -> bind_param("i", $ID); $stmt -> execute(); $stmt -> bind_result($ID, $title); $stmt -> fetch(); print_r($title); $stmt -> free_result(); }
Мой вопрос: правильно ли это реализовать готовые заявления? Плюс, теперь я в безопасности от SQL Injections? Большое спасибо тому, кто ответит на этот вопрос 🙂
Ваша логика mysqli кажется прекрасной, в руководстве по PHP есть несколько примеров, если вы их не видели.
Почему вы выбираете идентификатор, когда не используете его? Также вам не нужно связывать результат, когда он будет иметь только одну строку, возвращенную в полном наборе результатов, поскольку я предполагаю, что это произойдет в этом случае (ID – уникальный индекс в таблице), вместо этого используйте get_result .
Использование mysqli prepare будет защищать от всех обычных инъекций инъекций, но не в стиле 0-дневного стиля, который еще не дошел до драйвера.
Взгляните на этот пост:
Являются ли подготовленные PDO заявления достаточными для предотвращения SQL-инъекций?
Он использует PDO вместо MySQLi, который решает одну и ту же проблему, создавая подготовленные инструкции.
Извините, что не ответил на ваш вопрос, но просто хотел предоставить вам ресурс.