<MyRusakov.ru />

Создание движка на PHP и MySQL 2.0

Создание движка на PHP и MySQL 2.0

Видеокурс "Создание движка на PHP и MySQL 2.0" научит Вас создавать профессиональные движки для сайтов на PHP и MySQL с использованием ООП и паттерна MVC.

В курсе разобрана вся теория по структуре движка: как всё устроено, какие должны быть объекты, какая у них иерархия и как они взаимодействуют между собой.

В практической части будет создан движок с чистого листа. Будет создано ядро, все адаптеры, все вспомогательные классы, а также классы для работы с объектами базы данных. И чтобы курс был максимально полезным, будет создан движок для сайта MyRusakov.ru.

Подробнее
Подписка

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Каким движком Вы предпочитаете пользоваться?

Не работает SQL-запрос

Не работает 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-запросах.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (38):

olegbas olegbas 14.10.2012 16:24:38

что делать?

Ответить

lev_100rus lev_100rus 31.10.2012 04:08:59

Михаил, помогите пожалуйста. Пишу вот такую функцию. <?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 отправки. НО ничего не вставляется в базу! Почему?

Ответить

Admin Admin 31.10.2012 18:42:57

Проверьте что будет если сам запрос ввести напрямую в phpmyadmin. Возможно действительно поля не добавляются, из-за какой-нибудь ошибки.

Ответить

soffrick soffrick 15.12.2012 19:27:23

«И всегда используйте функцию addslashes() для каждой переменной, участвующей в SQL-запросах.» а mysql_real_escape_string когда использловать?

Ответить

Admin Admin 15.12.2012 19:48:56

Вместо addslashes() можно использовать mysql_real_escape_string(), причём это функция более безопасная, если кодировка не UTF-8.

Ответить

soffrick soffrick 15.12.2012 20:49:47

Она по-моему экранирует только двойные и одинарные кавычки

Ответить

Admin Admin 15.12.2012 20:53:22

Ещё обратный слэш. Этого достаточно, чтобы захватить все спецсимволы.

Ответить

soffrick soffrick 15.12.2012 21:08:35

ясно, спасибо! :)

Ответить

kopaem kopaem 26.12.2012 21:45:41

Доброго времени суток,в меня такой вопрос,а что нужно писать в файле где сохраняються нустройки к базе данных редакторо tinyMCE.Дайте мне код

Ответить

kopaem kopaem 26.12.2012 22:20:53

В меня токай еще вопрос.а Вы не знаете где можно скачать редактор который сможет конвертировать музыку или видео по качеству и по расшерению екрана?

Ответить

Admin Admin 27.12.2012 04:15:32

Есть ffmpeg: http://myrusakov.ru/php-ffmpeg.html Для аудио надо поискать что-то аналогичное.

Ответить

Silver78 Silver78 13.01.2013 08:07:59

Так а как же делать? Имеем: addslashes() и htmlspecialchars() Надо пропускать вводимые пользователем данные через обе эти функции или через одну из них? Если через обе, то имеет ли значение в какой последовательности? Можно чуточку поподробнее об этом? &&& еще и про stripslashes() начитал тут вдобавок :)

Ответить

Admin Admin 13.01.2013 11:15:01

Надо через обе, сначала через htmlspecialchars(), потом через addslashes().

Ответить

Silver78 Silver78 13.01.2013 14:04:55

то есть надо просто таким образом обрабатывать данные? $text_comment = $_POST["text_comment"]; $text_comment = htmlspecialchars($text_comment); $text_comment = addslashes($text_comment); и дальше уже вставлять $text_comment в SQL запрос??? и все?

Ответить

Admin Admin 13.01.2013 19:44:11

Да.

Ответить

Silver78 Silver78 13.01.2013 15:59:42

Михаил, при вводе, например: "GHJDTHRF" в поле для комментариев и отправке на сайт, выводит потом \"GHJDTHRF\" в самиз комментах. А вото так не нужно. Скажи, пожалуйста, как подрихтовать? :)

Ответить

Admin Admin 13.01.2013 19:43:42

Если выводить из базы, то такого никогда не будет. Выводите из базы, а не берите откуда-то ещё.

Ответить

Silver78 Silver78 14.01.2013 12:50:29

хм... да в том то и дело, что из базы как раз и вывожу! :) вот так в базе хранится: \&quot;GHJDTHRF\&quot;

Ответить

Admin Admin 14.01.2013 13:34:36

Значит, нарушаете порядок вызова функций. Не может добавляться слэш к & через addslashes(). А у Вас он почему-то находится. И ещё добавьте в .htaccess magic_quotes_qpc off magic_quotes_runtime off magic_quotes_sybase off Возможно, дело в этом.

Ответить

Silver78 Silver78 14.01.2013 14:33:34

добавил и все сломалось совсем :) ошибку 500 выдает! .htaccess стал таким: AddDefaultCharset UTF-8 magic_quotes_qpc off magic_quotes_runtime off magic_quotes_sybase off после каждой строчки не надо добавлять ник4аких разделительных знаков?

Ответить

Admin Admin 14.01.2013 19:13:54

Просто вот так напишите и всё: php_value magic_quotes_gpc 0

Ответить

Silver78 Silver78 13.01.2013 16:44:05

А нужно пропускать через эти функции, например, название фотографии, которую пользователь размещает на сайт??? может злоумышленник всунуть каку таким образом? <вредоносный код>.jpeg

Ответить

Admin Admin 13.01.2013 19:43:56

Нет, не нужно.

Ответить

torpedko torpedko 30.05.2013 15:37:32

Михаил, хочу вывести статью в отдельном файле с подставление нужных значений. Есть форма из которой заносятся данные в базу данных под 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"]; ?> Буду очень благодарен!!

Ответить

Admin Admin 30.05.2013 18:09:42

http://myrusakov.ru/php-finderror.html

Ответить

torpedko torpedko 30.05.2013 18:23:27

честно говоря я уже пытаюсь найти ошибку уже очень долго... и прошу Вас, скажите есть здесь ошибка или нет???

Ответить

Admin Admin 30.05.2013 20:09:39

Я не вижу сразу, но я никак не могу найти ошибку, как бы этого не хотел, надо абсолютно весь код смотреть во всех файлах. Ошибка может быть, где угодно.

Ответить

torpedko torpedko 30.05.2013 22:23:01

я могу Вам на почту отправить файлы с кодом, если Вы не против.

Ответить

torpedko torpedko 31.05.2013 14:00:14

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"]; ?>

Ответить

Admin Admin 31.05.2013 19:34:39

Делайте проверку на существование $_GET["id"] через isset, а уже потом обращайтесь к этому массиву.

Ответить

torpedko torpedko 31.05.2013 20:07:24

уже пробовал. ошибки нет, но все равно информация не выводится

Ответить

Admin Admin 31.05.2013 21:37:35

Она не выводится, потому что $_GET["id"] - не существует в массиве. Возможно, из-за того, что URL с ошибкой.

Ответить

torpedko torpedko 01.06.2013 13:45:54

Михаил, после 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 

Ответить

Admin Admin 01.06.2013 19:45:20

Смысл этого замечания (а не ошибки) в том, что Вы используете непроинициализированные переменные.

Ответить

torpedko torpedko 01.06.2013 23:57:44

а кактм образом мне их проиницизировать?

Ответить

Admin Admin 02.06.2013 11:07:39

$x = 5;

Ответить

melpawa melpawa 04.12.2014 23:00:11

Не знаю, в данную ли рубрику я пишу, но проблема у меня в следующем. Есть мониторинг обменных валют. В последние дни при попытке обновить экспортный файл курсов выдает ошибку: 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 Может Вы поможете? Или подсказать что делать?

Ответить

alexandrdante alexandrdante 06.12.2014 19:36:24

Вам уже отвечали Мы не правим чужой код. Обратитесь к разработчику вашего плагина. В чём ошибка,вам уже сказали:некорректный синтаксис mysql Что за бред у вас в синтаксисе разобрать вообще проблемно. Куча левой ненужной ерунды. Мой вам совет,выбросить этот плагин

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.