RDM/2 The Russian Electronic Developer Magazine  
RDM/2 Русский электронный журнал разработчика  
ДомойОт редактораПишите намОбратная связьRU/2

PHP: Hypertext Preprocessor

Что такое PHP

PHP -- это препроцессор, позволяющий выполнять на стороне сервера специальные скрипты, встраиваемые в HTML. Простейший пример использования PHP может выглядеть следующим образом:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
  <TITLE>Sample PHP page</TITLE>
</HEAD>
<BODY>
  2 + 2 = <? echo 2+2; ?>
</BODY>
</HTML>
(посмотреть результат работы примера).

Идеология

PHP -- очень простой в освоении язык (ознакомиться с синтаксисом и начать писать что-то осмысленное можно буквально за полчаса). Синтаксис PHP похож на Си с некоторыми перловыми заморочками, например, использования точки (.) в качестве оператора сложения строк. Две вещи, к которым надо привыкнуть: (1) имена переменных начинаются со значка $, (2) по умолчанию глобальные переменные недоступны внутри функций; если вы хотите их использовать, то объявите их как GLOBAL (см. документацию).

PHP позволяет писать быстро, грязно и без особой возможности повторного использования кода -- словом, типичный скриптовый язык :) Очень часто PHP используется для работы с базами MySQL -- ещё одно простое и бесплатное решение для веб-строительства.

Установка

Готовые загружаемые модули (loadable modules) для апача можно загрузить со страницы silk.apana.org.au/php/.

Для PHP3:

  1. положите libphp3.dll в каталог libexec
  2. внесите следующие изменения в httpd.conf:
    LoadModule php3_module libexec/libphp3.dll
    ...
    AddType application/x-httpd-php3 .phtml .php3
    AddType application/x-httpd-php3-source .phps
    
Для PHP4:
  1. положите modphp4.dll в каталог libexec апача
  2. положите дополнительные модули php (curl.dll, gd.dll, mysql.dll, etc.) в какой-нибудь каталог по вкусу. Позднее надо будет прописать этот каталог в директиве extension_dir секции "Paths and Directories" файла php.ini.
  3. внесите следующие изменения в httpd.conf:
    LoadModule php4_module libexec/modphp4.dll
    ...
    AddType application/x-httpd-php .phtml .php
    AddType application/x-httpd-php-source .phps
    
Файл php.ini-dist или php.ini-optimized положите в %ETC%, переименуйте в php.ini и при необходимости подредактируйте согласно инструкции.

Примечание 1: старые версии апача (до 1.3.9) не поддерживают механизм загружаемых модулей; эти версии должны быть собраны с поддержкой PHP. Russian Apache/2 1.3.6 собран с mod_php

Примечание 2: с веб-серверами, отличными от апача, (например, Xitami) в качестве интерпретатора написанных на PHP CGI-скриптов можно использовать PHP standalone executable.

Примечание 3: кстати, особые эстеты могут использовать PHP и для системного скриптинга. Для этого надо скачать standalone executable и запускать его с ключом -q: php.exe -q script.php

Примеры использования

Пример 1: обработка форм

Text field:

Checkbox 1
Checkbox 2
Checkbox 3

Radiobutton 1
Radiobutton 2
Radiobutton 3

Отправьте форму для того, чтобы посмотреть на обработку введённых данных.

Код HTML, описывающий эту форму, показан ниже. Обратите внимание на имена чекбоксов -- они пишутся так, как будто являются элементами массива.

<FORM ACTION="form.phtml" METHOD=GET>
Text field: <INPUT TYPE=TEXT NAME="Textfield" SIZE=25 MAXLENGTH=80><P>
<INPUT TYPE=CHECKBOX NAME="Chk[1]"> Checkbox 1<BR>
<INPUT TYPE=CHECKBOX NAME="Chk[2]" CHECKED> Checkbox 2<BR>
<INPUT TYPE=CHECKBOX NAME="Chk[3]"> Checkbox 3<P>
<INPUT TYPE=RADIO NAME="Radio" VALUE="1" CHECKED> Radiobutton 1<BR>
<INPUT TYPE=RADIO NAME="Radio" VALUE="2"> Radiobutton 2<BR>
<INPUT TYPE=RADIO NAME="Radio" VALUE="3"> Radiobutton 3<P>
<SELECT NAME="Selection" SIZE=1>
	<OPTION VALUE="1">Menu string 1</OPTION>
	<OPTION VALUE="2">Menu string 2</OPTION>
	<OPTION VALUE="3">Menu string 3</OPTION>
</SELECT><P>
<INPUT TYPE=SUBMIT VALUE="Отправить форму">
</FORM>
Пример 2: работа с MySQL

Подробное описание функций для работы с MySQL можно найти в PHP Manual: MySQL functions. Здесь я приведу только скелет, который выглядит примерно так: открыть соединение с MySQL, сделать один или несколько запросов, закрыть соединение:

$db = @mysql_connect( $host, $user, $password ) or die( "У нас упал MySQL");
mysql_select_db( "имя_базы", $db );
mysql_query( "некий SQL-запрос", $db );
mysql_close( $db );
Вместо функции mysql_connect() можно использовать mysql_pconnect(), которая открывает постоянное соединение (persistent connection) с MySQL либо использует уже открытое соединение. Это снижает нагрузку на MySQL.

Обработку результатов селекта можно проводить по следующей схеме:

$sqls = "SELECT field_1, field_2 ... field_n FROM SomeTable";
$res = mysql_query( $sqls, $db );
$n = mysql_num_rows($res);
for ($i=0; $i<$n; $i++) {
   list( $field_1, $field_2 ... $field_n ) = mysql_fetch_row($res);
   do_something( $field_1, $field_2 );
}
mysql_free_result($res);
либо:
$sqls = "SELECT field_1, field_2 ... field_n FROM SomeTable";
$res = mysql_query( $sqls, $db );
while ( $row = mysql_fetch_array($res) ) {
   do_something( $row[0], $row[1] );
}
mysql_free_result($res);
Чуть менее схематичный и работающий пример с комментариями можно посмотреть здесь.
Комментарий Euxx'a: "А вот теперь стоило бы рассказать, как избавляться от уродских сообщений об ошибках MySQL в середине страницы... Этим страдают все решения на php, что я видел живьем. И привести хоть какие-то советы о том, какие меры стоит предпринимать, если приходится бисать более-менее большие приблуды... В этом случае "or die" точно в лес идет..."
Euxx, который терпеть не может PHP, несколько преувеличивает масштабы бедствия. "Этим" страдают не все решения на PHP, а только криво написанные. Которые, действительно, постыдно грохаются с выдачей сообщения типа "Warning: MySQL Connection Failed: Can't connect to MySQL server on '127.0.0.1' (61) in /path/script.php on line 1234". Я обычно поступаю следующим образом:
<?
   $ok = 1;
   // тут идёт какое-то обращение к базе
   // вывод сообщений об ошибках запрещён
   @mysql_connect(...)
   @mysql_query(...)
   @mysql_close(...)
   // если не всё нормально -- сбрасываем флажок $ok
   $ok = 0;
   // кончился PHP-шный код, пошёл HTML
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
  <TITLE>Некая страница</TITLE>
</HEAD>
<BODY>
<?
   if ($ok) {
      // выводим то, что хотели вывести
   }  else {
      echo "Извините, сбой базы";
   }
?>
</BODY>
</HTML>
При этом "or die", действительно, идёт в лес.

Ссылки по теме

php.net
Официальный сайт PHP
php.net/docs.php
Документация по PHP. Я рекомендую сразу скачать мануал в формате HTML и разместить его на локальном сервере... на php.net не налазаешься
silk.apana.org.au/php
PHP for OS/2. На эту страницу Brian Havard выкладывает готовые модули для OS/2
"Букварь по PHP и MySQL"
Очень неплохое описание для начинающего в формате PDF, 567k
phpclub.unet.ru
Клуб разработчиков PHP
php.spb.ru
PHP по-русски
www.phpbuilder.com
PHPBuilder.com - The Resource For PHP Developers
Очень приятный сайт с большим количеством статей и примеров использования PHP
www.faqts.com
Сборник FAQ, в том числе и по PHP
www.hotscripts.com/category/scripts/php/
Большая коллекция готовых скриптов на PHP
Dmitry Ban

---
Интересные ссылки:

---

---
Комментариев к странице: 0 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов
(C) Russian Underground/2