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

Аватара пользователя
Distructor
Администратор
Сообщения: 1600
Зарегистрирован: 28 дек 2009
Что такое веб-программирование

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

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

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

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

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

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

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

    Нажмем [Ctrl]+[R] и выполним команду
    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

Вернуться в «PHP»