При добавлении любых данных в запрос необходимо соблюдать некоторые правила, независимо от того, откуда они поступают - от пользователя, формы или чего-либо еще. Правила всегда остаются прежними.
Чтобы отправить запрос в базу данных, у вас есть 2 варианта:
Создайте запрос обычным способом, чтобы он выглядел точно так же, как SQL-запрос, который вы можете запустить в консоли sql.
Чтобы сделать это, нужно понимать целый набор правил , а не просто «использовать mysql_real_escape_string».
Правила, такие как:
- строки должны быть заключены в кавычки и экранированы. это единственный смысл побега: это просто разделители easacpe! (и некоторые другие символы - символ завершения строки и сам символ выхода). Без окружающих кавычек mysql_real_escape_string просто бесполезен.
- числа должны быть приведены к его типу явно. Хотя числам данных можно угрожать, как и строкам, есть некоторые числа, такие как параметры предложения LIMIT, которые нельзя экранировать и могут быть только приведены.
Для отправки запроса и данных отдельно .
Это наиболее предпочтительный способ, поскольку он может быть сокращен до «использования привязки». Все строки, числа и параметры LIMIT могут быть связаны - не беспокойтесь вообще.
Используя этот метод, ваш запрос с заполнителями отправляется в базу данных как есть, а связанные данные отправляются в отдельных пакетах, поэтому он не может вмешиваться.
Это как разделение кода и данных . Вы отправляете свою программу (сам запрос) отдельно от данных.
Все сказанное выше относится только к вставке данных.
Но иногда нам приходится делать наш запрос еще более динамичным, добавляя операторы или идентификаторы.
В этом случае каждый динамический параметр должен быть жестко задан в нашем скрипте и выбран из этого набора.
Например, чтобы сделать динамическое упорядочение:
$orders = array("name","price","qty");
$key = array_search($_GET['sort'],$orders));
$orderby = $orders[$key];
$query = "SELECT * FROM `table` ORDER BY $orderby";
или динамический поиск:
$w = array();
$where = '';
if (!empty($_GET['rooms'])) $w[]="rooms='".mesc($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mesc($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w);
$query="select * from table $where";
в этом примере мы добавляем к запросу только данные, введенные пользователем, а не имена полей, которые все жестко заданы в скрипте.
Для привязки алгоритм очень похож
и т. Д.