<MyRusakov.ru />

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

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

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

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

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

Подробнее

Работа с cookie в PHP

Работа с cookie в PHP

Cookie - это набор данных, который создаётся Web-сервером и который отсылается при каждом обращении к серверу. Cookie хранятся в браузере пользователя. Как правило, cookie используется для: сохранения различных настроек, уникальных для пользователя, аутентификации пользователя, различной статистики и других подобных вещей. И о работе с cookie в PHP мы и поговорим в этой статье.

Начнём с простейших вещей: с записи cookie в браузер пользователя. Для этого существует функция setcookie():

<?php
  setcookie("Name", "Value");
?>

После запуска скрипта, Вы сможете посмотреть cookie. Посмотреть их можно следующим образом: либо поискать в настройках браузера, либо поискать прямо на жёстком диске, где хранятся cookie Вашего браузера, либо (самый простой способ) ввести в адресной строке: "javascript:document.cookie". Только вводите в той же вкладке, в которой Вы запускали скрипт, потому что браузеры отделяют cookie одного сайта от другого.

Теперь встаёт вопрос: "Как вывести cookie?". Выводятся они с помощью массива $_COOKIE:

<?php
  echo $_COOKIE["Name"];
?>

В результате, Вы увидите "Value". Как видите всё элементарно.

И давайте сейчас с Вами решим такую задачу: если пользователь авторизован на сайте, то поздороваться с ним, иначе вывести форму входа. Причём, если данные, введённые в форму, неправильные, то вывести соответствующее предупреждение. Реализация выглядит следующим образом:

<?php
  function showForm() {
    $string = "<form action = '".$_SERVER["SCRIPT_NAME"]."' method='post'>";
    $string .= "<label>Логин: </label>";
    $string .= "<input type = 'text' name = 'login'>";
    $string .= "<br />";
    $string .= "<label>Пароль: </label>";
    $string .= "<input type = 'password' name = 'pass'>";
    $string .= "<br />";
    $string .= "<input type = 'submit' name = 'log' value = 'Войти'>";
    $string .= "</form>";
    return $string;
  }
  function check($login, $pass) {
    if (($login == "Admin") && ($pass == md5("123456"))) return true;
    else return false;
  }
  if (isset($_POST['log'])) {
    $login = $_POST['login'];
    $pass = md5($_POST['pass']);
    if (check($login, $pass)) {
      setcookie("login", $login);
      setcookie("pass", $pass);
    }   
    else echo "Неверные данные";
  }
?>
<html>
<head>
</head>
<body>
  <?php
    $login = $_COOKIE['login'];
    $pass = $_COOKIE['pass'];
    if (check($login, $pass)) echo "Здравствуйте, $login";
    else echo showForm();
  ?>
</body>
</html>

Код достаточно прозрачный, однако, данную статью могут читать и новички, поэтому давайте этот код разберём более подробно. Вначале мы пишем две функции: одна для вывода формы входа, а вторая функция возвращает true, если данные корректны (то есть, если логин - "Admin", а пароль - "123456"), иначе возвращает false. Обратите внимание на $_SERVER["SCRIPT_NAME"]. Данная константа содержит путь к текущему файлу. То есть мы хотим, чтобы обработчик формы (значение атрибута action) был этот же файл.

Далее мы проверяем: была ли отправлена форма (существует ли переданное значение "log"). Если существует, значит, форма была отправлена и начинаем проверять полученные данные. Обратите внимание, что пароль мы пропускаем через функцию md5(), чтобы не хранить пароль в cookie в открытом виде. Используя функцию check() мы проверяем: верны ли данные. Если данные верны, то записываем их в cookie, иначе выводим строку: "Неверные данные".

Далее мы начинаем выводить HTML-теги. Обратите внимание, что мы не можем использовать функцию setcookie() после того, как вывели что-то в браузер. То есть нельзя, например, вывести HTML-теги, а потом воспользоваться функцией setcookie(), иначе возникнет ошибка. И, поверьте, её очень многие новички допускают.

После вывода HTML-тегов мы приходим к моменту, когда надо проверять cookie. Мы считываем их, а затем проверяем. Если они верные, то здороваемся с пользователем, иначе выводим форму входа.

Вот и весь скрипт, как видите, разобраться можно. Однако, он имеет один изъян, связанный с тем, что мы выводим "Неверные данные" до тега "<html>". Поэтому домашнее задание: исправить эту ошибку, чтобы не было нарушения валидности HTML-кода. Сделать это очень просто, однако, будет крайне полезно, так как Вам придётся разобраться в этом коде, а, следовательно, разобраться с тем, как работать с cookie в PHP. А использовать cookie в PHP приходится очень часто, и я постараюсь в следующих статьях закрепить Ваши знания о них.

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

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

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

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

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

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

  1. Кнопка:

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

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

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

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

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

sync.o sync.o 17.05.2011 11:53:36

Столкнулся с такой проблемой. Если за раз попытаться установить куки и тут же прочитать его, то куки будет пустым. И только если обновить страничку, браузер его подхватит. То же самое и с вышеприведенным примером. Логинишься под Админом - пустая форма. Обновляешь - "Здравствуйте, Админ".

Ответить

Admin Admin 17.05.2011 12:37:04

У cookie есть одно очень важное ограничение. Нельзя их создать и использовать на той же странице. Если брать пример в статье, то подобные вещи делаются так: добавление cookie происходит на другой странице, а затем идёт редирект на нужную (например, обратно). Тогда cookie будут считываться сразу.

Ответить

sync.o sync.o 17.05.2011 12:51:21

Большое спасибо за ответ!

Ответить

Alim_(I) Alim_(I) 18.05.2011 21:15:26

Саму регистрацию точно также делать? Только там добавить "Зарегистрироваться", и несколько полей? Тоесть PHP-код не меняется в регистрации?

Ответить

Admin Admin 18.05.2011 23:04:06

Нет, регистрация делается совсем по-другому. Сам алгоритм описан в этой статье: http://myrusakov.ru/php-regauth-user.html

Ответить

Alim_(I) Alim_(I) 18.05.2011 21:18:57

А какой скрипт нужен для того чтобы перейти на стиль php? <script type="text/php"> не получается.

Ответить

Admin Admin 18.05.2011 23:03:18

Для работы PHP нужен интерпретатор. Поэтому установите Denwer, а дальше создайте PHP-файл, в котором можно использовать PHP-код и HTML-теги. PHP-код начинается с <?php и заканчивается ?>

Ответить

top1995 top1995 28.08.2011 16:59:32

А как установить куки навсегда?

Ответить

Admin Admin 28.08.2011 17:16:40

Они по умолчанию устанавливаются и так навсегда, однако, нужно понимать, что cookie хранятся у пользователя. Поэтому если он их удалит (либо его браузер), то cookie удалятся.

Ответить

top1995 top1995 29.08.2011 02:13:02

А разве куки не удаляются после закрытия браузера пользователем???

Ответить

Admin Admin 29.08.2011 02:41:50

Если пользователь настроил браузером таким образом, то удалятся. Но по умолчанию они при закрытии не удаляются.

Ответить

top1995 top1995 29.08.2011 13:56:15

Спасибо

Ответить

ramzes ramzes 17.01.2013 15:07:05

Похоже, при вводе логина форма чувствительна к регистру. При вводе в поле "Логин" не получалось ввести Admin с большой буквы, возвращал только с маленькой и выдавал "неверные данные". Изменил в скрипте Admin на admin - заработало. Может быть проблема в настройках браузера (хотя в 2-ух разных проверил) или Денвера?

Ответить

Admin Admin 17.01.2013 15:49:53

В данном случае, да, проверка регистрозависимая. Но сделать её нерегистрозависимой очень просто, достаточно использовать функцию strtolower().

Ответить

ramzes ramzes 17.01.2013 17:42:20

Будет ли корректно сделать это в функции проверки, например так: function check($login, $pass) { if (($login == "Rama"|| strtolower($login) == "rama") && ($pass == md5("777"))) return true; else return false; Вроде работает

Ответить

Admin Admin 17.01.2013 19:57:08

Надо просто strtolower($login) == "rama", никаких $login == "Rama" || - не нужно.

Ответить

ramzes ramzes 17.01.2013 22:52:37

Перестраховался))),спасибо!

Ответить

Adrenalin Adrenalin 09.03.2013 12:55:18

Я правильно понял? Cookie хрянятся в браузере пользователя и гдето на его компе в файле? Можно эти прокл... Cookie запустить на очень долгое время? Как в контакте, например. Как это сделать

Ответить

Admin Admin 09.03.2013 20:54:19

Да, всё правильно поняли. Запустить их надолго можно, например, так: setcookie("name", $value, 0x6FFFFFFF);

Ответить

Adrenalin Adrenalin 09.03.2013 22:45:00

А как сделать так, чтобы при нажатии на Выход, удалялась не только переменная с логином и паролем, но и этот файл на его компе?

Ответить

Admin Admin 10.03.2013 11:31:29

setcookie ("name", "", time() - 3600); - как пример. Тогда cookie удалится сразу.

Ответить

TimWeber TimWeber 25.03.2013 10:40:50

Здравствуйте! Я столкнулся с необходимостью применить cookies для защиты от повторного голосования!!! Гугл внятных ответов не дал...(или я не смог понять...) Конечна защита так себе, но для такого вида вполне подходит! Я прописал каждой фотографии уникальный id и отправляю после обработки формы его в куки вот таким образом: setcookie("vote",$uniq_id,time()+9999999); Но при повторном голосование они не действуют хотя я прописываю условие в начале обработчика формы: if (isset($_COOKIE['vote'])) { echo "Вы уже голосовали!"; echo "<html><head> <meta http-equiv='Refresh' content='1; URL=photo_viewer.php?title=$title'> </head></html>"; exit(); } Подскажите пожалуйста что тут не так... Я уже просто в тупике... Ну или если есть другие варианты защиты от повторного голосования - я бы с радостью почитал! Заранее спасибо!

Ответить

Admin Admin 25.03.2013 17:43:45

Проверьте для начала, устанавливается ли cookie вообще. Выведите её значение.

Ответить

TimWeber TimWeber 25.03.2013 23:42:03

Попробовал вывести - ничего не выводит... хотя если попробовать вывести переменную $uniq_id - то выводит...

Ответить

TimWeber TimWeber 25.03.2013 23:56:49

Но если отправлять в форме несколько скрытых переменных, то $uniq_id пропадает... Может быть я не правильно написал форму??? printf ("<div id = 'preview'> <a href ='%s'> <img class='smallpics' src='%s' /> </a> <br> <p class='rate'>PR<img src='objects/%s.png' height='15px' width='90px'></p> <form action='vote_res.php' method='post' name='vv'> <p class='vote'>PR: <input name='score' type='radio' value='1'>1<input name='score' type='radio' value='2'>2<input name='score' type='radio' value='3'>3<input name='score' type='radio' value='4'>4<input name='score' type='radio' value='5' checked>5 <input id='okBut' type='image' src='objects/ok2.png' name='submit' value='V'> <input name='id' type='hidden' value='%s'> <input name='title' type='hidden' value='%s'> <input name='vote' type='hidden' value='%s'> </p> </form> </div>", $myrow ["link"], $myrow ["thumbnail"], $r, $myrow["id"], $myrow["title"], $myrow["uniq_id"]);

Ответить

Admin Admin 26.03.2013 09:42:29

cookie устанавливается только после перезагрузки страницы.

Ответить

TimWeber TimWeber 26.03.2013 10:10:40

Пробовал и после перезагрузки страницы вывести - нет результата... Может быть я допустил ошибку в отправке формы?

Ответить

Admin Admin 26.03.2013 10:19:59

В форме cookie не устанавливаются, попробуйте setcookie("var", 15); - и проверьте устанавливаются ли cookie вообще.

Ответить

TimWeber TimWeber 26.03.2013 10:23:56

Мне нужно чтобы они установились после обработки формы, т.е. форма отправляется для подсчёта голосов, а с ней отправляется $uniq_id, которая и должна во время обработки попасть в массив COOKIE через setcookies("vote", $uniq_id) но к сожалению ничего не выходит...

Ответить

Admin Admin 26.03.2013 10:25:17

setcookie(), а не setcookies().

Ответить

TimWeber TimWeber 26.03.2013 11:37:10

Всё правильно... Это здесь я допустил ошибочку! Прошу прощения!)

Ответить

Юрий В Юрий В 26.03.2013 20:01:16

а зачем вообще HTML-теги? без них работает так же как и с ними..

Ответить

Admin Admin 26.03.2013 21:06:04

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

Ответить

TimWeber TimWeber 28.03.2013 19:06:20

С добавление cookies вопрос решился, но возникла другая проблема - голосование идёт в галерее фото, и соответственно name у cookie всегда одинаковый и при добавление setcookie("vote",$uniq_id,time()+9999999) значение кУкис просто заменяется и появляется возможность голосовать за предыдущее фото... можно ли сделать что то вроде setcookie("vote" + $id,$uniq_id,time()+9999999) или добавлять к значению vote дополнительное значение чтобы не происходила замена старых cookies... Заранее спасибо за ответ!

Ответить

Admin Admin 28.03.2013 22:12:25

Зачем тогда вообще $uniq_id подставлять? Просто поставьте в cookie какой-нибудь vote=1 и всё. И если vote=1, то голосовать уже запрещено.

Ответить

TimWeber TimWeber 28.03.2013 22:27:18

Тогда за остальные фото тоже не проголосуешь... Нужно чтобы после каждой обработки формы, за каждое фото складывались уникальный cookies и повторно уже за это фото голосовать было невозможно!

Ответить

TimWeber TimWeber 28.03.2013 22:33:04

Если допустим проголосовали за фото с $uniq_id = vesna5 то vote получит такое значение и при повторном голосование сравнив vote и $uniq_id выдаст сообщение вы уже голосовали! А проголосовать за другое фото будет можно! Но при этом значение vote изменится и голосование за предыдущее фото снова станет возможным... А этого нельзя допускать! Как мне сделать чтобы vote получало каждый раз новое имя типа vote1, vote2 и т.д. Заранее спасибо за ответ!

Ответить

dima.alekseev.25@mail.ru dima.alekseev.25@mail.ru 20.04.2013 17:43:46

Не могу вывести cookie на странице <?php echo $_COOKIE['name'] ?> пишет: Undefined index: name в браузере кука присутствует что делать?

Ответить

Admin Admin 20.04.2013 21:51:25

cookie выводится этим скриптом?

Ответить

dima.alekseev.25@mail.ru dima.alekseev.25@mail.ru 21.04.2013 08:37:47

да

Ответить

Admin Admin 21.04.2013 19:04:36

При установке cookie указывайте ещё домен сайта (4-й параметр в setcookie()).

Ответить

svkpro svkpro 10.09.2013 10:50:21

Здравствуйте, Михаил. у меня возникла проблема следующего содержания: есть xml из которого я получаю номер заказа, и хочу создать куки с именем номер заказа и не получается ((( может подскажете?) code: preg_match("/<PersonalAccount>(.*)<\/PersonalAccount>/i", $_POST['XML'], $matches); foreach($matches as $key=>$val){ $n_order = $val; } $mame_cookie = $$n_order; setcookie($mame_cookie, "1", time()+1200); echo '<?xml version="1.0" encoding="windows-1251"?> <ServiceProvider_Response> <TransactionStart> <ServiceProvider_TrxId>xxx</ServiceProvider_TrxId> <Info xml:space="preserve"> <InfoLine>Оплачено!</InfoLine> <InfoLine>' . $_COOKIE["$mame_cookie"] . '</InfoLine> </Info> </TransactionStart> </ServiceProvider_Response>';

Ответить

Admin Admin 10.09.2013 11:15:46

А что именно не получилось? Регулярное выражение не срабатывает, или куки не выставились?

Ответить

svkpro svkpro 10.09.2013 11:21:36

куки не выставились. дело в том, что если я создаю куки с переменными которым задаю значения я сам,все работает, а когда пытаюсь впихнуть значение полученное из xml, не работает( я проверял тип полученой переменной - это просто строка то есть все должно работать но не работает...почему??? не понятно

Ответить

Лапыряев Лапыряев 14.03.2014 21:07:53

Здравствуйте, Михаил. У меня на сайте есть главный файл index.php и папка class, в ней лежат классы. Я создал класс для авторизации и подключаю его в главном файле с помощью require_once. Сначала, когда я вставил ваш код, появилась ошибка: Cannot modify header information - headers already sent by. Поискав в интернете, я понял, в чём заключалась моя ошибка. Там написано, что надо поставить сохранить без BOM. Так вот появилась другая проблема: У меня теперь все символы на сайте в русском языке отображаются какими-то странными символами, то есть проблема с кодировкой, а когда я ставлю как было: кодировать в utf-8, опять появляется проблема с заголовками. Не подскажите, что делать? Я пробовал изменить это и в теге <head> и много чего ещё, но проблема осталась

Ответить

alexandrdante alexandrdante 14.03.2014 21:18:08

а вы сначала нажмите Преобразовать в UTF-8 без BOM,а потом уже сохранить =)

Ответить

Лапыряев Лапыряев 14.03.2014 21:29:28

А то есть вы думаете, что я не сохраняю!? Нет, я сохраняю!

Ответить

alexandrdante alexandrdante 14.03.2014 21:35:21

Я думаю,что Вы не нажимаете Преобразовать в UTF-8 без BOM используя Notepad++ вкладка Кодировки =) и в meta charset потом не меняете кодировку на utf-8 =) такие вот пироги,уважаемый

Ответить

Лапыряев Лапыряев 14.03.2014 21:52:52

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - она у меня и раньше так и была! А пироги, я надеюсь, яблочные, мои любимые?

Ответить

alexandrdante alexandrdante 14.03.2014 23:02:41

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

Ответить

Лапыряев Лапыряев 01.05.2014 18:11:24

Все, получилось. Оказывается, в файле .htaccess нужно было добавить строку: AddDefaultCharset UTF-8

Ответить

vgrigoriev vgrigoriev 14.04.2014 03:04:33

Михаил, здравствуйте! А как сделать кнопку выхода в данном скрипте?

Ответить

tikkiwiki tikkiwiki 13.05.2014 11:00:04

Вы имеете ввиду закрыть сессию? Сессия закрывается с помощью session_destroy();

Ответить

sergej71sergej71 sergej71sergej71 17.06.2014 14:34:58

Здравствуйте! В приведенном Вами Коде $_COOKIE устанавливаются только после повторного вызова формы. Сумел это исправить только заменив setcookie("login", $login); setcookie("pass", $pass); на $_COOKIE['login'] = $login; $_COOKIE['pass'] = $pass; Как бы Вы это объяснили. Спасибо.

Ответить

asffix asffix 08.08.2014 06:23:32

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

Ответить

maqsat maqsat 13.06.2015 22:20:10

<h1>Домашнее задание решено </h1> - дело в кадировке

Ответить

asoftgame asoftgame 31.07.2015 00:14:15

Михаил такая проблема форму сделал обработчик тоже я использовал ваш код но вот проблема на странице отображается только форма и по вводу данных она возвращается несколько раз обратно к форме после чего, выдаёт ошибку 404(думаю все знают). Как исправить сей конфуз?

Ответить

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