<MyRusakov.ru />

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Фреймворк Yii 2.0 с нуля. Пример создания сайта

Видеокурс "Фреймворк Yii 2.0 с нуля. Пример создания сайта" обучит Вас созданию профессиональных сайтов с использованием фреймворка Yii. В курсе есть 2 раздела: теоретический и практический. В теоретическом разделе будут разобраны возможности фреймворка Yii с примерами их использования, а в практической части будет создан сайт Blog.MyRusakov.ru с помощью полученных знаний из теоретического раздела.

Так же почти ко всем урокам идут упражнения для закрепления материала из урока на практике.

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

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

Подписавшись по 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 Что за бред у вас в синтаксисе разобрать вообще проблемно. Куча левой ненужной ерунды. Мой вам совет,выбросить этот плагин

Ответить

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