Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Epic PHP #3

101b5adab18a468a3dfe63f77980ccb9?s=47 Roma
March 03, 2014

Epic PHP #3

Слайды к третьему занятию курса Epic PHP (http://epixx.ru/epic-php/).
Темы: web features, формы, cookie, сессии, CLI, Git

101b5adab18a468a3dfe63f77980ccb9?s=128

Roma

March 03, 2014
Tweet

Transcript

  1. Epic PHP #3 Рома Лапин, Evercode Lab

  2. Web Features

  3. Predefined Variables Каждый выполняемый скрипт PHP снабжает целой пачкой предопределенных

    переменных с разной информацией. Их набор и значения зависят от запроса, настроек и конфигурации сервера и других факторов. Часть из этих переменных недоступна при выполнении в CLI.
  4. Superglobals Встроенные переменные PHP, которые всегда видны в любой области

    видимости.
  5. Superglobals • $GLOBALS • $_SERVER • $_GET • $_POST •

    $_FILES
  6. Superglobals • $_REQUEST — не используйте его! • $_SESSION •

    $_ENV • $_COOKIE
  7. Задание В последнем написанном вами скрипте сделайте var_dump() суперглобальных переменных

    и посмотрите, что в них находится.
  8. Сказка про register_globals

  9. Сказка про register_globals

  10. Сказка про register_globals В темные времена $_GET['foo'] могло быть доступно

    в скрипте как $foo. И $_POST[‘foo’] тоже. ! Надо объяснять, почему это плохо? ! Если PHP < 5.4.0 убедитесь, что в php.ini: register_globals = off
  11. Семантика HTTP HTTP — протокол описывающий взаимодействие между двумя компьютерами

    (клиентом и сервером), построенное на базе сообщений, называемых запрос (Request) и ответ (Response). Каждое сообщение состоит из трех частей: стартовая строка, заголовки и тело. При этом обязательной является только стартовая строка.
  12. Семантика HTTP Стартовая строка: ! METHOD URI HTTP/VERSION, ! где

    METHOD — это как раз метод HTTP-запроса, URI — идентификатор ресурса, VERSION — версия протокола (на данный момент актуальна версия 1.1).
  13. Семантика HTTP • GET — дай • POST — создай

    • PUT — обнови • DELETE — удали
  14. Формы Обработка форм — одна из наиболее сильных сторон PHP.

    При этом, конечно, не лишенная нюансов. ! Каждый элемент формы будет автоматически доступен в вашем PHP скрипте.
  15. Формы <form action="foo.php" method="post"> Name: <input type="text" name="username" /><br />

    Email: <input type="text" name="email" /><br /> <input type="submit" name="submit" value="Submit me!" /> </form>
  16. Формы <?php ! echo $_POST['username']; echo $_POST['email'];

  17. Формы • action — пункт назначения • method — get

    или post • get — фильтрация, получение данных, значения в $_GET • post — изменение, отправка, значения в $_POST
  18. Формы Точки и пробелы в названиях переменных будут сконвертированы в

    символ подчеркивания. ! Например, <input name="a.b" /> попадет в $_GET["a_b"].
  19. Формы и массивы <form action="" method="post"> Name: <input type="text" name="personal[name]"

    /><br /> Email: <input type="text" name="personal[email]" /><br /> Beer: <br /> <select multiple name="beer[]"> <option value="warthog">Warthog</option> <option value="guinness">Guinness</option> <option value="stuttgarter">Stuttgarter Schwabenbräu</option> </select><br /> <input type="submit" value="submit me!" /> </form>
  20. Формы и массивы <?php if ($_POST) { echo '<pre>'; echo

    htmlspecialchars(print_r($_POST, true)); echo '</pre>'; }
  21. Задание Создадим праобраз простого блога. ! Поля поста: название, дата,

    тело сообщения, slug. Храним посты в массиве (заведите для примера 2-3). ! Массив выводим на страницу.
  22. Задание Форма создания поста: название и тело сообщения. Отправляется через

    post на тот же скрипт. Пост дописывается в массив и выводится с остальными. Да, он пока что не сохранится :) ! Форма поиска постов: строковое поле. Отправляется через get. Ищет посты по вхождению строки в название или тело сообщения.
  23. Формы. Файлы <input type="hidden" name="MAX_FILE_SIZE" value="4194304" /> ! <input type="file"

    name="logo" /> ! MAX_FILE_SIZE — после достижения этого значения PHP перестанет получать данные файла. Ошибка будет присутсвовать только в массиве $_FILES. Доверять этой настройке нельзя.
  24. Формы. Файлы • enctype=”multipart/form-data” — для отправки файлов • ini

    директивы • post_max_size • max_input_time • upload_max_filesize
  25. Формы. Файлы • $_FILES[] • $_FILES['name'] • $_FILES['type'] • $_FILES['size']

    • $_FILES['tmp_name'] • $_FILES['error']
  26. Формы. Файлы <?php $uploaddir = __DIR__; $uploadfile = $uploaddir .

    DIRECTORY_SEPARATOR . basename($_FILES['userfile']['name']); ! if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully uploaded.\n"; } else { echo "Possible file upload attack!\n"; }
  27. Задание Добавить к нашему праобразу блога загрузку картинки к посту.

  28. Формы Значения по умолчанию ! <input type="text" name="username" value=”jack” />

    ! Подстановка значений ! <?php $username = htmlspecialchars($_GET[‘username’]); ?> <input type="text" name="username" value=”<?=$username ?>” />
  29. Cookies

  30. Cookies Небольшой фрагмент данных, отправленный веб- сервером и хранимый на

    компьютере пользователя. ! Используется для отслеживания пользователей и передачи информации между запросами к серверу.
  31. setcookie() bool setcookie ( string $name [, string $value [,

    int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] ) ! Печеньки передаются как часть заголовков запроса. Поэтому они должны задаваться до любого вывода в браузер.
  32. setcookie() <?php if (isset($_COOKIE['count'])) { $count = $_COOKIE['count'] + 1;

    } else { $count = 1; } setcookie('count', $count, time() + 3600); echo $count;
  33. setcookie() Можно передавать и массивы ! <?php setcookie('card[one]', $item, time()

    + 3600); setcookie('card[two]', $item2, time() + 3600);
  34. $_COOKIE Суперглобальный массив всех печенек. ! Заданные через setcookie значения

    попадают в $_COOKIE только на следующий запрос.
  35. Cookies • Хранится на клиентской стороне (браузер) • Значения должны

    быть скалярными • Можно задавать через header() как любой другой заголовок • Значения с одинаковыми именами перезаписываются
  36. Задание В нашем праобразе блога с помощью cookie добавьте ограничение:

    пользователю нельзя отправлять сообщение чаще чем раз в 2 минуты. Если он пытается это сделать, надо выводить ему ошибку.
  37. Sessions Еще один способ осуществить связь между запросами к серверу.

    ! В отличии от Cookie данные хранятся на сервере, а их принадлежность пользователю определяется по уникальному id, который либо передается через Cookie, либо через параметра url.
  38. $_SESSION Суперглобальный массив, содержащий данные сессии текущего пользователя.

  39. Sessions <?php session_start(); if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; }

    else { $_SESSION['count']++; } echo $_SESSION[‘count’];
  40. Sessions • Сессии надо стартовать • session_start() • session.auto_start =

    1 • Сессии хранятся на сервере • session.save_handler — как • session.save_path — где
  41. Sessions • session_id() • session_name() • session_regenerate_id()

  42. Задание Добавьте к праобразу блога счетчик, сколько раз данный пользователь

    заходил на страницу, и выведите его на страницу. ! Добавьте ссылку «сбросить счетчик» и соответствующий код в скрипт.
  43. Заголовки В PHP есть возможность управлять не только телом ответа,

    т.е. содержимым страниц или файлов, но и заголовками. ! void header ( string $string [, bool $replace = true [, int $http_response_code ]] )
  44. Заголовки Редирект ! header(“Location: http://epixx.ru“);

  45. Заголовки Тип данных ! <?php // Будем передавать PDF header('Content-type:

    application/pdf'); ! // Который будет называться downloaded.pdf header('Content-Disposition: attachment; filename="downloaded.pdf"'); ! // Исходный PDF файл original.pdf readfile('original.pdf');
  46. CLI

  47. Что нужно знать, чтобы выжить на сервере, или как впечатлить

    друзей и знакомых
  48. Жизненное • Умение не отрывать руки от клавиаутры и не

    пользоваться мышью повышает шансы на успех на 146% • Изучайте hotkeys • Когда-то файлы на сервер заливали через FTP • Но чем дальше в лес, тем больше git и ssh. Deal with it!
  49. CLI? WTF? • Command Line Interface • Это вам не

    окошки перетаскивать и мышкой щелкать • Linux – есть везде • Mac – Terminal, iTerm • Windows – CygWin
  50. None
  51. Ориентация в пространстве

  52. Ориентация в пространстве • pwd — Где я, черт подери?

  53. Ориентация в пространстве • pwd — Где я, черт подери?

    • ls — Кто эти люди вокруг?
  54. Ориентация в пространстве • pwd — Где я, черт подери?

    • ls — Кто эти люди вокруг? • ls -al — Кто эти люди и кто там еще прячется?
  55. Ориентация в пространстве • pwd — Где я, черт подери?

    • ls — Кто эти люди вокруг? • ls -al — Кто эти люди и кто там еще прячется? • cd — Валим!
  56. Ориентация в пространстве • pwd — Где я, черт подери?

    • ls — Кто эти люди вокруг? • ls -al — Кто эти люди и кто там еще прячется? • cd — Валим! • Найдите папку xampp и файл php (php.exe)
  57. Ориентация в пространстве 2 • locate — Где моя тачка,

    чувак? • which — А ты с какого района? • tree — Зри в корень!
  58. PHP? • php -h — Бэн, это Данила. Ай нид

    хелп! • php -v — А ты кто по жизни? • php -i — А, если в карманах посмотрю? • php --ini — Скажи мне, кто твои друзья?
  59. PHP? • php -S localhost:8000 -t web • php -r

    'echo "hello\n";' • php test.php
  60. Ну, что еще? • mkdir — создание каталога • touch

    — создание пустого файла • ssh login@domainorip.com — попасть на сервер
  61. Ну, что еще? • wget • curl • cat •

    less • more • nano
  62. Хотите всех напугать?

  63. Хотите всех напугать? И задавить понтами?

  64. Хотите всех напугать? И задавить понтами? Пользуйтесь vim!

  65. None
  66. Виртуальные хосты • размещения более чем одного веб-сайта на одной

    машине • epixx.ru и epicss.ru • /etc/hosts • %SystemRoot%\system32\drivers\etc\hosts • 127.0.0.1 yoursite.dev
  67. httpd-vhosts.conf NameVirtualHost *:80 ! ! <VirtualHost *:80> .... </VirtualHost>

  68. <VirtualHost *:80> DocumentRoot "/var/www/epicphp" ServerName epicphp.dev ! <Directory "/var/www/epicphp"> ....

    </Directory>
  69. <Directory> Options Indexes FollowSymLinks Includes execCGI AllowOverride All Order allow,deny

    Allow from all
  70. GIT

  71. Система управления версиями ПО для облегчения работы с изменяющейся информацией.

    Позволяет хранить несколько версий одного и того же файла, возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое. ! (от англ. Version Control System, VCS)
  72. Как оно бывает

  73. Как оно бывает • Лена и Ян работают над одним

    проектом
  74. Как оно бывает • Лена и Ян работают над одним

    проектом • Работают каждый у себя дома
  75. Как оно бывает • Лена и Ян работают над одним

    проектом • Работают каждый у себя дома • Файлами обмениваются по почте/через мессенджер/фтп
  76. Как оно бывает • Лена и Ян работают над одним

    проектом • Работают каждый у себя дома • Файлами обмениваются по почте/через мессенджер/фтп • В один прекрасный момент им надо что- то изменить в одном и том же файле
  77. Как оно бывает • Лена и Ян работают над одним

    проектом • Работают каждый у себя дома • Файлами обмениваются по почте/через мессенджер/фтп • В один прекрасный момент им надо что- то изменить в одном и том же файле • Одновременно
  78. Как оно бывает

  79. Как оно бывает • Александр работает над небольшим проектом несколько

    дней
  80. Как оно бывает • Александр работает над небольшим проектом несколько

    дней • И вдруг понимает, что вчера случайно удалил файл, который сегодня очень нужен
  81. Как оно бывает • Александр работает над небольшим проектом несколько

    дней • И вдруг понимает, что вчера случайно удалил файл, который сегодня очень нужен • А в другом участке кода выясняется, что версия, сделанная позавчера была правильная
  82. Как оно бывает • Александр работает над небольшим проектом несколько

    дней • И вдруг понимает, что вчера случайно удалил файл, который сегодня очень нужен • А в другом участке кода выясняется, что версия, сделанная позавчера была правильная • Но ее уже нет
  83. Как оно бывает

  84. Как оно бывает • index.php

  85. Как оно бывает • index.php • index_old.php

  86. Как оно бывает • index.php • index_old.php • index_new.php

  87. Как оно бывает • index.php • index_old.php • index_new.php •

    index_new_new.php
  88. Как оно бывает • index.php • index_old.php • index_new.php •

    index_new_new.php • index_really_fucking_new_assure_you.php
  89. Как оно бывает • index.php • index_old.php • index_new.php •

    index_new_new.php • index_really_fucking_new_assure_you.php • damn.php
  90. None
  91. None
  92. None
  93. Git Распределённая система управления версиями файлов. Проект был создан Линусом

    Торвальдсом для управления разработкой ядра Linux, первая версия выпущена 7 апреля 2005 года. На сегодняшний день поддерживается Джунио Хамано.
  94. Git • http://git-scm.com/ • http://try.github.com/ • http://rogerdudler.github.io/git-guide/