PHP. Основы веб-программирования

Distructor
Администратор
Что такое веб-программирование
  • Если вы уже пробовали (а может быть, даже и небезуспешно :)) программировать, например, на Delphi, или Visual Basic, или даже Visual C++, то привыкли к такой схеме работы программы: нажимается кнопочка - выполняется код - выводится результат, и все это выполняется на одном компьютере.

    В веб-программировании все обстоит по-другому.

    Вы задумывались, что происходит, когда вы вводите в адресной строке браузера URL? Cхема работы следующая:
    • Браузер открывает соединение с сервером
      Браузер отправляет серверу запрос на получение страницы
      Сервер формирует ответ (чаще всего - HTML-код) браузеру и закрывает соединение
      Браузер обрабатывает HTML-код и отображает страницу
    Обратите внимание: еще до того, как вы увидели на экране запрошенную страницу, соединение с сервером закрыто, и он о вас забыл. И когда вы введете другой (или тот же самый) адрес, или щелкните по ссылке, или нажмете на кнопку HTML-формы - та же схема повторится снова.

    Такую схему работы называют "клиент-сервер". Клиент в данном случае - браузер.

    Итак, соединение с веб-сервером длится всего несколько секунд (или долей секунд) - это промежуток времени между щелчком по ссылке (или другим способом запроса) и началом отображения страницы. Большинство браузеров во время соединения отображают некий индикатор, например, MS Internet Explorer отображает анимацию в правом верхнем углу.
    Внимательный читатель здесь может заметить - а как же так, я уже читаю страницу, а индикатор все еще показывает процесс соединения? Дело в том, что тэг <img src=...> (загрузка изображения) и некоторые другие - это не более чем еще один запрос к серверу - и выполняется он точно также, как и любой другой - по той же схеме. И запрос картинки, с точки зрения сервера, полностью независим от запроса HTML-ника.

    Чтобы навсегда избавиться от восприятия HTTP как "черного ящика", "притворимся" браузером с помощью telnet'а:

    Нажмем [Ctrl]+
    и выполним команду
    telnet test.vsi.ru 80
    Введем в окне терминала следующее (если ввод не отображается - ничего страшного):

    Код: Выделить всё

    GET / HTTP/1.0 [здесь нажмем Enter] 
    Host: test.vsi.ru [здесь нажмем Enter] 
    Connection: close [здесь нажмем Enter дважды]
    Нажатие Enter соответствует, как правило, комбинации символов CR + LF, обозначаемых как \r\n. Далее будет использоваться именно это обозначение.

    По экрану пробежит HTML-код страницы http://test.vsi.ru/. Как видите - ничего сложного.
    Исходный код текущей страницы можно просмотреть практически в любом браузере, выбрав в меню "View|Source" (Вид/Исходный код в Opera; Вид/Просмотр HTML-кода в IE; Вид/Исходный код страницы в FireFox).

    Картинки, фреймы - все это дополнительные запросы, точно такие же. Собственно, откуда берутся картинки в окне браузера: при парсинге (обработке) HTML-кода, браузер, натыкаясь на тэг <img src="картинка"> осуществляет дополнительный запрос к серверу - запрос картинки, и отображает ее на месте, где стоит тэг <img...>.
HTML-формы. Методы отправки данных на сервер
  • С HTML-формами вы наверняка уже встречались:

    Код: Выделить всё

    <form method="GET" action="form_handler.php">
      Введите Ваше имя: <input type="text" name="name" value="" /><br />
      <input type="submit" name="okbutton" value="OK" />
    </form>
    Сохранив данный код в HTML-файле и просмотрев его с помощью вашего любимого браузера, вы увидите привычную HTML-форму.
    Рассмотрим используемые в этом небольшом примере тэги подробнее
    Тэг <form>, имеющий парный завершающий тэг </form>, собственно и задает форму. Его атрибуты - оба необязательные:
    • action - указывает URL (полный или относительный), на который будет отправлена форма. Отправка формы - это такой же запрос к серверу, как и все остальные (как я уже описал выше). Если этот атрибут не указать - форма отправляется на текущий документ, то есть "сама на себя".
      method - способ отправки формы. Их два.
      • GET - отправка данных формы в адресной строке. Вы могли заметить на различных сайтах присутствие в конце URL символа "?" и следующих за ним данных в формате параметр=значение. Здесь "параметр" соответствует значению атрибута name элементов формы (см. ниже про тэг <input>), а "значение" - содержимому атрибута value этого же элемента. Для примера - попробуйте поискать что-нибудь в Яндексе и обратите внимание на адресную строку браузера. Это и есть способ GET.
        POST - данные формы отправляются в теле запроса. Если не совсем понятно (или совсем непонятно), что это такое - не беспокойтесь, скоро мы к этому вопросу вернемся.
      Если атрибут method не указан - подразумевается "GET".
    Тэг <input> - задает элемент формы, определяемый атрибутом type:
    • Значение "text" задает однострочное текстовое поле ввода.
      Значение "submit" задает кнопку, при нажатии которой происходит отправка формы на сервер.
    Итак, что же происходит, когда мы нажимаем кнопку "OK"?
    • 1. Браузер просматривает входящие в форму элементы и формирует из их атрибутов name и value данные формы. Допустим, введено имя Vasya. В этом случае данные формы - name=Vasya&okbutton=OK
      2. Браузер устанавливает соединение с сервером, отправляет на сервер запрос документа, указанного в атрибуте action тэга <form>, используя метод отправки данных, указанный в атрибуте method (в данном случае - GET), передавая в запросе данные формы.
      3. Сервер анализирует полученный запрос, формирует ответ, отправляет его браузеру и закрывает соединение
      4. Браузер отображает полученный от сервера документ
    Отправка того же запроса вручную (с помошью telnet) выглядит следующим образом (предположим, что доменное имя сайта - http://example.com):

    Код: Выделить всё

    telnet example.com 80 
    GET /form_handler.php?name=Vasya&okbutton=OK HTTP/1.0\r\n
    Host: example.com\r\n
    Connection: close\r\n
    \r\n
    Как вы, скорее всего, уже догадались, нажатие submit-кнопки в форме с методом отправки "GET" аналогично вводу соответствующего URL (со знаком вопроса и данными формы в конце) в адресной строке браузера:

    Код: Выделить всё

    http://www.example.com/form_handler.php?name=Vasya&okbutton=OK 
    На самом деле, метод GET используется всегда, когда вы запрашиваете с сервера какой-либо документ, просто введя его URL, или щелкнув по ссылке. При использовании <form method="GET" ... >, к URL просто добавляются знак вопроса и данные формы.

    Возможно, все эти технические подробности и упражнения с telnet-ом кажутся вам невероятно скучными и даже ненужными ("а при чем тут PHP?"). А зря. :) Это основы работы по протоколу HTTP, которые необходимо знать назубок каждому Web-программисту, и это не бесполезные теоретические знания - все это пригодится в ежедневной практике.

    Теперь заменим первую строку нашей формы на следующую:

    Код: Выделить всё

    <form method="POST" action="form_handler.php">
    Мы указали метод отправки "POST". В этом случае данные отправляются на сервер несколько другим способом:
    telnet example.com 80

    Код: Выделить всё

    POST /form_handler.php HTTP/1.0\r\n
    Host: example.com\r\n  
    Content-Length: 22\r\n
    Connection: close\r\n
    \r\n
    name=Vasya&okbutton=OK
    При использовании метода POST данные формы отправляются уже после "двух Enter-ов" - в теле запроса. Все, что выше - на самом деле заголовок запроса (и когда мы использовали метод GET, данные формы отправлялись в заголовке). Для того, чтобы сервер знал, на каком байте закончить чтение тела запроса, в заголовке присутствует строка Content-Length. Преимущество метода POST - отсутствие ограничения на длину строки с данными формы.

    При использовании метода POST невозможно отправить форму, просто "зайдя по ссылке", как было с GET.

    Для краткости изложения, введем термины "GET-форма" и "POST-форма", где префикс соответствует значению атрибута method тэга <form>.
    При использовании POST-формы, в ее атрибуте action можно указать после знака вопроса и параметры GET-формы. Таким образом, метод POST включает в себя и метод GET.
PHP: Препроцессор Гипертекста
  • В предыдущей главе мы с вами разобрались, как создать HTML-форму, и как браузер отправляет введенные в нее данные на сервер. Но пока что непонятно, что будет сервер делать с этими данными.

    Сам по себе веб-сервер умеет просто отдавать запрошенную страницу, и ничего более того, и ему все переданные данные формы, в общем-то, совершенно безразличны. Для того, чтобы можно было обработать эти данные и динамически сформировать ответ браузеру, используется PHP.

    Взглянем на этот URL: http://example.com/form_handler.php. Первое предположение, которое можно сделать на его счет, обычно такое: сервер отдает содержимое файла form_handler.php. Однако, в случае с PHP дело обстоит по-другому. Сервер запускает php-скрипт form_handler.php и передает ему данные формы. Скрипт же формирует текст, который передается браузеру в качестве ответа на запрос.

    Перед тем как рассмотреть скрипт form_handler.php давайте сначала разберемся, как происходит обмен данными между ним и веб-сервером.

    Перед запуском php-скрипта, веб-сервер устанавливает переменные окружения. PHP считывает их и записывает их значения в свои суперглобальные переменные (подробнее они рассмотрены в теме Суперглобальные переменные PHP). Затем начинает выполняться код скрипта form_handler.php, который и формирует страницу и отдает ее веб-серверу, который передает ее браузеру.

    Стоит уточнить, что никакой РНР код в браузер не попадает (это важно!) Это значит, что увидеть исходный код PHP скрипта невозможно.

    Теперь давайте посмотрим на простой PHP-скрипт. Напомню нашу HTML-форму из предыдущего раздела:

    Код: Выделить всё

    <form method="POST" action="form_handler.php">
      Введите Ваше имя: <input type="text" name="name" value="" /><br />
      <input type="submit" name="okbutton" value="OK" />
    </form>
    А теперь - form_handler.php:

    Код: Выделить всё

    <html>
    <body>
    <?php  echo "<h1>Привет, <b>" . $_POST['name'] . "</b></h1>!";  ?>
    </body>
    </html>
    
    В отличие от Си или Perl, php-скрипт представляет собой обычную, в общем-то, HTML-страницу: "просто так" написанные тэги передаются "как есть", будто бы это обычный html-ник. Сам скрипт заключается в специальные тэги <?php и ?>, внутри которых мы используем для вывода текста оператор echo. Таких блоков может быть сколько угодно, все, что между ними, интерпретируется как обычный html.

    Переменные GET-запроса попадают в массив $_GET, переменные POST-запроса - в массив $_POST, оператор "точка" (.) - объединение строк.

    Далее. Зачем нам два файла - HTML с формой и PHP-скрипт? Вполне достаточно одного скрипта:

    Код: Выделить всё

    <html>
    <body>
    <?php
      if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        echo "<h1>Привет, <b>" . $_POST['name'] . "</b></h1>!";
      }
    ?>
    <form method="POST" action="">
      Введите Ваше имя: <input type="text" name="name" value="" /><br />
      <input type="submit" name="okbutton" value="OK" />
    </form>
    </body>
    </html>
    Мы очистили у тэга form атрибут action - это значит, что форма отправляется "сама на себя", т.е. на текущий URL. Это иногда называют "postback form". В строке 4 с помощью оператора if проверяется, использовался ли для загрузки документа метод POST, и - если это так - в следующей строке выводится приветствие.
ОЧЕНЬ ВАЖНОЕ ЗАМЕЧАНИЕ
  • Из того факта, что PHP исполняется на сервере, и посылает результат своей работы браузеру, следует один простой, но очень важный вывод. Что PHP, в принципе, НЕ МОЖЕТ отобразить в браузере ничего такого, что невозможно было бы сделать средствами html.
    ПРЕЖДЕ, чем что-то писать на PHP - попробуйте это сделать чистым HTML.
    "Нажатие на Энтер" не переводит строку? А в html вы не пробовали таким образом строки переводить? Не получилось? Какая досада. Прочитайте, как в html сделать перевод строки и приходите снова.

    PHP в результате своей работы формирует не картинку с текстами, как вы ее видите на экране монитора! PHP формирует HTML код! И этот код ЗНАЧИТЕЛЬНО отличается от того изображения, которое вы видите на экране. Если у вас что-то не получается, то надо всегда смотреть именно ИСХОДНЫЙ код страницы, а не то, как вам ее рисует браузер (Вид/Исходный код в Opera; Вид/Просмотр HTML-кода в IE; Вид/Исходный код страницы в FireFox).
    Если у вас не работает яваскрипт, сформированный PHP скриптом, или html показывает не то, что вы хотите, то исправить эту проблему очень просто:
    • 1. Сначала пишете нужный яваскрипт или html руками. Если у вас с этим проблемы - обратитесь в соотвествующий форум - по яваскрипту или html. PHP тут не при чём.
      2. Сравниваете с тем, что получено из PHP
      3. Вносите исправления в PHP скрипт, чтобы текст, отдаваемый им, не отличался от написанного руками.
    Браузер не умеет показывать файлы, в которые напихан одновременно и html картинки. Браузер умеет показывать только известные ему типы данных. В частности, это ИЛИ html ИЛИ картинка. Но не вместе. Если картинка - то ОДНА. Несколько картинок подряд браузер показывать не умеет. Браузер умеет показывать HTML, в котором прописаны ССЫЛКИ на несколько картинок.
    Пожалуйста, прежде, чем изучать PHP - изучите хотя бы основы HTML! Прежде, чем что-то требовать от PHP - попробуйте сделать это на html.
На этом заканчиваем вводную лекцию. Для более глубокого изучения почитайте книжки по HTML, CSS, JavaScript и PHP (именно в таком порядке).

Удачи ;)

Основано на статьях http://www.phpwiki.ru/Основы_веб-программирования и http://phpfaq.ru/na_tanke
Вернуться к началу