Не работает SQL-запрос
В этой статье речь пойдёт об одной из самых распространённых причин, почему не работает SQL-запрос. Мы сейчас не берём в расчёт "случайные ошибки". Здесь идёт речь о передаче данных их через форму и последующее их использование в SQL-запросах, которые иногда почему-то не работают.
Предположим, что Вы делаете комментирование у себя на сайте. И Вы хотите, чтобы пользователь имел право вводить любые символы, даже кавычки, обратные слеши и прочее. Предложим примерный вид Вашего запроса на вставку новой записи в таблицу комментариев:
INSERT INTO `mysite_comments` (`name`, `comment`) VALUES ('$name', '$comment')
Теперь давайте подставим в этот SQL-запрос реальные данные, допустим, name будет Михаил, а comment будет Тестирование.
INSERT INTO `mysite_comments` (`name`, `comment`) VALUES ('Михаил', 'Тестирование')
Как Вы думаете, сработает такой запрос? Безусловно, он будет прекрасно работать. Но что если кто-нибудь введёт name Михаил, а comment Мой ' комментарий:
INSERT INTO `mysite_comments` (`name`, `comment`) VALUES ('Михаил', 'Мой ' комментарий')
Как Вы понимаете, данный SQL-запрос не будет выполнен. И вот теперь расскажу об решении этой проблемы.
Необходимо любые переменные, которые используются в SQL-запросах, пропускать через функции addslashes(). Данные функция занимается экранированием следующих спецсимволов: одинарная кавычка, обратная кавычка, двойная кавычка и обратный слеш.
Таким образом, если мы сделаем так:
$name = addslashes($name);
$comment = addslashes($comment);
То наш SQL-запрос станет таким:
INSERT INTO `mysite_comments` (`name`, `comment`) VALUES ('Михаил', 'Мой \' комментарий')
И вот этот SQL-запрос уже выполнится без проблем.
И ещё один момент, о котором часто забывается. Любые входные данные надо обязательно пропускать через функцию htmlspecialchars(), за исключением отдельных случаев. Данная функция избавит Вас от заливки в базу HTML-кода.
Чтобы понять важность функции htmlspecialchars() давайте разберём простой пример, связанный с теми же комментариями. Если пользователь будет иметь право передавать HTML-код (а он это права всегда имеет), который впоследствии не будет никак обработан, то при выводе комментария на страницу этот код будет выполнен. Самый простой пример - это сделать редирект на JavaScript на сайт злоумышленника. Таким образом, любой, кто зайдёт на страницу с этим комментарием, будет мгновенно отправлен на другой сайт.
Подведём небольшой итог. Всегда используйте функцию htmlspecialchars() для всех входящих данных, за исключением самых редких случаев. И всегда используйте функцию addslashes() для каждой переменной, участвующей в SQL-запросах.
-
- Михаил Русаков
Комментарии (38):
что делать?
Ответить
Михаил, помогите пожалуйста. Пишу вот такую функцию. <?php function insert_into_base() { $id=$_POST['id']; $cat=$_POST['cat']; $result=mysql_query("INSERT INTO pages(`id`,`cat`) VALUES('$id','$cat')"); } ?> Затем идёт html форма и после пишу код <?php if(isset($_POST['send'])) { insert_into_base(); } else { echo "Ошибка добавления полей!"; } ?> Здесь $_POST['send'] это кнопка submit отправки. НО ничего не вставляется в базу! Почему?
Ответить
Проверьте что будет если сам запрос ввести напрямую в phpmyadmin. Возможно действительно поля не добавляются, из-за какой-нибудь ошибки.
Ответить
«И всегда используйте функцию addslashes() для каждой переменной, участвующей в SQL-запросах.» а mysql_real_escape_string когда использловать?
Ответить
Вместо addslashes() можно использовать mysql_real_escape_string(), причём это функция более безопасная, если кодировка не UTF-8.
Ответить
Она по-моему экранирует только двойные и одинарные кавычки
Ответить
Ещё обратный слэш. Этого достаточно, чтобы захватить все спецсимволы.
Ответить
ясно, спасибо! :)
Ответить
Доброго времени суток,в меня такой вопрос,а что нужно писать в файле где сохраняються нустройки к базе данных редакторо tinyMCE.Дайте мне код
Ответить
В меня токай еще вопрос.а Вы не знаете где можно скачать редактор который сможет конвертировать музыку или видео по качеству и по расшерению екрана?
Ответить
Есть ffmpeg: http://myrusakov.ru/php-ffmpeg.html Для аудио надо поискать что-то аналогичное.
Ответить
Так а как же делать? Имеем: addslashes() и htmlspecialchars() Надо пропускать вводимые пользователем данные через обе эти функции или через одну из них? Если через обе, то имеет ли значение в какой последовательности? Можно чуточку поподробнее об этом? &&& еще и про stripslashes() начитал тут вдобавок :)
Ответить
Надо через обе, сначала через htmlspecialchars(), потом через addslashes().
Ответить
то есть надо просто таким образом обрабатывать данные? $text_comment = $_POST["text_comment"]; $text_comment = htmlspecialchars($text_comment); $text_comment = addslashes($text_comment); и дальше уже вставлять $text_comment в SQL запрос??? и все?
Ответить
Да.
Ответить
Михаил, при вводе, например: "GHJDTHRF" в поле для комментариев и отправке на сайт, выводит потом \"GHJDTHRF\" в самиз комментах. А вото так не нужно. Скажи, пожалуйста, как подрихтовать? :)
Ответить
Если выводить из базы, то такого никогда не будет. Выводите из базы, а не берите откуда-то ещё.
Ответить
хм... да в том то и дело, что из базы как раз и вывожу! :) вот так в базе хранится: \"GHJDTHRF\"
Ответить
Значит, нарушаете порядок вызова функций. Не может добавляться слэш к & через addslashes(). А у Вас он почему-то находится. И ещё добавьте в .htaccess magic_quotes_qpc off magic_quotes_runtime off magic_quotes_sybase off Возможно, дело в этом.
Ответить
добавил и все сломалось совсем :) ошибку 500 выдает! .htaccess стал таким: AddDefaultCharset UTF-8 magic_quotes_qpc off magic_quotes_runtime off magic_quotes_sybase off после каждой строчки не надо добавлять ник4аких разделительных знаков?
Ответить
Просто вот так напишите и всё: php_value magic_quotes_gpc 0
Ответить
А нужно пропускать через эти функции, например, название фотографии, которую пользователь размещает на сайт??? может злоумышленник всунуть каку таким образом? <вредоносный код>.jpeg
Ответить
Нет, не нужно.
Ответить
Михаил, хочу вывести статью в отдельном файле с подставление нужных значений. Есть форма из которой заносятся данные в базу данных под id. Потом выводит нужную часть информации в шаблоне и ссылку на статью, но в статье в ссылку id не подставляется и выводит пустой шаблон. Вот код: function getArticle ($id) { global $mysqli; connectDB(); $result_set = $mysqli->query ("SELECT * FROM `action` WHERE `id`= 'id'"); closeDB(); return $result_set->fetch_assoc (); } function ResultSetToArray ($result_set) { $array = array (); while (($row = $result_set->fetch_assoc ()) != false); $array[] = $row; return $array; } а это в файле для вывода статьи : <?php require_once "start.php"; $article = getArticle($_GET["id"]); $id = $article["id"]; $name = $article["titel"]; $year = $article["year"]; $developer = $article["developer"]; $publisher = $article["publisher"]; $language = $article["language"]; $description = $article["description"]; ?> Буду очень благодарен!!
Ответить
http://myrusakov.ru/php-finderror.html
Ответить
честно говоря я уже пытаюсь найти ошибку уже очень долго... и прошу Вас, скажите есть здесь ошибка или нет???
Ответить
Я не вижу сразу, но я никак не могу найти ошибку, как бы этого не хотел, надо абсолютно весь код смотреть во всех файлах. Ошибка может быть, где угодно.
Ответить
я могу Вам на почту отправить файлы с кодом, если Вы не против.
Ответить
Notice: Undefined index: id in Z:\home\site.localhost\www\id.php on line 4 выводит вот такую ошибку. а вот код где ошибка:<?php require_once "start.php"; $article = getArticle($_GET["id"]); $id = $article["id"]; $name = $article["titel"]; $year = $article["year"]; $developer = $article["developer"]; $publisher = $article["publisher"]; $language = $article["language"]; $description = $article["description"]; ?>
Ответить
Делайте проверку на существование $_GET["id"] через isset, а уже потом обращайтесь к этому массиву.
Ответить
уже пробовал. ошибки нет, но все равно информация не выводится
Ответить
Она не выводится, потому что $_GET["id"] - не существует в массиве. Возможно, из-за того, что URL с ошибкой.
Ответить
Михаил, после isset: if(isset($_GET['id'])){ $action = getArticle($_GET['id']); } начало выводить ошибки: Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 6 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 7 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 8 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 9 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 10 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 11 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 12
Ответить
Смысл этого замечания (а не ошибки) в том, что Вы используете непроинициализированные переменные.
Ответить
а кактм образом мне их проиницизировать?
Ответить
$x = 5;
Ответить
Не знаю, в данную ли рубрику я пишу, но проблема у меня в следующем. Есть мониторинг обменных валют. В последние дни при попытке обновить экспортный файл курсов выдает ошибку: WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'get, IF (e.start < e.startx && e.start <> 0, 1.0000, IF (e.startx <> 0, e.sta' at line 4] INSERT INTO `wp_emetal_calc` SELECT e.*, IF (e.start < e.startx && e.start <> 0, e.startx / e.start, IF (e.startx <> 0, 1.0000, e.startx)) get, IF (e.start < e.startx && e.start <> 0, 1.0000, IF (e.startx <> 0, e.start / e.startx, e.start)) give FROM `wp_emetal` e WHERE emetalx <> emetaly AND start <> 0 AND startx <> 0 Писал на хостинг. Вот переписка: Здравствуйте, нужна Ваша помощь, возникла непонятная проблема, мой сайт http://superobmen.org/ который находится на этом аккаунте, ещё сегодня работал всё было нормально, сейчас сам сайт в принципе работает, но что-то странное произошло с базой данных, сайт является мониторингом и регулярно выводит определённые данные на главной странице, сейчас страница пустая, ни каких данных не выдает, что произошло не могу понять, внутри в админке пишет такую ошибку: database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'get, IF (e.start < e.startx && e.start <> 0, 1.0000, IF (e.startx <> 0, e.sta' at line 4] помогите плиз, пробую восстановить из бекапа, тоже выдает ошибку. Вы, 02.12.2014 18:43 Здравствуйте, можно посмотреть полностью код запроса? Антон Алексеевич, 02.12.2014 18:48 если вы имеете ввиду саму ошибку, которую выдает скрипт после запуска для обновления, тогда вот: WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'get, IF (e.start < e.startx && e.start <> 0, 1.0000, IF (e.startx <> 0, e.sta' at line 4] INSERT INTO `wp_emetal_calc` SELECT e.*, IF (e.start < e.startx && e.start <> 0, e.startx / e.start, IF (e.startx <> 0, 1.0000, e.startx)) get, IF (e.start < e.startx && e.start <> 0, 1.0000, IF (e.startx <> 0, e.start / e.startx, e.start)) give FROM `wp_emetal` e WHERE emetalx <> emetaly AND start <> 0 AND startx <> 0 Вы, 02.12.2014 19:31 Здравствуйте, уточните какие шаги необходимо выполнить, чтобы воспроизвести ошибку? Предоставьте необходимые доступы. Денис Викторович, 02.12.2014 19:51 вот с помощью данной ссылки: http://superobmen.org/wp-content/plugins/exchangers-monitor/tbot.php?tb=superobmen.org запускается скрипт и в результате выдает ошибку которой не должно быть. Вы, 02.12.2014 20:27 Приветствую. Прошу прощения за долгий ответ. Проблема, собственно, заключается в некорректном синтаксисе запроса к БД, как и указано в ошибке. Полагаю, для начала, Вам необходимо уточнить, по какой причине появляется данная ошибка у разработчика данного скрипта. Максим Викторович, 03.12.2014 01:51 Подскажите, а у вас вчера ни чего не происходило с MySQL, может быть версия менялась, обновлялась или ещё что либо? Вы, 03.12.2014 14:00 Нет. Скорее всего это не будет являться причиной ошибки в синтаксисе запроса к базе. Роман Игоревич, 03.12.2014 15:10 Может Вы поможете? Или подсказать что делать?
Ответить
Вам уже отвечали Мы не правим чужой код. Обратитесь к разработчику вашего плагина. В чём ошибка,вам уже сказали:некорректный синтаксис mysql Что за бред у вас в синтаксисе разобрать вообще проблемно. Куча левой ненужной ерунды. Мой вам совет,выбросить этот плагин
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.