Перевод выполнен Юрием Плетневым, все замечания, предложения по качеству перевода направляйте ему :-) Для некоторых терминов ни стилусу, ни автору не удалось подобрать эквивалента, такие термины оставлялись либо в английском варианте, либо транслитерировались. По поводу перевода автор цитирует комментарий к оригинальному документу:
" Документация - как секс: если она хороша, то это очень, очень хорошо; а если она плоха, то это лучше чем ничего. "
Дик Брэндон
PHP начал жизнь как простая небольшая cgi оболочка, написанная на Perl. Я написал это в полдне в течение периода между контрактами, когда я нуждался в быстром инструменте, чтобы понять того, кто читал мое интерактивное резюме. Никогда не было предназначено идти вне моего собственного частного использования. Станция сети, где я имел мое резюме, была чрезвычайно перегружена и имела постоянные проблемы с "форканьем" процессов. Я переписал Perl оболочку на C, чтобы избавиться от значительных непроизводительных затрат из-за необходимости запуска Perl, при каждом обращении к моему резюме.
В конечном счете другие люди на том же самом web сервере натолкнулись на мою оболочку и спросили, могут ли они использовать её. Затем, как неизбежно случается, они начали просить о большем количестве особенностей. Я добавил большее количество особенностей и в заключение собрал наполовину дистрибуцию наряду с документацией, списком адресатов и FAQ. Имя этого первого пакета было Персональные Инструментальные средства для домашней страницы (PHP), которые позже стали Персональным комплектом создания домашней страницы.
В то же самое время я начал играть с базами данных и написал инструмент,
чтобы легко включить запросы SQL в web страницы. Это было в основном другая
оболочка CGI, которая анализировала запросы SQL и облегчала, создание форм и
таблиц, основанных на этих запросах. Этот инструмент был именован Интерпретатор
Форм (Form Interpreter PHP/FI версии 2.0 - полная перезапись из этих двух пакетов, объединенных в
одиночную программу. Это теперь развилось по сути в простой язык
программирования, внедренный внутри HTML файлов. Первоначальный акроним, PHP,
прижился. Он теперь не соответствует действительности. PHP/FI используется
больше для создания целых web серверов сегодня чем для малых домашних страниц.
Под любым именем, это устраняет потребность в многочисленных малых cgi
программах на Perl, позволяя Вам поместить простые скрипт программы
непосредственно в ваши HTML файлы. Это увеличивает общую производительность
ваших web страниц, хотя бы потому что нет непроизводительных затрат на запуск
Perl-а. Пакет также упрощает управление большими web серверами, помещая все
компоненты web страницы в одиночном файле html. Включением поддержки для
различных баз данных, пакет также делает тривиальным разработку web страниц с
доступом к базам данных. Многие людей находят, что с внедренным характер намного
проще иметь дело чем пытаться создать отдельные HTML и CGI файлы . В этой
документации любые ссылки PHP, FI или PHP/FI все относятся к одному и тому же.
Различие между PHP и FI - только концептуальное. И PHP и FI созданы из одного и
того же исходного текста. Когда я формирую пакет без любой регистрации доступа
или поддержки ограничения доступа, я вызываю мой выполняемый модуль FI. Когда я
формирую с этими опциями, я называю его PHP.
Если Вы не имеете абсолютно никакого опыта работы с Unix, Вы можете
захотеть попросить кого-либо, имеющего хотя бы немного знаний по Unix помочь
Вам с этой установкой. Была сделана попытка сделать это настолько простым,
насколько возможно, но так как программное обеспечение совершенно отличается и
зависит от ряда различных компонент, было бы не реалистично думать, что это
будет идти гладко на всех системах. Возможно Вам потребуется помощь кого-либо,
кто хорошо знает подробнocти о системе. - Можете ли Вы выполнять оба метода GET и POST из программы cgi на вашем
сервере? - Если на вашей системе установлен mSQL, то вам нужно знать основной
каталог этой установки. - Если на вашей системе установлен Postgres95, то вам нужно знать основной
каталог этой установки. - Если Вы собираетесь хранить лог-файл и файлы конфигурации доступа в
каталоге смонтированном по NFS и ваша система не обеспечивают блокирование
файлов по NFS, Вам нужно будет определить NFS_HACK переменную вручную в файле
src/Makefile, и возможно предется использовать немного измененную версию
библиотеки gdbm. См. файл nfs_hack.txt в каталоге doc для
более подробной информации относительно этого. - Обратить внимание, что, если Вы не заинтересованы, чтобы PHP отслеживало
доступ к вашим страницам, не компилируйте эту опцию. Вы должны также опустить
опцию ограничения доступа. При включении этих опций наблюдаются значительное
снижение производительности. - Если Вы устанавливаете пакет в виде модуля Apache, Вам необходимо знать
расположение каталога с исходными текстами Apache. Выполните программу установки: ./install
Вам будет задан ряд вопросов. Если Вы их не понимаете те, то просто
нажимайте "Return". Заданный по умолчанию выбор должен удовлетворять
требования для большинства систем. Это однако не имеет отношения к вопросам,
определяющим каталог для ваших конфигурационных и лог файлов. Выберите любой
каталог, к которому httpd (обычно пользователь "nobody") имеет доступ по
записи. Вы можете создать этот каталог вручную где-нибудь и просто сменить
владельца с помощью команды chown nobody catalog .
Шаг 2.
Войдите в каталог src: cd src
Шаг 3.
Введите команду: make
По умолчанию будет создан фактический выполнимый программный файл,
именованный php.cgi , или если Вы устанавливаете пакет в виде модуля
Apache, будет создан libphp.a файл.
Шаг 4. (Если Вы не устанавливаете пакет в виде
модуля Apache)
Скoпируйте файл php.cgi в каталог cgi-bin вашей системы.
Если у вас нет прав сделать это и вы желаете установить пакет в ваш
собственный персональный каталог, вы можете сделать это, но в таком случае
нужно установить setuid бит для выполняемой программы командой: chmod u+s
/path/php.cgi
Если Вы не установите setuid бит для выполняемого файла, то любые файлы,
созданные программой будут принадлежать пользователю с идентификатором, под
которым выполняется web сервер. Если это приемлимо, то вы можете спокойно
оставить setuid бит.
Шаг 4. (Если Вы устанавливаете программу в виде модуля
Apache)
Перейдите в каталог src Apache, в который должны быть скопированы файлы
mod_php.c и mod_php.h. Если они еще не были скопированы, что
может произойти из-за проблем с правами доступа, скопируйте эти два файла
вручную. Подредактируйте ваш файл Конфигурации Apache(Configuration), и
добавьте в строку EXTRA_LIBS libphp.a, которая была создана в конце
Шага 3. А также добавьте строку:
Module php_module mod_php.o
в самом конце файла. Затем введите: ./Configure и затем
make , чтобы перекомпилировать ваш файл httpd Apache.
Инсталлируйте этот файл.
Затем Вам нужно подредактировать ваш Apache conf/srm.conf файл и добавить
строку :
AddType application/x-httpd-php .phtml
Это определяет новый MIME тип, application/x-httpd-php, который будет
вызывать модуль PHP, для обработки любого файла с расширением .phtml .
Вы можете выбрать любое расширение, которое вам по душе.
Вы можете захотеть чтобы не все могли выполнить PHP файлы. Для этого вы
можете поместить вышеупомянутую AddType строку внутри <Location/path >
.... < /Location > директивы в access.conf файле, чтобы только в
определенных директориях вашего сервера PHP мог обрабатывать документы.
Теперь Вы готовы перезапустить ваш httpd сервер. Для более подробной
информации см. примечания
по конфигурированию модуля Apache.
После установки вы можете протестировать, работает ли ваша программа, введя
URL, подобный следующему в вашем броузере:
http://your.site.domain/cgi-bin/php.cgi
При этом должна показаться страница, которая содержит номер версии наряду с
другой полезной информацией.
Чтобы проверить работу модуля Apache , создайте любой файл с .phtml
расширением, поместите в него тэг подобно: <?phpinfo () > и посмотрите
будет ли он анализироваться.
http://your.site.domain/cgi-bin/php.cgi/path/file.html
Вам нужно взглянуть на раздел Переадресация
CGI этой документации. При выполнении PHP/FI с переадресацией вы можете
автоматически задавать чтобы URL подобно
http:/your.site.domain/file.phtml мог анализироваться PHP/FI.
Это не относится к пользователям программы, выполненной в виде модуля
Apache.
Простой пример
Предположим, что у вас есть форма:
<FORM ACTION="/cgi-bin/php.cgi/~userid/display.html"
METHOD=POST> Ваш display.html файл мог бы в этом случае содержать что - нибудь вроде:
<?echo "Hi $name, you are $age years old!<p>">
Это так просто! PHP/FI автоматически создает переменную для каждого поля
ввода в вашей форме. Вы можете впоследствии использовать эти переменные в ACTION
URL файле.
Следующий шаг, если только Вы определили, как использовать переменные, это
начать играться с некоторыми тэгами, определяющими логический ход выполнения в
ваших страницах. Например, если Вы хотели отобразить различные сообщения,
основанные на том что вводит пользователь, Вы используете if/else конструкцию. В
нашем примере выше, мы можем отображать различные сообщения, основанные на
возрасте, который ввел пользователь, изменив наш display.html:
PHP/FI обеспечивает очень мощный язык, который будет делать намного больше
чем то, что показывает этот простой пример . См. раздел по
Script язык PHP/FI для подробной информации.
Вы можете также использовать PHP/FI, чтобы конфигурировать, кому разрешено
обращаться к вашим страницам. Это может быть выполнено, с использованием
встроенного экрана конфигурации. В этом случае Вы могли бы например определять,
что только людям из некоторых доменов позволено обращаться к вашим страницам,
или Вы могли бы создать правило, которое будет защищать некоторые страницы с
помощью пароля. См. раздел Управления
доступом для более подробной информации.
PHP/FI также имеет возможность принимать файл, загружаемый из любого,
отвечающего требованиям RFC-1867, web броузера. Эта возможность позволяет
передавать как текстовые так и двоичные файлы. С управлением доступом PHP/FI и
его логическими функциями, у вас есть полный контроль над тем, кому позволено
передавать файлы и что с этим файлом должно быть сделано , если он передан. См.,
что раздел Передача
Файлов.
PHP/FI имеет поддержку для пакета базы данных называемого mSQL. Это позволяет
Вам помещать информацию в базу данных или обращаться за этой информацией через
простые встроенные прямо в ваши .HTML файлы SQL запросы. Обработка базы данных
через web страницу никогда не была проще. См. раздел по Поддержке
mSQL.
PHP/FI также имеет поддержку для пакета базы данных Postgres95. Это
поддерживает встроенные SQL запросы в ваших .HTML файлах. См. раздел по Поддержке
Postgres95 для подробной информации.
Хороший способ выполнять PHP/FI - используя модуль переадресации cgi с http
сервером Apache. Пожалуйста обратите внимание, что вам не нужно волноваться
относительно модулей переадресации, если PHP/FI используется в виде модуля
Apache. Существует два таких модуля переадресации. Один из них разработан
Дэйвом Андерсеном mailto:angio@aros.net, и
доступен по ftp://ftp.aros.net/pub/util/apache/mod_cgi_redirect.c,
и другой идет вместе с исходными текстами Apache и называется mod_actions.c.
Эти модули очень похожи. Есть лишь небольшая разница в их использовании. Оба
были протестированы и оба работают с PHP/FI.
Одно большое "но" на момент написания документа (апрель. 20/96) - то, что
текущий официальный выпуск Apache (1.0.5) имеет серьезное ограничение, которое
препятствует получению данных в переадресованных cgi запросах метода POST. Я
разрешил эту проблему и устранил этот недостаток в моей версии Apache, есть
также официальный патч, доступный в файловом архиве на домашней странице PHP.
Вторая довольно большая проблема с Apache, 1.0.x - то, что он не
выравнивает тип double правильно на большинстве архитектур. Вы получаете
странные ошибки типа BUSERROR от вашего httpd при использовании mod_php, для
решения этой проблемы нужно или обновление Apache до 1.1 или подредактировать
файл alloc.c Apache. В этом файле найдите следующий фрагмент кода:
Нужно добавить double к этой строке и перетранслировать вашу Apache сервер.
Правильный блок кода:
Проверьте документацию к Apache по тому, как добавлять модуль. Вообще Вы
добавляете имя модуля к файлу называемому Configuration. Если вы хотите
использовать модуль mod_action, то вам нужно добавить следующую строку:
Module action_module mod_actions.o
Если хотите использовать модуль mod_cgi_redirect.c, добавьте строку:
Module cgi_redirect_module mod_cgi_redirect.o
Затем скомпилируйте ваш httpd, и инсталлируйте его. Чтобы разрешить cgi
переадресацию, нужно или создать новый MIME тип, в файле mime.types , либо
можно использовать команду AddType в вашем srm.conf
файле, чтобы добавить тип MIME. Тип MIME, который будет добавлен должен
быть что - нибудь вроде этого:
application/x-httpd-php phtml
Если Вы используете модуль mod_actions.c, Вам нужно добавить следующую
строку к вашему файлу srm.conf:
Action application/x-httpd-php /cgi-bin/php.cgi
Если Вы используете mod_cgi_redirect.c, нужно добавить эту строку к
srm.conf:
CgiRedirect application/x-httpd-php /cgi-bin/php.cgi
Не пробуйте одновременно использовать, и mod_actions.c и
mod_cgi_redirect.c.
Если только Вы имеете один из этих cgi модулей переадресации, установленных
и правильно сконфигурированных , Вы захотите чтобы файл анализировался php/fi
просто дав ему расширение файла .phtml. Кроме того, если Вы
добавляете index.phtml к вашей строке конфигурации
DirectoryIndex в файле srm.conf, то верхне-уровневая
страница в каталоге будет автоматически анализироваться php, в том случае если
ваш индексный файл называется index.phtml.
Вы можете автоматически переадресовывать запросы к файлам с данным
расширением, которые будут обрабатываться PHP/FI, с использованием модуля
переадресации CGI сервера Netscape. Этот модуль доступен в файловом архиве на домашней странице PHP/FI . Файл README в
пакете подробно объясняет, как конфигурировать модуль для использования с
PHP/FI.
NCSA в настоящее время не поддерживает модули, таким образом чтобы
использовать cgi переадресацию с этим сервером, нужно изменить исходный текст
сервера. Патч, для сервера NCSA 1.5 доступен в архиве PHP/FI.
PHP/FI не читает никакие Имеется пара различных решений для этой проблемы. Самое простое, возможно,
это использовать особенность PATTERN_RESTRICT, находящуюся в
php.h. Это позволяет вам, определить расширение (или шаблон расширений)
файлов, которые можно передавать для анализа PHP/FI. Если у файла другое
расширения, и кто-либо пытается загружать через PHP/FI, появится сообщение: в
доступе отказано.
Другое решение состоит в том, чтобы использовать механизм управления доступом
PHP/FI, чтобы подражать установке контроля доступа, который определен в вашем
.htaccess файле. Хранение этой информации в двух местах может быть утомительно,
хотя, и две эти системы не разделяют все те же самые особенности.
Проблема может также быть решена, используя установку прав доступа к файлу.
PHP/FI может быть установлен, чтобы выполнить setuid как любой пользователь, от
которого Вы пожелаете. Затем файлам, которые должны читаться PHP/FI, могут быть
установлены, соответствующие биты доступа и для файлов, которые не должны
читаться PHP/FI должен быть установлены владелец с другим идентификатором
пользователя и соответственно измененные права доступа.
Ловушки HTTP аутентикации в PHP/FI доступны только в случае, если пакет
выполняется как модуль Apache. В программе для PHP/FI в виде модуля Apache ,
возможно использование команда Header() , чтобы послать сообщение
"Authentication Required" к броузеру пользователя, которое приведет к появлению
окна ввода с запросом Пользователь/Пароль (Username/Password). Как только
пользователь ввел свое имя и пароль, URL, содержащий PHP/FI скрипт будет вызыван
снова с переменными, $PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE
установленными соответственно имени пользователя, его паролю и типу
аутентикации. Только На текущий момент поддерживается только "Базовая"("Basic")
аутентикация.
Фрагмент примерa скрипта , который запросит аутентикацию пользователя при
обращении к странице:
Вместо простого вывода $PHP_AUTH_USER и $PHP_AUTH_PW, вам возможно захочется
проверить правильность имени пользователя и пароля. Возможно, посылая запрос к
базе данных, или, осуществляя поиск пользователя в dbm файле.
Чтобы предотвратить вариант что кто-либо напишет скрипт, который показывает
пароль для страницы, аутентикация которой была через традиционный внешний
механизм, переменные PHP _AUTH не будут установлены в том случае, если рарешена
внешняя аутентикация для этой конкретной страницы.
Обратите внимание однако, что вышесказанное не мешает кому-либо, кто
контролировал не-аутентифицированные URL украсть пароль от аутентифицированных
URL на том же самом сервере. PHP _AUTH_VARS определяется в php.h, может быть
установлена в "неопределена", для того чтобы быть уверенным, что эти переменные
никогда не будут установлены и таким образом отключить возможность использования
mod_php для того чтобы пытаться украсть пароли.
Выполнение PHP/FI в виде модуля Apache это наиболее эффективный способ
использования пакета. В случае если пакет выполняется в виде модуля, то это
означает что функциональные возможности PHP/FI объединены с функциональными
возможностями сервера Apache в одной программе. Имеется ряд преимуществ для
пакета в виде модуля:
Эффективность - намного быстрее чем традиционные программы CGI. Фактически,
при выполнении PHP/FI в виде модуля, никакой CGI, не запускается. Скрипт код в
HTML файлах выполняется непосредственно процессом web сервера Apache.
При выполнении модулем модулем, сначала применяются нормальные основанные
на httpd правила ограничения доступа определяемые в конфигурационных файлах
Apache или в частных .htaccess файлах прежде чем модулю позволяются
анализировать файл. В качестве альтернативы, Вы можете также создавать скрипты
PHP/FI, которые управляют нормальной httpd-основанной аутентикацией. См.
Аутентикация HTTP
. Так как синтаксический анализатор всегда активный внутренний процесс httpd,
он может быть сконфигурирован при запуске, с использованием тех же самых
файлов конфигурации, которые используются для конфигурации сервера httpd.
Модуль может даже быть сконфигурирован на "по-каталожной" основе, путем
помещения директив
конфигурации PHP в .htaccess файлах.
Следующие директивы могут быть помещены или в файл srm.conf , или
внутри тэгов <Directory> ... </Directory> в файле access.conf
или внутри тэгов <Location /path> ... <Location> в файле access.conf
или в индивидуальных .htaccess файлах:
PHP/FI может быть скомпилирован с поддержкой FastCGI. Но прежде вам нужно
будет выбрать и скомпилироватьFCGI Development
Kit для вашей платформы. А также рабочий модуль переадресации
CGI. Затем следуйте инструкциям, изложенным в документации по FastCGI, для
конфигурирования пакета FastCGI применительно к вашей платформе. Если Вы
используете модуль mod_fastcgi с сервером Apache, ниже приводятся пошаговые
инструкции:
Теперь, любые страницы с расширением .fhtml будут переданы для обработки
процессу FastCGI - php.fcgi , который уже выполняется. Php.fcgi все еще будет
работать как обычный CGI, так что можно просто создать символический линк от
php.cgi к php.fcgi.
Если Вы не используете Apache, вышеупомянутые шаги будут подобны, но не
идентичны. Механизмы переадресации CGI доступны для NCSA и Netscape серверов на
файловом архиве PHP/FI.
Если вы решили включить контроль доступа, при компиляции пакета, Вы можете
добавить "?config" к любому URL, чтобы редактировать файл управления доступом.
То есть.
http://your.machine.domain/cgi-bin/php.cgi/path/file.html?config
Ваш пароль конфигурации будет первоначально установлен вашему идентификатору
пользователя. Если ваш идентификатор пользователя не работает как ваш пароль,
это возможно означает что PHP, не смог читать файл /etc/passwd, чтобы определить
ваш пользовательский идентификатор. Если дело обстоит таким образом, начальный
пароль будет установлен "php". Будет совсем не глупо изменить
этот пароль. Обратите внимание, что разные пользователи могут поддерживать их
собственные персональные файлы конфигурации с помощью одного выполняемого
PHP/FI.
Управление доступом может совершенно запутать поначалу. Экран "?config"
разделен на несколько разделов. Верхний раздел - для изменения пароля,
используемого для того чтобы удостовериться, что только знающие этот пароль
могут изменять характеристики управления доступом. При системной установке,
каждый пользователь имеет его или ее собственный экран конфигурации с его или ее
собственным паролем.
Второй раздел окна "?config" состоит из ряда таблиц. Каждая таблица
определяет набор правил. Первый набор правил - всегда задает набор правил по
умолчанию. Эти правила используются, если страница не имеет специально для нее
определенного набора правил. После заданного по умолчанию набора правил, может
следовать любое количество специфических таблиц наборов правил.
Чтобы добавить набор правил для конкретного файла, введите URL файла в вашем
броузере, и добавьте ?config к концу URL. В появившемся
окне конфигурации вы увидете, что для этой страницы был добавлен набор правил ,
если его еще не было там. При добавлении нового набора правил, первоначально
установливается равным набором правил по умолчанию. Следующая иллюстрация
показывает два простых набора правил. Сначала набору правил заданный по
умолчанию, который указывает только, что доступ изо всех доменов должны
регистрироваться, и второй, для файла /~rasmus/test.html, и только для этого
файла всем пользователям, приходящим из домена ".edu", будет отказано в
доступе.
Для редактирования набора правил изменяют поля, пока не будет достигнута
желаемая конфигурация внутри набора правил и затем нажмите кнопку "Submit
Changes". Если нужно большее количество правил, нажмите кнопку "Add
Rule", и затем подредактируйте добавленное правило.
Чтобы удалить правило, выберите переключатель справа от правила, и нажмите
кнопку "Submit Changes". Экран будет, перерисован и правило должно
исчезнуть.
Обратите внимание, что нужно ввести регулярное выражение в поле шаблона. См.
раздел по регулярным выражениям в этой документации.
Регистрация Доступа - другая опциональная особенность, которую можно
разрешить во время компиляции, отвечая "Yes" на вопрос в скрипте
установки. Данные регистрации доступа могут быть сохранены в dbm файле или в
базе данных mSQL. Последний более мощен, но он также немного более труден в
установке.
Чтобы использовать dbm файлы для сохранения данных о регистрации доступа,
нужно определить каталог, в котором могут быть записаны файлы с данными о
регистрации. PHP попытается создать этот каталог, если он не существует, но для
того чтобы быть уверенным, что каталог имеет соответствующие права на доступ,
вам воможно захочется создать этот каталог самостоятельно перед первым запуском
PHP. Права доступа к каталогу должны быть такими, чтобы пользователь с
идентификатором, под которым выполняется программа cgi PHP , имел право на
запись.
Для использования базы данных mSQL для регистрирации доступа, нужно сначала
удостовериться, что в системе установлен mSQL и он выполняется. Затем необходимо
создать базу данных. Заданное по умолчанию имя - "phpfi", хотя оно может быть
изменено в src/php.h. Для создания базы данных, введите:
Затем подредактируйте ваш msql.acl файл, и удостоверитесь, что
разрешения на доступ к базе данных правильны. Что - нибудь вроде следующего
должно удовлетворить:
Для каждого пользователя, для которого Вы хотите сохранять данные
регистрации, нужно создать две таблицы. msqllog шелл скрипт в каталоге
scripts сделает это для Вас. Просто введите:
и скрипт создаст соответствующие таблицы. Возможно вам придется
подредактировать скрипт, для того чтобы отразить, где размещаются вещи в
системе.
Возможно вы захотите взглянуть на этот скрипт. Он определяет размеры полей
ваших регистрационных таблиц. Если, например, Вы знаете, что ваши пути файлов
превышают 64 символа, то Вы должны изменить размер имени файла, для таблиц
logN и lastN в этом msqllog файле.
Информация о регистрации доступ сохраняется при каждом обращении к странице.
Эта информация впоследствии может суммироваться, просмотром этих данных
регистрации. Пример скрипта для суммирования данных по регистрации приводится в
составе пакета. Это - log.html файл в каталоге examples. Это -
анализатор dbm файла регистрации данных. Анализатор msql файла регистрации
называется mlog.html. Чтобы выполнять эти скрипты, скопируйте их в
каталогу, который доступен с вашего web сервера, и введите:
По умолчанию, если Вы компилировали PHP с включенной регистрацией доступа, то
на ваших страницах появятся нижние колонтитулы, содержащие некоторую информацию
о доступе к странице. Возможно вам не захочется видеть этот нижний колонтитул,
но при этом все регистрировать обращения. Вы можете выключить эти нижние
колонтитулы созданием правила в ?config
разделе для страницы, или, добавив тэг подобный этому к вашей странице:
<?setshowinfo(0)>
Общая проблема для всех программ CGI состоит в том, что программа HTTPD
изменяет текущий каталог на тот, в котором находится загружаемый документ. В
случае программы CGI, текущий каталог установлен на каталог, где находится
программа CGI. Обычно это не проблема, за исключением тех случаев, когда это
приводит к относительному URL.
Относительный URL это тот, который полагает что текущий каталог, является
также и каталогом, в котором размещен HTML файл . Так, например, если у меня
есть URL:
Фактический HTML файл мог бы быть:
Если внутри файла file.html у меня есть тэг:
В случае если file.html загружен обычным образом то gif файл, как и
ожидается, будет в ~rasmus/public_html/pic.gif. Однако, если он
загружен через программу CGI с URL подобно:
то HTTPD устанавливает текущий каталог на /cgi-bin (или на тот, на
который указывает директива ScriptAlias) и впоследствии, когда страница
загружена, pic.gif файл будет ожидаеться, в каталоге:
/cgi-bin/pic.gif, что обычно является не желательным эффектом.
Быстрый способ решения этой проблемы состоит в том, чтобы использовать
абсолютный URL. Если в вышеупомянутом примере, тэг изображения был:
то не было бы никакой проблемы. Но дело в том что использование абсолютного
URL не всегда желательно, так как это делает страницы менее переносимыми.
Очевидный вопрос, который Вы можете сейчас задать: " Почему бы PHP просто не
изменяет текущий каталог на правильный? ". Ответ - PHP фактически изменяет
текущий каталог на каталог, в котором расположен отображаемый HTML файл. Любые
пути файлов, используемые внутри скрипта PHP могут быть относительны. Проблема
состоит в том, что тэги, находящиеся вне области действия PHP типа <img> и
<href> не будут обрабатываться PHP. Когда они анализируются, PHP уже не
активен, и текущий рабочий каталог установлен на каталог, определенный HTTPD.
Решение - состоит в компромиссе. PHP обеспечивает
переменную, называемую PATH_DIR. Она всегда содержит часть
каталога из имени текущего HTML файла. Если эта переменная PATH_DIR используется
в <img> и <href> тэгах, то может быть достигнут эффект
относительного URL , хотя для сервера при анализе они будут выглядеть как
абсолютный URL. Для нашего вышеприведенного примера , единственое изменение,
которое нужно сделать это изменить тэг img на:
Используя вышеприведенную запись, Вы можете перемещать файл, содержащий этот
тэг куда угодно, и тэг всегда будет ссылаться на файл pic.gif в том же самом
каталоге что и исходный HTML файл.
Другой способ решения состоит в том, чтобы использовать традиционный <BASE
HREF= ... > тэг в HTML файле.
PHP обнаруживает оба метода GET и POST , исходящие из HTML формы. Одна важная
деталь, для понимания - это то что метод, POST всегда обрабатывается раньше,
если присутствуют оба из них. Если переменная PHP определяется методом POST, или
если переменная определена дэймоном HTTP в среде окружения Unix, то метод GET не
может перезаписать ее. Это должно предотвратить ситуацию когда кто-либо добавит
строку ?REMOTE_HOST=some.bogus.host к его URL и таким образом, подчунуть
механизму регистрации PHP, эти альтернативные данные. Однако POST методу,
разрешено перезаписывать эти переменные.
Любая компонента данных GET (данные после '?' в URL) которая имеет форму,
word=something, определит переменную $word, содержащую значение
something. Даже если данные не определены в этой форме, к ним все равно
можно обратиться через массив $argv. Например, в URL подобно:
Соответствующие компоненты таблицы идентификаторов PHP будут:
Обратите внимание, как EMAIL_ADDR часть данных присутствует и в переменной
$argv [2], в которой она не анализируется, и создается переменная $EMAIL_ADDR,
содержащая значение rasmus@vex.net.
$EMAIL_ADDR переменная использовалась в вышеупомянутом примере, потому что
это - полезная переменная, если Вы используете особенности регистрации PHP.
Добавляя:
К любым линкам на странице, где известен email адрес пользователя, Вы можете
передавать это значение следующей странице. Система регистрации PHP, будет
автоматически просматривать значение этой переменной и записывать его в качестве
адреса электронной почты пользователя в файлах регистрации. Для любых
пользователей PHP, вышеупомянутое выполняет ту же самую функцию что и добавление
?<!--$email--> к используемому URL. Это выглядит немного сложным
сейчас, но сложным является и решение самому сформировать свою собственную
страницу.
В вышеприведенном примере Вы также видели, как несколько переменных в методе
GET могут быть правильно определены, отделением их друг от друга символом
"&". Этот список переменных, разделенный символом "&" должен быть
последней (или единственной) компонентой метода GET.
Тэг SELECT MULTIPLE в конструкции HTML позволяет пользователям сделать
множественный выбор из списка. Выбранные объекты впоследствии передаются
обработчику формы. Проблема состоит в том, что все они будут переданы с одним и
тем же именем объекта. То есть.
Каждая выбранная опция будет передана обработчику формы в виде:
var=option1 Каждая опция затрет предыдущее содержимое переменной $var. Решение состоит в
том, чтобы использовать особенность PHP/FI - не-индексированные массивы. Так
нужно использовать:
Это сообщает PHP/FI, чтобы он обработывал переменную var как массив,
каждое присвоение значения переменной var[] добавляет элемент к массиву. Первый
элемент становится $var[0], следующий $var[1], и т.д. Для опеределения
количества выбранных элементов может использоваться функция count(), и в
случае необходимости функция sort() для
сортировки массива.
При передаче формы на рассмотрение, можно использовать картинку, вместо
стандартного представления кнопки. Это можно сделать, указав тэг:
Когда пользователь нажимает где-нибудь на изображение, сопровождающая форма
будет передана серверу с двумя дополнительными переменными, sub_x и
sub_y. Они содержат координаты точки внутри изображения, на которой
пользователь щелкнул мышью. Опытный может обратить внимание, что фактические
имена переменных , посланных броузером содержат точку вместо подчеркивания, но
PHP автоматически преобразовывает точку в подчеркивание.
PHP поддерживает библиотеку GD версии 1.2 написанной Томасом Бутеллом.
Непосредственно в PHP нет никакого кода GD . Если Вы хоттите использовать
поддержку GD в PHP/FI, Вам нужно получить библиотеку GD с http://www.boutell.com/gd/gd1.2.tar.Z,
инсталлировать ее, и затем переустановить PHP.
Не все возможности GD поддерживаются PHP. Для списка поддерживаемых функций
см. Алфавитный
Список функций. Все функции GD начинаются со слова, Image.
Подробная информация относительно пакета GD доступна по: http://www.boutell.com/gd/.
GD 1.2 - copyright 1994, 1995 Quest Protein Database Center, Cold Springs
Harbor Labs.
PHP прекрасно работает на виртуальных хостах, которые поддерживаются
некоторыми дэймонами http. Одна проблема, которая может произойти при такой
установке, связана с различиями в способе, которым httpd устанавливает
переменную окружения SCRIPT_NAME. Обычно ее значение установливается равным пути
выполняемой в текущий момент программы CGI относительно директории ROOT_DIR
сервера httpd. Однако, при использовании виртуального домена , некоторые httpd
не устанавливают правильно значение переменной SCRIPT_NAME - относительно самого
верхнего каталога виртуалного домена, как это должно быть. Если добавление
?config к URL дает Вам сообщение об ошибке: "invalid URL", значит эта проблема у
вас существует. Вам нужно будет подредактировать файл php.h и устанавить
значение переменной VIRTUAL_PATH, чтобы указать путь к вашему выполняемому файлу
php.cgi относительно вашего каталога верхнего уровня .
PHP/FI автоматически обнаруживает попытку закачки файла, из броузера, который
поддерживает закачку файлов основанную на базе форм, как это предложено Е. Небелем и Л. Мазинтером из Xerox и описано в RFC 1867.
Экран закачки файла, может быть сформирован, созданием специальной формы,
которая будет выглядеть наподобие этой:
_URL_ должен указывать на php html файл. Скрытое поле MAX_FILE_SIZE должно
предшествовать полю ввода имени файла и его значением является максимальный
размер принимаемого файла. Значение задается в байтах. Для этого файла
назначения, следующие переменные будут определены, при успешной закачке:
Временное имя файла, в котором загруженный файл был сохранен на машине
сервере.
Первоначальное имя файла на машине отправителя.
Размер загруженного файла в байтах.
MIME тип файла, в том случае если броузер предоставляет эту информацию.
например это может быть "image/gif". $userfile - основная переменная из вышеупомянутых,
будет соответствовать полю NAME в форме закачки.
По умолчанию файлы будут сохранены в заданном для сервера временном каталоге
по умолчанию. Это значение может быть изменено путем установки переменной
окружения среды TMPDIR для PHP/FI. Хотя при установке ее,с использованием вызова
PutEnv () из скрипта PHP/FI, работать это не будет. В качестве альтернативы, Вы
можете установить временный каталог, редактируя php.h и определив
переменную UPLOAD_TMPDIR.
Скрипт PHP/FI, который принимает закачиваемый файл, должен выполнить любые
логические действия, необходимые для определения, что должно быть выполнено с
закачаннным файлом. Вы можете например использовать $file_size переменную, для
того чтобы отбросить любые файлы, которые являются либо слишком маленькими либо
слишком большими. Вы можете использовать $file_type переменную, для того чтобы
отбросить любые файлы, которые не соответствуют каким-либо критериям типа. Какие
бы ни были действия, вам нужно будет удалить файл из временного каталога или,
переместить его в другое месте.
Пожалуйста обратите внимание, что CERN httpd , кажется, удаляет все начиная с
первого пробеле в заголовке MIME content-type, который он получает от
пользователя. Если дело обстоит таким образом, то CERN httpd не будет
поддерживать возможность закачки файлов.
PHP/FI поддерживает HTTP cookies как определено Спецификациями
Netscape. Cookies - механизм для сохранения данных в удаленном броузере и
таким образом трэкинг или идентификация возвращаемая пользователем . Вы можете
устанавливать cookies, используя функцию SetCookie()
. Cookies - часть HTTP заголовка, таким образом функция SetCookie() должна
вызваться до того как какие-либо данные будут посланы для вывода удаленному
броузеру. Это - то же самое ограничение что касается функции Header() .
Любое значени cookies посланного Вам от пользователя, превратится
автоматически в переменную PHP/FI точно так же как методах GET и POST.
Если Вы желаете привоить несколько значений к одиночному cookie, просто
добавьте [] к имени cookie. Например:
Обратите внимание, что cookie заменит предыдущий cookie с тем же именем в
вашем броузере, если толькко путь или домен не отличаются. Так, для прикладной
программы по закупкам Вы можете пожелать хранить счетчик и передавать его
дальше. То есть.
mSQL это мини-SQL и это небольшой и простой SQL сервер баз данных, написанный
Дэвидом Хьюджесом. Он доступен по ftp://ftp.bond.edu.au/pub/Minerva/msql
PHP/FI обладает богатым набором функций поддержки mSQL:
В дополнение к этим функциям, PHP/FI может быть также скомпилирован таким
образом, чтобы автоматически пропускать, любые прямые одиночные кавычки ( ' ),
полученные из методов GET или POST. Если в файле php.h определена
переменная MAGIC_QUOTES, то эти кавычки будут автоматически пропускаться,
упрощая, передачу данных из форм непосредственно к запросам msql.
Postgres95 - мощная база данных являющаяся паблик домен, которая реализует
значительное подмножество языка SQL . Она поддерживает множество типов данных и
команды, которые не доступны в mSQL. Подробная информация относительно
Postgres95 и непосредственно программного обеспечения может быть найдена по URL:
http://epoch.cs.berkeley.edu:8000/postgres95/.
Следующие функции PHP доступны для Postgres95:
Обратите внимание: Двоичные указатели не поддерживаются.
В дополнение к этим функциям, PHP/FI может быть скомпилирован, чтобы
пропускать любые прямые одиночные символы ( ' ) кавычки, найденные в данных
методов GET или POST . Если в файле php.h определена переменная
MAGIC_QUOTES, то эти кавычки автоматически будут пропускаться, упрощая, передачу
данных из форм непосредственно к запросам Postgres95.
Вот простой скрипт , который соединяется с базой данных Postgres95 на
локальном сервере, называющейся 'mydb' и извлеает имена и возрасты людей из
таблицы:
Регулярные выражения используются для сложного манипулирования строками в
PHP/FI. Поддержка интерфейса между скриптом и регулярными выражениями
осуществляется через следующие функции: Reg_Match(),
Reg_Replace(),
и Reg_Search().
Первым аргументом для всех трех функций - это строка, задающая регулярное
выражение. Этот строка состоит из регулярных и специальных символов. Регулярные
символы имеют то же значение что и при в других командах Unix, в то время как
специальные символы имеют специальное значение. Далее следуюет - полный список
специальных символов и их значения как это воспринимает синтаксический
анализатор PHP/FI:
Является специальным символом, который соответствует любому символу, за
исключением символа новой строки. Используя конкатенацию, мы можем задавать
регулярные выражения подобно 'a.b', которое соответствует любой
трех-символьной строке, которая начинается с 'a' и заканчивается 'b'.
Сам по себе это не конструкция; это - суффикс, который означает, что
предшествующее регулярное выражение, может быть повторено сколь угодно много
раз. В строке "fo*", символ "*" применяется к символу "o', так "fo*" задает
"f" с последующим любым количеством символов "o".
В случае нулевого количества символов "o" строка "fo*" будет также
соответствовать "f".
Символ "*" Всегда применяет к *наименьшему* возможному предшествующему
выражению. Таким образом, "fo*" задает повторение "o", а не повторение "fo".
Процесс сравненияr обрабатывает конструкцию "*", пытаясь согласовать
настолько много повторений насколько много их их может быть найдено. Затем
он продолжает обработку остальной части шаблона. Если, впоследствии,
появится несоответсвтие с шаблогам, происходит возврат, путем отбрасывания
некоторых повторений "*", в случае, если это делает возможным совпадение
остальной части шаблона. Например, шаблон "c[ad]*ar" для строки "caddaar",
"[ad]*" сначала совпадает с "addaa", но это не позволяет совпасть следующему
символу "a" в шаблоне. Так последнее совпадение "[ad]" отменяутся, и
следующий символ "a" пробуется вновь. Теперь шаблон сооветствует.
"+" Подобен "*" за исключением того, что требуется по крайней мере одно
соответствие для предшествующего образца. Таким образом, "c[ad]+r" не
совпадает с "cr", но совпадет с чем либо еще что может быть задано шаблоном
"c[ad]*r".
"?" Подобен "*" за исключением того, что позволяет задать нуль или более
соответствий для заданного шаблона. Таким образом, шаблон "c[ad]?r" будет
задавать строки "cr" или "car" или "cdr", и ничего больше.
"[" начинает "множество символов", которое завершается символом "]". В
самом простом случае, символы между этими двумя скобками формируют
множество. Таким образом, "[ad]" задает символы "a" или "d", и "[ad]*"
задает любоую п оследовательность символов "a" и "d" (включая и пустую
строку), из чего следует, что шаблон "c[ad]*r" задает "car", и т.д.
Диапазон символов также может быть включен в множество символов, с
помощью символа "-", помещенного между двумя другими. Таким образом, шаблон
"[a-z]" задает любой символ нижнего регистра. Диапазоны могут свободно
перемежаться с одиночными символами, как в шаблоне "[a-z$%.]", который
задает любой символ нижнего регистра или символы "$", "%" или точку.
Обратите внимание, что символы, обычно являющиеся специальными, внутри
множества символов больше не являются таковыми. Внутри множества символов
существует полностью отличный набор специальных символов : "]", "-" и "^".
Для того чтобы включить "]" в множество символов, нужно сделать его
первым символом. Например, шаблон "[]a]" задает символ "]" или "a". Чтобы
включить символ "-", нужно использовать его в таком контексте, где он не
может указывать диапазон: то есть или первым символом, или сразу после
диапазона.
"[^" начинает "исключающее множество символов", который задает любой
символ за исключением заданных. Таким образом, шаблон "[^a-z0-9A-Z]" задает
любой символ *за исключением* букв и цифр.
"^" не является специальным символом в множестве, если только это не
первый символ. Символ следующий после "^" обрабатывается так, как будто он
является первым (это может быть "-" или "]").
Является специальным символом, который задает пустую строку - но только в
случае если он стоит в начале строки шаблона. Иначе шаблон не будет
соответствовать. Таким образом, шаблон "^foo" задает "foo" в начале строки.
Подобен "^", но только задает конец строки. Так шаблон, "xx*$" задает
строку с одним или более символом "x" в конце строки.
Имеет два значения: экранирует вышеперечисленные специальные символы
(включая "\"), и задает дополнительные специальные конструкции.
Так как "\" экранирует специальные символы, "\$" является регулярным
выражением, задающим только символ "$", а "\[" является регулярным
выражением, задающим только "[", и так далее.
В основном, "\" с последующим любым символом соответствует только этому
символу. Однако, есть некоторые исключения: символы, который, когда "\"
предшествует специальная конструкция. Такие символы обычно всегда задают их
собственное значение.
Никакие новые специальные символы не определены. Все расширения к
синтаксису регулярных выражений сделаны, определением новые двух-символьных
конструкций, которые начинаются с "\".
Задает альтернативу. Два регулярных выражения A и B с "\|" между ними
формируют выражение, которое задает что-либо чему соответствует или А или B.
Так выражение, "foo\|bar" или "foo" или "bar", но никакую другую строку.
"\|" применяется к максимально большим окружающим выражениям. Только
"\(...\)" вокруг выражений могут ограничивать мощность "\|".
Существует полная возможность перебора с возвратами , когда задано
множество "\|".
является конструкцией группирования , которая служит трем целям: 1.
Заключать в себя множество "\|" альтернатив для других операций. Так, шаблон
"\(foo\|bar\)x" соответствует или "foox" или "barx".
2. Включать сложное выражение для постфиксного "*". Так шаблон
"ba\(na\)*" задает "bananana", и т.д., с любым (ноль или болеее )
количеством "na".
3. Отметить искомую подстроку для последующего обращения.
Эта последняя функция - не следствие идеи относительно группировки
выражений скобками; это - отдельная особенность, которая задает второе
значение для той-же самой конструкции "\(...\)" , так как нет практически
никакого конфликта между этими двумя значениями. Вот объяснение этой
особенности:
После окончания конструкции "\(...\)" , анализатор запоминает начало и
конец текста, совпавшего с этой конструкцией. Затем, позднее в регулярном
выражении можно использовать "\" с поледующей цифрой (DIGIT), что означает
"задать тот же самый текст, который соответствовует DIGIT нахождению в
конструкции '\(...\)'". "\(...\)" конструкции пронумерованы в порядке
возрастания в регулярном выражении.
Строкам задающим первые девять конструкций "\(...\)" , появляющимся в
регулярном выражении - соответствуют числа от 1 до 9. "\1" до "\9" может
быть использовано для обращения к тексту, соответствующей "\(...\)"
конструкции. Эти 9 сохраненных конструкций известны также как регистры.
Например, шаблон "\(.*\)\1" задает любую строку, который состоит из двух
идентичных частей. "\(.*\)" задает первую часть, которая может быть всем чем
угодно, но последующая "\1" задает точно тот же тексту.
Сохраненные конструкции или регистры могут использоваться внутри
одиночных выражений, или, они могут быть извлечены и использоваться где-либо
еще. Добавление третьего параметра к reg_match() или reg_search() определит
массив, в который будут записаны 9 регистров. При этом записывается
дополнительный регистр (нулевой элемент) в котором задана строка совпавшая
со всем выражением. Например:
Вышеупомянутое сначала напечатает количество совпавших символов (14 в
этом случае) и затем всю совпавшую строку, споследующим первым словом строки
и последним.
Задает пустую строку, но только, если она находится в начале или в конце
слова. Таким образом, "\bfoo\b" соответствует любому местонахождению "foo" в
виде отдельного слова. "\bball\(s\|\)\b" соответствует "ball" или "balls" в
виде отдельных слов.
Задает пустую строку, если она не в начале или не в конце слова.
Задает пустую строку, но только, если она - в начале слова.
Задает пустую строку, но только, если она в конце слова.
Задает любой символ, являющийся составной частью слова.
Задает любой символ, который - не является составной частью слова.
Скрипт язык PHP подобен по синтаксису языку C по многим показателям. Он
поддерживает переменные, массивы, обращения к функциям, различные типы
переменных и множество других вещей, которые вам могут потребоваться для
написания сложных cgi программы .
В последующих разделах описана каждая функция PHP/FI и он может быть быстро
найдена, простым добавлением #function_name к url этого документа, так как
каждое функциональное описание снабжено тэгом имени.
Поддерживаются переменные, имена перемменных начинаются с символа
$. Так, например, чтобы установить значение переменной к 5 и
затем отобразить ее, можно написать следующий фрагмент:
Это можно записать, также в виде:
Или даже:
Лишние символы пробела, табуляции и новой строки игнорируются. Это
предложение должно использовать, чтобы форматировать блоки программы PHP, чтобы
сделать их более удобочитаемыми. Регистр написания имеет значение для имен
переменных, но не для имен к функций. Позже в этой документации, при обзоре
функций , регистр используется только для того, чтобы сделать имена функций
более читабельными. В фактической программе Вы можете использовать любой
регистр, который пожелаете. Комментарии поддерживаются. Комментарии записываются
точно так же как комментарии в Языке C. /* начинает
комментарий, и */ заканчивает комментарий. Комментарии могут
быть помещены в любом месте внутри блока <? ... >.
Поддерживаются три типа переменных . Длинные целые (long int)
, двойной точности с плавающей запятой (double) и
символьные строки (strings). Тип переменных обнаруживается
автоматически. Например:
Заставляет $a стать переменной типа INTEGER.
Заставляет $a стать переменной типа DOUBLE.
Заставляет $a стать переменной типа STRING.
Тип переменной вообще-то не очень важен. Каждая переменная, независимо от
типа, преобразуется в любой из трех типов, внутренне и различные функции пробуют
использовать правильный тип. Есть только несколько функций, для которых важен
тип переменной.
Все три типа переменных могут также рассматриваться как массивы, если к их
именам добавляется [значение]. В отличие от C, массивы в PHP
фактически представляют собой ассоциативные массивы, подобные тем, которые
используются в Perl. Следующая запись корректна:
Обратите внимание, что, если имя переменной используется, и как массив и как
обычная переменная, то имя обычной переменной является синонимом элементу
массива с индексом "0". То есть.
Это тоже самое что:
PHP/FI также поддерживает не-индексированные массивы. Не-индексированный
массив генерирует собственный индекс, по мере добавления элементов к нему.
Например:
Первому элементу, вставляемому в не-индексированный массив, всегда
присваивается индекс 0, второму 1 индекс, и т.д. Следовательно вышеупомянутые
элементы могут быть распечатаны с помощью:
Вы можете использовать функцию count(), для
того чтобы определить количество элементов для любого массива.
Еще одно свойство языка, это то что тип переменной определяет, какие основные
операции могут быть выполнены. Например:
Может вести себя двояко. Если $b это число, то числовое значение $c
добавляется к $b, и сумма сохраняется в $a. В этом случае тип $c не важен.
Операция управляется типом первой переменной. Если $b строка, то значение строки
$c сонкатенируется с $b, и результирующая строка помещается в $a. Это также
приводит к некоторым недоразумениям. Вам нужно прочесть раздел по перегруженным
операторам, чтобы получить лучше понимание этого факта.
В предыдущем разделе мы познакомились с ассоциативными массивами.
Ассоциативный массив - это массив, в котором индекс не обязательно должен быть
последовательным рядом числовых значений. Индексом массива может быть любое
число или строка. PHP/FI обеспечивает набор функций, чтобы манипулирования этими
ассоциативными массивами. Это: Next(), Prev(), Reset(), End(), и Key().
Иногда удобно иметь способ ссылаться на имена переменных . То есть имя
переменной может установливаться и использоваться динамически. Нормальной
переменной присваивается значение оператором типа:
При использовании ссылки на переменную берется значение переменной и
обрабатывается как имя переменной. В вышеупомянутом примере,
hello, может использоваться как имя переменной, используя два
знака $. То есть.
На этот момент определены две переменных и сохранены в дереве символов
PHP/FI:
Следовательно, оператор:
Произведет точно такой же вывод как и:
То есть. Они выведут строку: hello world
Раз уж затронуты языковые конструкции, следует сказать, что язык PHP
совершенно прост. Следующие команды используются, для управления ходом
выполнения:
Примеры:
Этот пример может быть записан в стандартном синтаксисе C:
Нет никакого различия между двумя синтаксисами. Мне лично больше нравится
использовать endif, endswitch и endwhile, так что я точно знаю, какую
конструкцию я заканчиваю. Однако, эти конструкции окончания могут быть всегда
заменены на закрывающую фигурную скобку.
Важно обратить внимание, что управление не зависит от организации блоков
скриптов внутри кода. Вы можете начать выражение if в одном блоке и закончить
выражение в другом. Например:
Этом пример наглядно демонстрирует, почему иногда желательнее использовать
ключевое слово endif вместо закрывающей фигурной скобки. Это намного более
читаемо чем следующий фрагмент:
Обе версии верны, и они будут делать одно и тоже.
Вы можете определять функции внутри программы PHP со следующим синтаксисом:
Эта функция теперь может быть вызвана из любого места в программе, после ее
определения. Типичный вызов может быть:
Определяемые пользователем функции действуют подобно внутренним функциям PHP,
Вы можете передавать им аргументы получать возвращаемое значение. Ниже
приводится синтаксис для определения функции, с 3-мя аргументами и, возвращает
их сумму:
Оператор return используется для возврата значения из функции. Только
одиночное значение может быть передано, используя этот механизм, однако, если
должно передаваться большее количество значений между функцией и основным кодом,
то для этой цели могут быть использованы глобальные переменные. Это приводит нас
к разделу по области видимости переменных.
Область видимости переменной это контекст, внутри которого она определена.
Главным образом все переменные PHP/FI имеют только одину область. Однако, внутри
определяемых пользователем функций действует локальная для функции область
видимости. Любая переменная, используемая внутри функции по умолчанию ограничена
локальной областью видимости. Например:
Эта программа ничего не выведет, так как оператор echo работает с
локальной версией переменной $a , и ей не было присвоено значение внутри
этой области видимости. Вы можете обратить внимание, что это немного отличается
от языка C, где глобальные переменные автоматически доступны функциям, если
только специально не отменяются локальным определением. Это может вызвать
некоторые проблемы, в случае когда люди могут неосторожно изменять глобальную
переменную. В PHP/FI глобальная переменная должна быть объявлена глобальной
внутри функции, если предполагается что она будет использоваться в этой функции.
Пример:
Эта прграмма выведет "3". После объявления $a и $b глобальными внутри
функции, все ссылки к любой из них будут относится к их глобальной версии. Нет
никакого ограничения на число глобальных переменных, которые могут
использоваться функцией. Однако, переменная должна существовать в глобальной
области видимости до вызова функции. Нельзя создать новые глобальные переменные
изнутри функции.
Другая важная особенность областии видимости переменных это статические
переменные. Статическая переменная существует только в локальной области
видимости, но при этом не теряет своего значения, когда выполнение программы
оставляет эту область. Рассмотрите следующий пример:
Эта функция совершенно бесполезна, так как, каждый раз при вызове, она
устанавливает $a в 0 и печатает "0". Оператор $a++, который увеличивает
переменную, не дает никакого результата, так как, как только проиходит выход из
функции переменная $a исчезает. Чтобы сделать полезную функцию подсчета, которая
не будет терять значения текущего счетчика, переменная $a объявляется
статической:
Теперь, каждый раз при вызове функции Test(), она будет печатать значение $a
и затем увеличивать его.
Без статических переменных не обойтись и в том случае, когда функция
вызывается рекурсивно. Рекурсивная функция это функция, вызывающая саму себя.
При написании рекурсивных функций требуется проявлять осторожность, так как
возможна ситуация когда функция будет вызывать саму себя постоянно. Нужно
удостовериться, что есть адекватный способ завершения рекурсии. Следующая
простая функция рекурсивно считает до 10:
PHP поддерживает полный набор математических операций, в выражениях.
Учитывается порядок операций. Следующие операторы допустимы:
Поддерживаются и скобки и порядок операций, так что следующая запись верна: Поддерживаются C-подобные операторы увеличения += и уменьшения
-= . То есть.
Это эквивалентно:
Поддерживаются C-подобные поразрядные операторы =& и
|=. То есть.
Это эквивалентно:
Вы можете зацикливать управление внутри программы PHP, используя конструкцию
while(); endwhile;.
Вышеупомянутый пример показывает использование цикла while, чтобы отобразить
содержимое массива. ПРЕДУПРЕЖДЕНИЕ, хотя язык PHP поддерживает
операторы типа ++ и -- для увеличения или
уменьшения переменной, они не обрабатываются точно так же как в языке C . В PHP
нет концепции пре- и пост- инкрементирования как это есть в С. Как объяснянолось
в разделе Конструкции
Языка, выше, тоже может быть получено и с циклом while(); endwhile;.
Выше - пример конструкции switch. Она подобна последовательности конструкций
if/elseif/else, но более легко читаема. Единственое различие между конструкцией
switch PHP и подобным ему в C - это, что в конце каждой строки используется
точка с запятой. Нет никаких двоеточий. Как объяснялось в раздел Конструкции
Языка, выше, тот же самое может быть получено с switch(); endswitch;.
Все эти конструкции могут быть конечно же вложены и использоваться друг
внутри друга, точно так же как в C. Различные файлы в каталоге примеров
дистрибуции PHP обеспечат хорошую отправную точку для изучения языка.
В предыдущих разделах говорилось относительно методво GET и POST и
переменных. Если Вы задумаетесь об этом, Вы можете увидеть проблемы защиты.
Например, если я на web странице получаю некоторые данные из базы данных и
передаю эти данные дальше в переменной с именем "data" через форму методом POST.
В следующей странице я могу обращаться к этой переменной и что-то с ней делать.
Однако, если кто-либо обратится к этой второй странице непосредственно и
поместит "?data=something" прямо после URL, то переменная устанавливается
методом GET, они действительно обошли оригинальную форму POST.
PHP предоставляет функцию SecureVar(), которая используется для того,
чтобы отметить имена переменных как безопасные. Эти безопасные переменные могут
быть установлены только непосредственно в программе PHP, либо получены из формы
методом POST. Они не могут быть установлены с использованием механизма
определения переменной методом GET. Из нашего сценария выше, если мы поместим
строку:
Где-нибудь в начале нашей второй страницы, то прием с методом GET не
cработает. Переменная "data", появилась бы пустой, если бы не была получена
непосредственно из формы методом POST на первой странице.
SecureVar() фактически принимает в качестве аргумента регулярное
выражение, так что можно задавать образцы имен переменных, которые должны
обработываться этим безопасным способом. Например,
Пожалуйста обратите внимание, что формам метода POST не свойственно
безопасность. Люди могут подражать передаче любых данных методом POST просто
выполнив команду telnet на HTTP порт вашей системы. Вы должны принять
соответствующие меры защиты, чтобы такую возможность, если есть
заинтересованность фактической защите.
Перегруженный оператор - это оператор подобный например '+' , который может
делать различные, основываясь на типах выражений, к которым он применяется.
Проблема состоит в том, что PHP понимает 3 типа переменных. Integer, Double и
String. Когда переменной впервые присваивается значение, PHP автоматически
оперделяет тип этой переменной.
То есть.
Теперь, что произойдет, если Вы сделаете что-нибудь вроде:
Синтаксический анализатор рассматривает первую часть арифметического
выражения и использует его для результата а также характер действия, которое
должно быть выполнено. В вышеупомянутом прмере, так как $a - integer, $d будет
тоже integer, и выполнение целочисленного сложения , даст результат:
Следовательно:
Результаты в:
Вышесказанное имеет смысл для меня, и как только Вы поймете это, это будет
возможно осуществимо и для вас. Однако, когда используются более сложные
выражения, это может привести к чрезвычайной путанице.
Решение состоит в механизм простого приведения типа .
Фактически все переменные автоматически преобразовываются во все 3 типа, и
только внутренний флажок отмечает, какого типа переменная, фактически. Так,
когда я говорю:
Внутри в таблице идентификаторов я сохраняю 3 версии.
Функция SetType() может перемещать флажок, указывающий тип переменной.
Это вынудит рассматривать $a, как double в дальнейшем.
Функция GetType() возвращает тип.
GetType($a) вернет, в этом случае, "double" .
Также существуют функции для того, чтобы возвратить 3 различных типа без
перемещения флажка типа.
Перегруженный оператор не изменяет характер переменных PHP, но дает Вам
некоторые инструментальные средства, для лучшей работы с ними. PHP - не нечто,
что напоминало бы не вполне развитый Perl. PHP должен быть малым и быстрым. Perl
имеет дело ловушкой перегруженных операторов, заставляя оператор вроде '+'
работать только с числами. Если Вы суммировать строки, нужно использовать
оператор '.'. Как только появляются отдельные операторы для каждого типа, это
делает язык намного более сложным. То есть. Вы не можете использовать '==' для
строк, Вам придется использовать 'eq'. Я не вижу смысла, особенно для чего-то
вроде PHP, где большинство скриптов будут довольно простыми и в большинстве
случаев, написанными непрограммистами, которые хотят язык с базовым логичным
синтаксисом, который не требует больших навыков.
Иногда бывает желательно игнорировать фатальные ошибки, о которых могут
сообщать специфические функции PHP. Например, Вы захотите игнорировать ошибки от
вызова dbmopen() и просто проверять возвращаемое значение обращения, без того,
чтобы сообщение об ошибке появлялось на экране web. Это может быть сделано,
помещая символ "@" перед именем функции. То есть.
Реальное сообщение об ошибке, которое должно было бы быть выведено, может
быть проверено во внутренней переменной PHP, $phperrmsg.
Более общий подход, для подаления вывода сообщений об ошибках - это
использование функции SetErrorReporting().
С помощью этой функции вывод сообщений об ошибках может быть заблокирован для
всех блоков программы, помещением вызова типа:
Это выключает все сообщения об ошибках. Им можно затем разрешить снова с
помощью вызова:
PHP имеет целый ряд встроенных функций. Функции точно также как и в языке C.
Некоторые из них имеют один или более аргументов, некоторые возвращают значения,
которые затем могут быть присвоены переменной или использоваться как аргумент
для другой функции. Например:
Эта запись присваивает значение, возвращаемое функцией time(),
переменной t.
Abs возвращает абсолютное значение аргумента. BinDec возвращает десятичный эквивалент двоичного числа, представленного
параметром binary_string. Самый большое число, которое может быть
преобразовано - длиной 31 бит или 4294967295 в десятичном выражении. См. также
функцию DecBin().
ChDir изменяет текущий рабочий каталог на каталог, заданный аргументом.
ChGrp изменяет идентификатор группы заданного файла. Функция ChMod изменяет права доступа к файлу, заданному аргументом.
Параметр perms задается в восьмеричном виде. ChOwn изменяет владельца заданного файла. Обратите внимание, что это будет
работать только в том случае, если PHP/FI выполняется от имени
суперпользователя (что вообще то не очень хорошая идея). Chr возвращает символ ASCII, заданный целочисленным аргументом. CloseDir закрывает каталог, открытый функцией openDir. Cos возвращает косинус аргумента, заданного в радианах. См. также Sin() и
Tan() Count возвращает число элементов в переменной типа массив. Если переменная
не является массивом, возвращаемое значение будет 1 (потому что нормальная
переменная подобна массиву с одним элементом). Если переменная не определена,
возвращаемое значение будет 0. Функция Crypt шифрует строку, используя стандартный в Unix метод шифрования
- DES . Аргументами являются строка, которую нужно зашифровать и
необязательная двух-символьная строка - затравка, служащая базой для
шифрования. См. справку по функции Crypt для вашей системы Unix, для более
полной информации. Если на вашей системе функция crypt не поддерживается, то
Вы можете использовать пакет UFC-crypt Глэда Майкла, который является паблик
домен; пакет был разработан в Дании и следовательно на него не
распространяются ограничения, накладываемые экспортными законами США, так как
Вы получаете его по ftp с сервера за пределами США. Функция Date используется для отображения времена и даты различными
способами. Функция принимает, в качестве аргументов, строку формата и время.
Если параметр, задающий время, опущен, будут использоваться текущее время и
дата . Параметр time задается в виде целого числа, в секундах начиная с Unix
эпохи - 1 января 1970. Строка форматирования используется для указания, какие
компоненты даты / времени нужно отображать и как они должны быть
отформатированы. Следующие символы распознаются внутри строки формата. Любой
неопознанный символ будет выводиться точно, как задан:
dbList выводит информацию относительно поддержки db, скомпилированной в
PHP. dbmClose просто закрывает заданный dbm файл. Это также разблокирует все
файлы блокировок, так что важно закрыть все открытые dbm файлы. dbmdelete удаляет пару ключ/содержимое, задаваемую заданным параметром key.
dbmFetch возвратит содержимое строки, связанной с данным ключом. dbmFirstKey возвращает первую ключ в dbm файле. Обратите внимание, что
никакой специфический порядок не гарантируется, так как порядок зависит от
значения хэш-таблицы, расчет которой зависит от реализации dbm . В случае
необходимости можно использовать функцию Sort, чтобы сортировать массивы
данных из dbm файла . dbmInsert вставляет новую пару данных ключ/содержимое в dbm файл. Если ключ
уже существует, вставка потерпит неудачу. dbmNextKey возвращает следующий, после заданного, ключ. Вызывая
dbmfirstkey(), и сопровождая этот вызов последовательными
обращениями к dbmnextkey() можно просмотреть каждую пару
ключ/содержимое dbm файла. dbmOpen() открывает dbm файл. Первый аргументпредставляет собой полное имя
файла dbm, с указанием пути, а второй - режим, в котором открывается файл;
режим может быть одним из: "r", "n" или "w" толко для
чтения, создание нового (подразумевается запись) и для записи соответственно.
Если используется поддержка ndbm , ndbm фактически создаст файлы
filename.dir и filename.pag. Gdbm использует только один файл,
поддерживается как обычный ascii файл, и Berkeley libdb создает файл
filename.db. Обратите внимание, что PHP организует свою собственную
блокировку файла, в дополнение к любым блокировкам, которые могут быть
выполнены непосредственно библиотекой dbm. PHP не удаляет файлы блокировок с
расширением .lck, которые он создает. Это просто для того, чтобы
использовать для файлов блокировок фиксированные иноды. Для более подробной
информации относительно dbm файлов, можно обратиться к справочной системе
Unix, или получить GNU gdbm с ftp://prep.ai.mit.edu/pub/gnu. dbmReplace(filename,key,content) DecBin возвращает строку, содержащую двоичное представление заданного, в
качестве аргумента, числа. Самое большое число, которое может быть
преобразовано ограничено длиной 31 бит или 4294967295 в десятичном
представлении. См. также функцию BinDec().
DecHex преобразовывает десятичное число в шестнадцатеричный строку. См.
также функцию HexDec().
DecOct преобразует десятичное число в восьмиричное число. См. также OctDec().
Echo не является функцией. То есть, Вы не помещаете скобки вокруг
передаваемых параметров. Используется, для отображения результатов вычисления
функций или переменных PHP. Специальные эскейп символы , \n,
\r и \t могут использоваться для вывода
символов новая строка, возврат каретки и табуляции соответственно.
Format_string необязательный аргумент, и если он не задан, не будет
выполняться никакого форматирования вывода. Строка формата подобна строке
форматирования функции printf в C . См. справку printf для более
полной информации. Одно командой echo может быть выведено до 5 выражений. Если
Вы попробуете вывести больше, то получите от синтаксического анализатора
сообщение об ошибке. Обратите внимание, что тип выражений не важен. Выражения
"автомагически" преобразуются к нужному типу в соответствии с типамт,
определенными строкой форматирования, если таковая присутствует. Если Вы
желаете отформатировать что-либо и присвоить отформатированную строку
переменной, то вместо того чтобы выводить это, используйте функцию sprintf().
Следующие преобразования допустимы,
Следующие флаги поддерживаются.
Для большинства преобразований можно задавать ширину поля и точность, как
показано в файле demo_echo.html в каталоге /examples. Задавать
модификаторы типа не обязательно, и, фактически, PHP будет жаловаться, если
модификатор типа не имеет смысла (который почти всегда имеет место). PHP
будет жаловаться относительно (и отказываться воспринимать) чего-либо, что
не распознать. Любые дополнительные параметры, которые не требуются строкой
форматирования, игнорируются. End перемещает внутренний указатель массива для данной переменной к
последнему элементу массива и возвращает значение этого элемента. Это бывает
полезно для перебора элементов ассоциативного массива в обратном порядке. См.
также Reset() и
Prev().
Следующий пример перебирает ассоциативный массив в обратном порядке:
EscapeShellCmd экранирует любые символы в строке, который могут
использоваться специальным образом при задании выполняющихся команд
шелл-оболочки. Эта функция должна использоваться, чтобы удостовериться, что
любые специальные символы, получаемые из ввода пользователя экранируются
прежде чем будут переданы функциям Exec() или
System().
Стандартное использование этой функции может быть:
Eval берет содержимое строки аргумента и, обрабатывает, это подобно мини
PHP/FI скрипту. Выполняется как отдельный скрипт PHP/FI. Любые установки или
обращения к переменным внутри eval будут из глобальной области видимости
текущего контекста оператора eval. Для строковых аргументов выполняется
подстановка переменных замена выполнена на параметрах ряда, таким образом если
в выражении нужно использовать переменные , то их нужно экранировать. Несколко
примеров:
Exec выполняет заданную команду unix, однако ничего при этом не выводит.
Функция просто возвращает последнюю строку из результатов выполнения команды.
Если нужно выполнить команду и получить все данные, переданные
непосредственно, без какого-либо вмешательства обратно, используйте функцию PassThru().
Если в качестве аргумента задан массив , то этот массив будет заполнен каждой
строкой вывода команды unix, начиная с элемента [0]. Если наряду с параметром
массива присутствует параметр return_var, то в эту переменную будет записан
код возврата выполненной команды unix. Обратите внимание, что, если Вы
собираетесь позволить чтобы данные, поступающие из ввода пользователя, были
переданы этой функции, то нужно использовать функцию EscapeShellCmd(),
чтобы удостовериться, что пользователи не смогут передать для выполнения в
системе произвольных команд. См. также функцию System().
Команда Exit используется, для завершения синтаксического анализа сразу же,
как только будет проанализирован этот тэг. Exp возвращает e, с степени arg. fclose() закрывает файл, открытый fopen().
Аргумент - на файловый дескриптор, который возвращается вызовом fopen(). Feof возвращает истину, если достигнут конец файла, заданного параметром
указателя на файловый дескриптор. fgets() считаетыват строку из файла, открытого fopen().
Аргументы - файловый дескриптор, возвращаемый fopen() и максимальное число
байт для считывания. Чтение оканчивается, когда считано максимальное число
байтов, или на конце строки. Эта функция подобна вызову fgets() в C. См. также
fputs().
Идентична fgets(), за исключением того, что эта функция пытается удалить
любые тэги HTML или тэги PHP/FI, при чтении файла. File читает весь файл и возвращает массив, каждый элемент которого,
содержит строку файла, индекс в массиве начинается с 0. FileAtime возвращает время последнего доступа к данным. Если файл не
существует, или если к нему нельзя было обратиться, эта функция возвращает -1.
FileCtime возвращает время последнего изменения. Если файл не существует,
или если к нему нельзя было обратиться по какой-либо другой причине, эта
функция возвращает -1. FileGroup возвращает идентификатор группы владельца файла. Если файл не
существует, или если к нему нельзя было обратиться по какой-либо другой
причине, эта функция возвращает -1. FileInode возвращает inode файла. Если файл не существует, или если к нему
нельзя было обратиться по какой-либо другой причине, эта функция возвращает
-1. FileMtime возвращает время последнего изменения данных. Если файл не
существует, или если к нему нельзя было обратиться по какой-либо другой
причине, эта функция возвращает -1 FileOwner возвращает универсальный идентификатор владельца файла. Если файл
не существует, или если к нему нельзя было обратиться по какой-либо другой
причине, эта функция возвращает -1. FilePerms возвращает биты доступа файла. Это - st_mode поле
структуры stat Unix. Если файл не существует, или если к нему нельзя было
обратиться по какой-либо другой причине, эта функция возвращает -1. fileSize возвращает размер файла в байтах. Если файл не существует, или
если к нему нельзя было обратиться по какой-либо другой причине, эта функция
возвращает -1. Fopen() открывает файл и возвращает указатель на дескриптор файла. Если
файл не существует, или если к нему нельзя было обратиться по какой-либо
другой причине, эта функция возвращает -1. Функция подобна вызову C fopen().
Параметр filename - относительный или абсолютный путь к файлу, который нужно
открыть, и параметр режима - один из, "r", "r+", "w", "w+", "a", "a+". См.
справку Unix по вызову fopen() для более полной информации. См. также описание
функции popen().
См. также описание функции fclose().
Пример: Fseek() устанавливает указатель файла, заданный параметром $fd; Значением
fp является значение возвращаемое вызовом fopen().
Указатель файла установливается от начала файла плюс смещение, определяемое
параметром pos. См. также ftell() и
rewind().
Fsockopen() открывает cокет соединение и возвращает указателя дескриптора
файла. Этот указатель дескриптора файла может использоваться функциями fgets, fputs и fclose.
Параметры - адрес сервера и номер порта. Возвращаемые значения: -3, если нелзя
было создать сокет, -4, если потерпела неудачу попытка поиска адреса
соответствующего имени сервера hostname , -5 если, в соединение отказано, или
закончилось тайм-аутом, -6 если потерпело неудачу вызов фактический вызов
fdopen() или -7, если потерпел неудачу вызов setvbuf(). Если номер порта равен
0, то параметр hostname будет рассматриваться как имя файла для сокета
файлового пространства имен (File NameSpace), если ваша операционная система
их поддерживает. Ftell() возвращает позицию указателя файла, заданного параметром fp,
возвращаемого обращением к fopen().
Позиция может быть использована в качестве параметра для fseek().
См. также fseek() и rewind().
GetAccDir возвращает имя каталога, где хранятся файлы PHP конфигурации
доступа. Имена файлов конфигурации доступа исходят из числового идентификатора
пользователя, чьи обращения к конфигурации они представляют. GetEnv возвращает значение значения переменной среды, заданной строкой.
Обычно эта функция не используется, так как переменные окружения доступны
PHP/FI непосредственно. Если сделанна ссылка на переменную, которая не найдена
во внутренней таблице идентификаторов, то автоматически просматривается среда
окружения. GetEnv нужно использовать, когда необходимо гарантировать, что
переменная среды окружения не будет перезаписана поверх нормальной переменной
PHP/FI. Механизмы защиты, которые полагаются на переменные, определяемые
http-сервером, таких как REMOTE_ADDR и REMOTE_HOST, должны получать значения
этих переменных, используюя GetEnv вместо того, стобы непосредственно
обращаться к ним (напр. $REMOTE_ADDR), чтобы избежать, что кто-либо, составив
фальшивую форму и передав данные на ваш сервер, сможет обойти какой-либо
механизм защиты, который мог-бы быть у вас. GetHostByName преобразует переданное имя домена в IP адрес в формате
nnn.nnn.nnn.nnn. GetHostByAddr преобразует данный IP адрес в формате nnn.nnn.nnn.nnn в
полное имя домена. GetLastAccess возвращает дату и время последнего обращения к странице, в
формате unix. Это значение может быть передано, впоследствии функции Date()
для форматирования. GetLastBrowser возвращает строку идентификации броузера, который
использовался пользователем, при последнем обращении к текущей странице.
GetLastEmail возвращает адрес Электронной почты пользователя, который
последним оброщался к текущей странице. GetLastHost возвращает имя серверас которого было последнее обращени к
текущей странице. GetLastMod возвращает дату и время, в формате unix, времени последней
модификации страницы. Это значение может быть передано функции Date() для
форматирования. GetLastRef возвращает URL, с которого было последнее обращение к странице.
GetLogDir возвращает каталог, в котором могут быть найдены журналы
регистрации PHP . Фактические файлы журналов регистрации находятся внутри
этого каталога. Каждый подкаталог представляет собой числовой идентификатор
пользователя пользователя, которому принадлежат файлы журнала регистрации .
Затем внутри каждого каталога находится ряд файлов в виде dbm, каждый с
числовым inode файла, который они представляют как первичная компонента в
имени файла. GetMyInode возвращает числовой inode текущего HTML файла. GetMyPid() возвращает текущий идентификатор процесса php. GetMyUid возвращает числовой идентификатор пользователя владельца текущего
HTML файла. GetRandMax возвращает максимально возможное случайное число, которое может
вернуть функция Rand. Если
возвращенное значение кажется, не совсем точным, смотрите файл php.h в
дистрибуции PHP для более подробной информации. GetStartLogging возвращает время и дату в, формате Unix, времени начала
регистрации на текущей странице. Более точные значения получаются при
использовании регистрации на основе mSQL, так как маркер времени хранится в
каждом из файла регистрации. Для dbm-регистрации возвращается время создания
каталог файлов регистрации пользователем. GetToday возвращает общее число обращений к текущая странице с 12
пополуночи локального времени. GetTotal возвращает общее число обращений к текущая странице , с тех пор
как была начата регистрация доступа для страницы. GetType возвращает тип переменной. Возвращаемое значение это строка,
содержащая одно из значений: "integer", "double" или "string". См. также
функци. SetType().
GmDate идентична функции Date если,
за исключением того факта, что используется время по Гринвичу. Команда Header используется в начале HTML файла, для того чтобы послать
необработанные строку HTTP заголовка. См. Спецификацию
HTTP для более полной информации относительно необработанных заголовков
http. HexDec преобразовывает шестнадцатеричный строку в десятичное число. См.
также функцию DecHex().
HtmlSpecialChars преобразовывает любые символы c ascii кодами со 160 по 255
в параметре string к их соответствующему HTML представлению. Функция
возвращает преобразованную строку. ImageArc выводит частичный эллипс, с центром в cx, cy (верхний левый угол
имеет координаты - 0,0) в изображение, представленное im. W
и h определяют ширину и высоту эллипса соответственно, в то время как
начальная и конечная точки задаются в градусах, параметрами s и e. ImageChar выводит символ c в изображение, заданное переменной im с
координатами x, y (верхний левый угол - 0,0) цветом col. Параметр размера
может быть 1, 2, 3, 4 или 5 задавая размер шрифта, который нужно использовать.
1 самый маленький, и 5 самый большой. ImageCharUp выводит символ c вертикально, в изображение, заданное im с
координатами x, y (верхний левый угол - 0,0) цветом col . Параметр размера
может быть 1, 2, 3, 4 или 5 задавая размер шрифта, который нужно использовать.
1 самый маленький, и 5 самый большой. ImageColorAllocate возвращает идентификатор цвета, представленного RGB
составляющими компонентами цвета. Параметр im - значееие возвращаемое функцией
ImageCreate.
ImageColorAllocate должна вызываться для создания каждого цвета, который
используется в изображении, представляемом im. ImageColorTransparent устанавливает прозрачный цвет для изображения im в
значение col. Im - идентификатор изображения, возвращаемый фнкцией ImageCreate,
и col - идентификатор цвета, возвращаемого ImageColorAllocate.
ImageCopyResized копирует прямоугольную область одного изображения в другое
изображение. Dst_im - изображение назначения, src_im -
идентификатор исходного изображения. Если координаты, ширина и высоты
исходного изображения и изображения получателя различаются, то будет
выполненно соответственно растяжение, или стягивание фрагмента. Координаты
задаются относительно верхнего левого угла. Эта функция может быть
использована для копирования области внутри одного и того же изображения (если
dst_im тоже что и src_im) но если регионы накладываются, то
результаты будут непредсказуемы. ImageCreate возвращает идентификатор изображения, представляющий пустое
изображение с размерами x_size и y_size. ImageCreateFromGif возвращает идентификатор изображения, представленный
изображением, полученным из заданного файла filename. ImageFilledPolygon создает заполненный многоугольник в изображении im.
Points - массив PHP, содержащий вершины многоугольника. То есть. Points[0] =
x0, points[1] = y0, points[2] = x1, points[3] = y1, и т.д. num_points - общее
количество вершины. ImageFilledRectangle создает заполненный цветом col прямоугольник в
изображении im, заданный верхней левой координатой x1, y1 и заканчивающийся
правой нижней координинатой x2, y2. 0,0 - верхний левый угол изображения.
ImageFillToBorder выполняет заливку, причем цвет у границы, изображения
определяется этой границей. Отправная точка для заливки - x, y (верхний левый
угол- 0,0) и область заполняется цветом col. ImageGif создает файл GIF, с именем filenam из изображения im. Параметр im
- значение возвращенное функцией ImageCreate.
Параметр имени файла необязательный, и если он опущен, будет возвращен
непосредственно необработанный поток изображения. Посылая content-type
image/gif, с использованием функции Header(),
Вы можете создать программу PHP/FI, которая возвращает GIF изображение
непосредственно используя эту функцию. ImageInterlace включает, либо выключает бит чередования (interlace). Если
interlace равен 1, изображение im будет отображено в режиме interlace, и если
interlace - 0, бит чередования выключается. Эта функция доступна только, если
в PHP включена поддержка GD. ImageLine рисует линию из точки x1, y1 до точки x2, y2 (верхний левый угол
- 0,0) в изображении im
цветом col. ImagePolygon создает многоугольник в изображении im.
points - массив PHP, содержащий вершины многоугольника. То есть. points[0] =
x0, points[1] = y0, points[2] = x1, points[3] = y1, и т.д. Num_points - общее
число вершин. ImageRectangle создает прямоугольник цвета col
в изображении im
начиная с верхнего левого угла с координатой x1, y1 и заканчивая правым нижним
углом с координатами x2, y2. 0,0 - верхний левый угол изображения. ImageSetPixel выводит пиксель в точке x, y (верхний левый угол - 0,0) в
изображении im
цветом col.
ImageString выводит строку s в изображение, заданное аргументом im,
координатами x, y (верхний левый угол - 0,0) и цветом col. Параметр size может
быть 1, 2, 3, 4 или 5, задавая размер шрифта, который нужно использовать. 1
самый маленький, и 5 самый большой. ImageStringUp выводит строку s вертикально в изображение, заданное im,
координатами x, y (верхний левый угол - 0,0) и цветом col. Параметр size может
быть 1, 2, 3, 4 или 5, задавая размер шрифта, который нужно использовать. 1
самый маленький, и 5 самый большой. ImageSX возвращает ширину изображения, заданного im. ImageSY возвращает высоту изображения, заданного im. Intval возвращает значение переменной, приведенное к типу long integer. См.
также функции strval() и
doubleval().
Функция IsSet возвращается 1, если данная переменная определена, и 0, если
нет. Key возвращает ключ текущего элемента массива. Текущий элемент определяется
позицией указателя массива для данной переменной. Этим указателем массива
можно управлять с помощью функций Reset(), End(), Next(), и Prev(). Эта
функция в основном используется для определения значения ключа для элемента
ассоциативного массива, хотя она также будет работать и для нормального
массива . Link() создает жесткую связь. См. функцию Symlink()
для создания символических связей. См. также функции ReadLink
и LinkInfo.
LinkInfo возвращает st_dev поле структуры stat в Unix, возвращаемой
системным вызовом lstat . Эта функция используется, чтобы проверить,
существует ли действительно связь (указанная аргументом path), (используется
тот же самый метод, что и в макрокоманде S_ISLNK, определенной в stat.h).
Возвращает -1 в случае ошибки. Файл регистрации возвращает натуральный логарифм аргумента. Log10 возвращает логарифм аргумента по основанию 10. Max возвращает максимальное значение массива PHP. То есть. Эта функция
просмотрит весь массив для поиска максимального элемента. Если это массив
строк, возвращаемая строка это строка, которая будет последней в алфавитном
порядке в массиве, если он был сортирован. MkDir создает каталог. Параметр mode должен быть задан в
восьмеричном представлении. MkTime возвращает время в представлении Unix (long integer) формат, которое
соответствует дате и времени, заданными аргументами. Параметры могут быть
опущены, в этом случае данная компонента установливается к текущему значению
согласно текущему местному времени и дате. Эти параметры могут опускаться
только справа налево. То есть допутсима запись MkTime(hour, min,
sec), а MkTime(mon, day, year) нет. Msql посылает запрос mSQL. Параметры - имя базы данных, строка запроса. То
есть. <? Msql ("MyDatabase", "select * from table")
>. Возвращаемое значение из этой функции - идентификатор
результата, который используется для того, чтобы можно было обратиться к
результатам из других функций msql. Идентификатор результата - положительное
целое число. Функция возвращает 0, в случае если не был
создан никакой идентификатор результата. Дело обстоит таким образом для любых
запросов, которые ничего не возвращают, что - нибудь, типа create,
update, drop, insert и delete. Если происходит
ошибка функция возвращает -1. Строка, описывающая ошибку
будет помещена в переменную $phperrmsg, и если функция не была вызвана как
@msql() то эта строка ошибки будет также выведена. Msql_Connect задает имя сервера или его IP адрес, на котором постоянно
находится сервер базы данных mSQL . Эта функция эквивалентна функции
msqlConnect() в mSQL C API. Одно различие между этой функцией и ее
эквивалентом С API - то, что, если функция не вызывается, то по умолчанию
устанавливается соединение с локальным серверм при первом обращении к функции
msql(). И, не имеется никакой потребности в функции msql_close, так как в
любой момент может быть активно только одно соединение. Если в файле сделано
второе обращение к msql_connect (), то соединение с первым сервером
втоматически закрывается. Чтобы явно соединиться с msql дэймоном на локальном
сервере, используйте: <? Msql_connect ("localhost")
> Msql_CreateDB создает заданную базу данных. Msql_dbName возвращает имя базы данных, сохраненное в позиции $i
результата, возвращенного функцией msql_ListDbs().
Msql_NumRows()
функция может быть использована, для того чтобы определить, сколько доступно
имен баз данных. Msql_DropDB удаляет заданную базу данных mSQL. Используйте эту функцию с
осторожностью, поскольку все данные в базе данных будут потеряны. Msql_FieldFlags возвращает флаги для заданного поля. В настоящее время это
может быть - "not null", "primery key", комбинация из этих двух или "" (пустая
строка). Msql_FieldLen возвращает длину заданного поля. Msql_FieldName возвращает имя заданного поля. Параметры функции -
идентификатор результата и индекс поля. То есть. Msql_FieldName($result,
2); возвратит имя второго поля в идентификаторе результата result.
Msql_FieldType подобна функции msql_FieldName() . Параметры идентичны, но
возвращается тип поля. Это будет один из "int", "char" или "real". Msql_FreeResult должна вызваться только, если вы волнуетесь, что ваша
программа привыполнении занимает слишком много памяти. Вся занимаемая память
будет автоматически освобождена по окончании выполнения программы. Но, если Вы
уверены, что не данные результата нигде в программе более не понадобятся, Вы
можете вызвать msql_freeresult с идентификатором результата, в качестве
аргумента, и ассоциированная с ним память будет освобождена. msql_ListDBs возвратит указатель результата, содержащий список доступных
баз данных, из текущего дэймона mSQL. Используйте функцию msql_dbName(),
чтобы перебрать этот массив указателя результата. msql_listfields отыскивает информацию относительно заданного имени таблиц
tablename. Параметры - имя базы данных, и имя таблицы. Возвращается указатель
результата, который может использоваться с msql_fieldflags, msql_fieldlen,
msql_fieldname, msql_fieldtype. Идентификатор результата - положительное целое
число. Функция возвращает -1, если произошла ошибка. Строка, описывающая
ошибку будет помещена в $phperrmsg, и если функция вызывалась не как @msql(),
будет также выведена. msql_ListTables берет имя базы данных в качестве аргумента, и возвращает
указатель результата очень похожий на тот что вовращает msql(). msql_TableName()
может быть использована для того, чтобы извлечь фактические имена таблиц из
указателя результата. Msql_NumFields возвращает количество полей в результате result. Параметр -
идентификатор результата, возвращенный функцией msql(). Msql_NumRows просто возвращает количество строк в результате result.
Параметр - идентификатор результата, возвращенный функцией msql(). Msql_RegCase берет строку в качестве аргумента и преобразовывает ее в
регулярное выражение, необходимое, чтобы послать запрос mSQL, для получения
результат независимого от регистра. Она преобразует строку типа "abc" в
"[Aa][Bb][Cc]". Msql_Result отображает поле из возвращенной записи. Параметры -
идентификатор результата, возвращенный функцией msql(), целое число, которое
является индексом записи, которую нужно просмотреть и имя поля. Параметр поля
поддерживает "table.field" синтаксис для обработки обьединения.Эту функцию
возможно лучше всего рассмотреть на примере:
Эта программа подключается к серверу mSQL на локальной машине,
устанавливает переменную name в значение bob и посылает запрос,
который запрашивает информацию о всех полях из таблицы, в которых поле
firstname установлено в значение bob. Затем программа отображает
количество найденных записей, и затем в цикле проходит по всем найденным
записям и отображает значения полей fullname и address для
каждой записи. Как можно увидеть, было бы тривиально добавить, что HTML тэги
вокруг напечатанных полей, для форматирования результатов в таблицу или любым
желаемым способом. Обратите внимание, что нет вызова connect(). Msql_connect
должна быть вызвана только если желательно подключиться к базе данных на
удаленном сервере. Msql_TableName берет указатель результата, возвращенный функцией msql_ListTables(),
также как целочисленный индекс и возвращает имя таблицы. Функция Msql_NumRows()
может использоваться для определения количества таблиц в указателе результата.
Пример:
Next перемещает внутренний указатель массива к следующему элементу массива.
Это происходит автоматически, когда к массиву обращаются, используя
не-индексированный метод ($array []). Функция возвращает значение нового
элемента. Эта функция может использоваться, чтобы переместить указатель,
вперед, без необходимости явного обращения к массиву. Можно использовать ее,
чтобы просмотреть ассоциативный массив и только выводить значения ключей
массива а не фактическое содержимое.
OctDec преобразовывает восьмиричное число в десятичное число. См. также DecOct().
OpenDir открывает заданный каталог и перемещает внутренний указатель на
начало каталога. Элементы каталога могут быть считаны, используя функцию readDir,
и каждый открытый каталог должен быть закрыт функцией closeDir.
Ord возвращает ASCII значение первого символа параметра. Pclose закрывает канал открытый с использованием функции popen().
Pg_Close закрывает соединение с базой данных Postgres95 , связанной с
данным идентификатором соединения. Pg_Connect открывает соединение с базой данных Postgres95. Каждый из
параметров представляет собой строку в кавычках, включая и номер порта.
Параметры options и tty необязательны и могут быть пустыми строками. Эта
функция возвращает идентификатор соединения connection. Этот идентификатор
необходим другим функциям Postgres95. Можно иметь множество открытых
соединений сразу. Эта функция вернет 0 при ошибке. Pg_DBname возвратит имя базы данных Postgres95, с которой связан данный
идентификатор соединения. Если при последнем обращении к базе данных произошла ошибка, для которого
существует соединение, эта функция возвратит строку, содержащую сообщение об
ошибке, сгенерированное сервером. Pg_Exec пошлет оператор SQL к базе данных Postgres95, определенной
параметром connection_id. Connection_id должен быть легальный идентификатор,
который был возвращен pg_Connect. Значение, возвращаемое этой функции, -
идентификатор, который нужно использовать, для обращения к результатам других
функций Postgres95. Эта функция возвращает 0 при ошибке,
1 когда команда выполненна правильно, но не ожидается
возвращения данных (например команды insert или update). Обратите внимание,
что select, который тоже не возвращают никаких данных, будет возвращать верный
результат больше 1. Pg_FieldName возвращает имя поля, занимающего данный номер столбца в
заданном идентификаторе результата Postgres95. Поля, нумеруются начиная с 0.
Pg_FieldPrtLen возвращает фактическую, печатаемую, длину (число символов)
заданного значения в результате Postgres95. Строки нумеруются начиная с 0.
Этот функция возвращает -1 при ошибке. Pg_FieldNum возвращает номер слота столбца, который соответствует к
field_name в данном идентификаторе результата Postgres95. Поля нумеруюются с
0. Функция возвращает -1 при ошибке. Pg_FieldSize возвращает размер памяти (в байтах) поля field_name в данном
идентификаторе результата Postgres95. Размер поля 0 указывает поле переменной
длины. Эта функция возвращает -1 при ошибке. Pg_FieldType возвращает строку, содержащую имя типа данных поля для
заданного идентификатора результата Postgres95. Поля нумеруются с 0. Pg_FreeResult должна вызваться только, если вы волнуетесь что программа
занимает слишком много памяти во время выполнения. Вся память занимаемая
результатами будет автоматически освобождена по окончании программы. Но, если
Вы уверены, данные результаты нигде в программе больше не потребуются, Вы
можете вызвать pg_freeresult с идентификатором результата, в качестве
параметра и связанная с результатом память будет освобождена. Pg_GetLastOid может быть использована для того, чтобы отыскать Oid,
присвоенный вставляемому кортежу, если последняя команда, посланная через
pg_Exec была SQL insert. Эта функция возвращает положительное целое число,
если есть справедливый Oid, и -1, если произошла ошибка, или
последняя команда, посланная через pg_Exec
была не insert. Pg_Host возвращает имя сервера, с которым соединен данный идентификатор
соединения Postgres95 Pg_NumFields возвращает количество полей (столбцов) в результате
Postgres95. Параметр - идентификатор результата, возвращенный pg_Exec. Эта
функция возвращает -1 при ошибке. Pg_NumRows возвращает число строк в результате Postgres95. Параметр -
идентификатор результата, возвращенный pg_Exec. Эта функция возвращает
-1 при ошибке. Pg_Options возвращает строку, содержащую опции, определенные заданные для
данного идентификатора соединения Postgres95. Pg_Port возвращает номер порта, с которым соединен данный идентификатор
соединения Postgres95. Pg_Result будет возвращать значения из идентификатора результата,
полученного pg_Exec. Row_number и name_field определяют ячейку в таблице,
которая будет возвращена в качестве результата. Строки нумеруюются с 0. Вместо
того, задавать имя поля, можно задавать индекс поля в виде числа без кавычек.
Индексы полей начинаются с 0.
Postgres95 имеет множество встроенных типов и здесь непосредственно
поддерживаются только основные. Все формы integer, boolean и oid типов
возвращаются как integer. Все виды типов float и real возвращаются как double.
Все другие типы, включая массивы возвращаются в виде строк, форматированных
также как они форматированы Postgres95 программах 'psql' или 'monitor'.
Поддержка для возврата массивов PHP числовых и строковых данных из
результата Postgres95 запланирована на более позднюю дату. Pg_tty возвращает, имя tty на который выводится отладочная информация
Postgres95, для заданного идентификатора соединения. PhpInfo выводит ту же самую страницу, которую Вы получите при добавлении
"?info" к URL, анализируемый PHP/FI или при выполнении непосредственно
php.cgi. Это особенно полезно для отладки программ, в случае когда PHP/FI
собран в виде модуля Apache, так как отображается ряд полезных внутренних
данных. PhpVersion возвращает номер версии выполняющегося в данный момент PHP/FI.
Popen открывает канал к команде и возвращает указатель файла. Этот
указатель файла может использоваться функциями fgets, fputs и fclose.
Параметры - команда для выполнения и режим открытия файла. Режим может быть
или "r" для чтения или "w" для записи. См. справку по библиотечной функции
popen в UNIX C для большего количества деталей. Любой файл, открытый с popen
() должен быть закрыт, функцией pclose().
Prev перемещает внутренний указатель массива для заданной переменной
variable к предыдущему элументу массива. Если указатель уже находится в начале
списка, указатель установится на первый элемент. Функция возвращает значение
нового элемента. Эта функция полезна для просмотра ассоциативных массивов в
обратном порядке. См. пример при описании End(), а
также см. Next(). PutEnv помещает заданную строку в среду окружения. Не особо полезная, так
как локальные переменные окружения затираются снаружи, когда PHP заканчивает
работу со страницей, но в некоторых случаях полезна, если где-либо в программе
PHP проверяются переменные окружения. Например, если Вы хотите выполнять
несколько процессов дэймона mSQL, нужно будет использовать PutEnv, чтобы
переключаться между различными соединениями. QuoteMeta возвращает строку, составленную из arg, в которой любые
специальные символы, используемые в регулярных выражениях, экранированы
наклонной чертой влево. Rand возвращает случайное число между 0 и RANDMAX. RANDMAX может быть
определен функцией getRandMax.
Обычно специфический диапазон выбирается, просто применяя оператор модуля к
результату. ReadDir читает следующий элемент из текущего открытого каталога. Как только
элемент считан, указатель продвигается к следующему элементу в каталоге
иследующее обращение к этой функции возвратит следующий элемент каталога.
Перед вызовом этой функции используйте openDir,
для того чтобы открыть каталог . ReadLink делает тоже что и функция C readlink и возвращает содержимое
символического связи path или -1 в случае ошибки. См. также LinkInfo.
Reg_Match возвращает не нуль, если регулярное выражение нашло соответсвтия
в строке аргумента. Например, условие, <?if (reg_match (" ^This. * ",
"This is an example string")>, будет истинно, так как выражение
"^This. *" говорит, что нужно найти слово This в начале
строки и затем могут следовать любые символы. Если параметр присутствует
regs , то match-регистры, заполняют позиции 0-10 в массиве, заданном
параметром regs. Регистр 0 будет всегда содержать полную совпавшую строку. Для
подробной информации относительно регулярных выражений, см. раздел регулярные
выражения, этого документа. Reg_Replace просматривает весь строку параметра и заменяет любые части
строки, совпавшие с данным выражением, строкой для замены. Например, в строке,
"This is an example string" мы могли бы очень легко заменять каждый
пробел на черточку с помощью команды: reg_replace(" ", "-", "This is
an example string"). Для более полной информации относительно
регулярных выражений, см. раздел регулярные
выражения, этого документа. Reg_Search просмотрит всю строку аргумента для любых пар в поисках любых
соответствий для заданного регулярного выражения. Если соответствие найдено,
она возвратит часть строки, начиная с места соответствия. Если не найдено
никаких соответствий , то возвращается строка нулевой длины. Если параметр
regs присутствует, то match регистры, заполняются в позициях 0-10
массива, заданного параметром regs. В регистре 0 всегда будет полная строка.
Для более полной информации относительно регулярных выражений, см. раздел
регулярные выражения, этого документа. Переименовывает файл из old в new. Подобна функции C rename в Unix. Reset перемещает внутренний указатель массива для заданной переменной типа
массив к первому элементу массива и возвращает значение этого элемента. Это
полезно для просмотра ассоциативных и не-индексированных массивов. См. также
End() и Next().
Следующий пример перебирает ассоциативный массив:
Return возвращает управление из текущего вызова функции и возвращает
определенное значение обратно к вызывающему оператору. См. раздел определяемые
пользователем функциям для более полной информации. rewind() сбрасывает указатель файла, заданный параметром $fd, который
является значением, возвращенным вызовом fopen(). Указатель файла
установливается в начало файла. См. также ftell() и
fseek().
RewindDir перемещает указатель текущего каталога назад к началу каталога.
Используйте функцию openDir,
чтобы открыть каталог перед вызовом этой функции. RmDir() удаляет данный каталог. См. функцию unlink() для удаления
регулярных файлов. SetCookie() определяет cookie, который будет послан наряду с остальной
частью информации заголовка. Все параметры за исключением name необязательны.
Если задан только параметр name, cookie с этим именем name будет удалено от
удаленного пользователя. Вы можете также заменять любой параметр на пустую
строку ("") чтобы пропустить этот параметр. Параметры expire и secure -
целые числа и не могут быть пропущены, указанием пустой строки. Вместо этого
используйте нуль (0). Параметр expire - регулярное целое число Unix,
задающее время, в таком-же виде, в каком возвращают его функции time() или
mktime().
ниже приводятся некоторые примеры:
Обратите внимание, что value часть cookie будет автоматически url
кодирована, когда Вы посылаете cookie, а когда получаете, автоматически
декодируется и присваивается переменной с тем же самым именем что и имя
cookie. То есть. Чтобы просмотреть содержимое нашего теста cookie в программе,
просто сделайте:
SetErrorReporting устанавливает текущее значение состояния выдачи ошибок,
по значению параметра arg. Если ненулевое, ошибки будут выводится, и
если 0 не будут. Функция возвращает предыдущую состояние о выводе ошибок . Это
- более общий способ отключения вывода сообщений об ошибках, чем,
предшествующий функциям символ '@'. См. раздел Подавление
вывода сообщений об ошибках при обращении к функциям для более полной
информации. SetLogging() разрешает или запрещает регистрацию статистики доступа для
страницы. Если параметр arg ненулевой, регистрация включена, если нуль
выключена. SetShowInfo() разрешает или запрещает вывод информационных нижних
колонтитулов внизу всех страниц, загружаемых PHP. Если параметр arg
ненулевой, нижние колонтитулы выводятся, если нуль - нет. SetType устанавливает тип переменной. Параметр type - один из, "integer",
"double" или "string". См. также функцию GetType().
Sin возвращает синус аргумента в радианах. См. также Cos() и Tan(). Sleep выполняет задержку на secs секунд. Подобна функции C sleep() в Unix.
См. также функцию USleep().
Sort используется, чтобы сортировать массив PHP в порядке возрастания.
Функция понимает три типа переменных; если массив содержит строки - сортирует
в алфавитном порядке, и численно, если массив содержит числа. В случае
массива, который содержит, смесь типов, первый тип в массиве определит метод
сортировки. Sprintf возвращает строку, созданную форматированным выводом, определяемого
параметрами format и arg. Функция подобна версии команды echo, за
исключением того что эта функция только возвращает строку, в то время как echo
отображает ее. Она подобна, также, одноименной функции C. Различием является
то, что эта версия не воспринимает множество параметров arg. Если нужно
форматировать множество параметров в одну строку, просто вызовите sprintf()
один раз для каждого параметра. Обратите внимание, что тип параметра не влияет
на вывод. Тип параметра - "автомагически" преобразуется, чтобы соответствовать
типу, определенному в строке формата. Sqrt возвращает квадратный корень параметра. Srand инициализирует генератор случайных чисел. Эта функция принимает любое
целое число в качестве аргумента. Можно для выбора инициализационного число,
использовать функцию date, чтобы задать текущее количество
прошедших секунд, по окончании минуты. Обратите внимание, что эта функция
не возвращает значение! Эта функция просто инициализирует генератор
случайных чисел для последующих обращений к функции rand().
Напр.
Strchr и strstr - фактически идентичные функции. Они могут взаимозаменямы
при использовании и включены обе в целях завершенности. Они возвращают часть
строки параметра, начиная с места, где найдена данная подстрока . Например, в
строке, "This is an example string" , вызов: <echo strstr($string, "an
") > возвратил бы строку: "an example string". Strlen возвращает длину строки. Strrchr будет искать одиночный символ, начиная с конца аргумента string,
двигаясь к началу. Она возвращает строку, начиная с символа поиска, если
символ был найден и пустую строку, если этого не произошло. Strstr и strchr -
фактически идентичные функции. Они могут использоваться взаимозаменяемо и
включены обе толко для законченности. Они возвращают часть параметра string,
начиная с места, где найдена данная подстрока . Например, в строке, "This is
an example string" выше, вызов: <? echo strstr ($string, "an")>
возвратил бы строку: "an example string". Strtok используется для разбивки строки. То есть если есть строка подобно
"This is an example string" Вы могли бы разбить эту строку на
индивидуальные слова, используя пробел как маркер. Вы использовали бы
следующую программу:
Обратите внимание, что только первое обращение к strtok использует параметр
string. Каждое последующее обращение к strtok нуждается только в маркере,
поскольку функция отслеживает, где находится в текущей строке. Чтобы начать
сначала, или приступить к разбивке новой строки, просто вызовите strtok с
параметром string снова, для инициализации. Strtolower преобразует все символы, аргумента string, в символы строчных
букв. Strtoupper преобразует все символы строки в символы верхнего регистра. Strval возвращает строковое значение переменной. См. также функции intval() и
doubleval().
Substr возвращает часть заданной строки. Позиция начала задается параметром
start. Первая позиция в строке - позиция 0. А параметр length определяет
количество символов от позиции начала. Symlink() создает символическую связь. См. функцию Link(), для
создания жестких связей. System - подобна команде system() C, в которой выполняется заданная
команда unix и выводится результат. Если в качестве второго аргумента задается
переменная , то в эту переменную будет записан код возврата выполненной
команды unix . Обратите внимание, что, если Вы собираетесь позволять данные,
вводимые пользователем были переданны этой функции System, то нужно
использовать функцию EscapeShellCmd(),
чтобы удостовериться, что пользователи не смогут таким приемом передать на
выполнение системе произвольную команду. Если нужно выполнить команду и
получить все данные, выводимые командой обратно без любого вмешательства,
использйте функцию PassThru().
См. также функцию Exec. Tan возвращает тангенс параметра в радианах. См. также Sin() и Cos() TempNam возвращает уникальное имя файла, размещенное в каталоге, заданном
аргументом path с префиксом имени файла, заданным аргументом prefix. Идентична
функции C tempnam() в Unix. Time просто возвращает текущее местное время в секундах начиная с периода
Unix (00:00:00 январь. 1 1970). Эквивалентна вызову Date("U").
Если нужна степень детализации выше чем по секундам, используйте функцию Microtime.
Unlink удаляет файл с именем filename. Подобна функции C unlink() в Unix.
См. функцию RmDir() для
удаления каталогов. UnSet сбрасывает значение заданной переменной. В случае массива, очищается
весь массив. Обратите внимание, что индивидуальные элементы массива не могут
быть сброшены этой командой. UrlEncode кодирует любые символы параметра arg, которые - не входят в
множество символов "a-zA-Z0-9_-". Заменяя их %xx, где xx - ASCII значение этих
символов в шестнадцатеричном представлении. Возвращается кодированная строка.
USleep задерживет выполнение на заданное число микросекунд. Подобна функции
C usleep() в Unix . См. также функцию Sleep().
Virtual - Apache -специфическая функция, которая является эквивалентом
<!-- #include virtual ... --> в mod_include. Она выполняет под-запрос
Apache. Это полезно для включения CGI программ или .shtml файлов, или еще
чего-либо, что должно быть передано для разбора Apache (для .phtml файлов,
лучше использовать директиву <?Include>. Может случиться так, что набор функций, обеспечиваемых PHP/FI не включает в
себя специфическую функцию, в которая может вам потребоваться. Тщательно следуя
пунктам, описанным ниже, вы сможете добавить ваши собственные функции PHP/FI.
Прежде, чем Вы начнете хачить внутреннюю организацию PHP/FI, нужно найти
копию последней версии Bison. Bison - GNU реализация YACC (Yet Another Compiler
Compiler). YACC, который шел с вашей операционной системой, может оказаться, а
может и не оказаться достаточно приемлимым, но просто чтобы удостовериться,
лучше добыть Bison. Вы можете найти его в ftp://prep.ai.mit.edu/pub/gnu.
Нужно также просмотреть Makefile и включить отладку. Просто разкомментируйте
строку DEBUG в файле Makefile. Выходной файл информации отладки
определяется переменной DEBUG_FILE в php.h. По умолчанию
установлен в /tmp/php.err. Вы можете изменять его, согласно вашим
потребностям.
Заключительная вещь которую нужно иметь в виду - то, что php выполняется с
тем же идентификатор пользователя что и httpd на вашей системе, если конечно Вы
не выполняете, его с установленным битом setuid, и этот пользователь httpd
вообще не имеет доступа для записи к различным каталогам. Это означает это, если
Вы делаете что-либо, что вызывает php к дампу памяти, Вы можете не получить файл
дампа. Простой способ решения состоит в том что нужно сделать каталог, где Вы
храните ваш тестовые .html файлы, доступным всем по записи. PHP изменяет текущий
каталог на каталог .html файла, который считаетывается, и таким образом
отбрасывать корку туда, если сможет.
В последующих шагах мы будем использовать функцию Time(), для
иллюстрирации, как добавить функцию.
если ваша функция принимает от 0 до 6 аргументов, то доступны -
предопределенные грамматики. Вы можете пропустить этот шаг.
Грамматика вашей функции определяется в файле parse.raw. Первым делом нужно
добавить лексему. Лексема - ключевое слово, из букв верхнего регистра, которое
обычно совпадает с именем вашей функции. Все лексемы определены вначале файла
parse.raw. Порядок не имеет значения. Затем нужно сформировать фактическое
правило грамматики YACC. Рассмотрите существующие правила, и найдите функцию,
которая похожа на добавляемую. Имейте в виду, что большинство нормальных
функции - стандартные функции, которые считывают параметры из стека выражений.
Ваша функция скорее всего будет отнесена к этой группе, в этом случае вам не
нужно будет трогать файл parse.raw. чтобы сделать это, подредактируйте lex.c, и найдите хэш-таблицу
вблизи верхней части файла. Найдите строку, static cmd_table_t
cmd_table[22][30] = {, которая определяет начало хэш-таблицы. [22]
[30] определяет размер 2 мерного массива, который содержит хэш-таблицу.
22 это на единицу большая максимальная длина имени функции, и 30 относится к
максимальному числу функций в любом хэш списке. Если Вы превышаете любое из
этих ограничений, просто увеличьте их прямо здесь.
Эта хэш-таблица завоевала бы в соревнованиях абсолютное звание самой
простой хэш-таблицы во всем мире. Хэш значение - это длина строки имени
функции, которую нужно хэшировать. Так для нашего примера Time(), нужно
добавить вход для значения хэша 4 . Таким образом мы добавляем следующую
строку к хэш-списку для 4:
Этот запись отображает строку на лексему INTFUNC0. Вы можете поискать
грамматику для лексемы INTFUNC0 в parse.raw, и увидете, что это - общая
грамматика для внутреннего вызова функции без параметров. Строка в кавычках,
является фактической строкой, которая будет использоваться в .html файлах, для
вызова функцию. Имейте в виду, что имена функции PHP/FI
регистронезависимы. И заключительный элемент -
UnixTime, это реально вызываемая функция. Обратите внимание, что функция является фунцией void.Это указывает, что она
не возвращает ничего. Это может показаться путанным, потому что очевидно
функция так или иначе должна возвратить время. Время возвращается, но не как
значение возвращаемое функцией. Оно помещается в то, что называется стеком
выражений. Стек выражений - просто стек строк и связанных с ними типов. PHP/FI
понимает только 3 основных типа переменных: STRING, LNUMBER и DNUMBER. STRING
- символьная строка, LNUMBER - длинное целое число, и DNUMBER - значение
double или float. В этом примере Time() , значение, которое будет возвращено -
время, выраженное в формате Unix (число секунд начиная с января. 1 1970) и -
таким образом целое число. Стек выражения принимает только строки, таким
образом мы преобразуем, с помощью sprintf, длинное целое число в строку и
помещаем это значение в стек, указывая, что это фактически является длинным
целым числом с помощью строки: Push(temp,LNUMBER); В нижней половине файла php.h Вы найдете полный список прототипов
всех функций в php. Они сгруппированы по файлам, в которых они появляются.
Просто добавьте ваш прототип к соответствующему месту в этом файле. В нашего
примера Time() будет добавлена следующая строка:
Вы должны помнить о том что нужно переделывать синтаксический анализатор
всякий раз, когда измененяется файл parse.raw. Введите: make
parser, чтобы сделать это. Затем сделайте нормальную компиляцию,
введя: make, если только это выполнено. Time() - это пример, иллюстрирующий шаги, при добавлении функции. Возможно,
что функция, которую Вы захотите добавить будет немного более сложной чем этот
пример. Возможно вы захотите передавать параметры вашей функции и манипулировать
этими параметрами каким-либо способом. Возможно вы даже захотите чтобы она
вызывалась различными способами. Эти понятия будут проиллюстрированы PHP/FI
функцией Crypt(). См. также раздел, озаглавленный Замечания по
хаканию Кода для несколько большего числа технических деталей относительно
написания кода для PHP/FI.
Грамматика Crypt() в parse.raw:
Здесь показано, как определить грамматику, которая позволяет, вызывать
функцию с 1 или 2 параметрами. Вы можете написать различные функции, чтобы
обрабатывать оба случая, или просто посылать параметр режима, как выполнено
здесь, для указания режима, в котором функция вызвана. Обратите внимание, что в
этом случае нельзя использовать одну из предопределенных INTFUNC грамматик, так
как ваша функция может принимать переменное число параметров.
Другой иллюстрируемый аспект - как фактически представить параметры функции .
В большинстве случаев Вы захотите использовать идентификатор
expr. Этот идентификатор означает, что параметр - выражение.
Выражение может быть литеральное значение, обращение к функции или комбинация
многих выражений. См. parse.raw для полного определения грамматики yacc для
выражений для большего количества деталей.
Запись Хэш-Таблицы в lex.c:
Обратите внимание, что последний элемент - NULL, в этом случае обращение к
функции обрабатывается прямо в parse.raw. Если Вы использовали INTFUNC
грамматику, то Вы поместите имя вашей функции вместо NULL. Фактическая функция
Crypt находится в crypt.c:
Наиболее важный аспект этой функции - это вызов s = Pop().
Параметры для функции должны быть вытолкнуты из стека выражений один за другим.
Когда Вы пишите функцию, которая принимает несколько аргументов, не забывайте,
что стек - это структура данных "последним пришел", "первым вышел" . Это
означает это, параметры будут выталкиваться из стека в обратном порядке.
Последний параметр выталкивается первым. В вышеупомянутом примере мы выясняем,
вызвана ли функция с 2 параметрами. Если да, параметр выталкивается из стека и
сохраняется. Затем из стека выталкивается следующий параметр. Pop() возвращает
указатель на структуру Stack (s). Структура Stack похожа на (из php.h):
Тип type будет один из STRING, LNUMBER или DNUMBER. Strval,
intval и douval компоненты - строки, integer и double
представления значения соответственно. Если выражение - фактически определенная
переменная, компонента var содержит указатель на переменную структуру,
которая определяет эту переменную.
В нашей функции Crypt() нас интересует только строковое значение параметра,
так что мы используем s->strval. Много функций PHP/FI могут делать
различные вещи в зависимости от типа переменной просто проверяя
s->type и используя s->strval, s->intval и/или
s->douval соответственно.
После вызова реальной функции Crypt() и получения
шифрованной строки, наша функции Crypt() вызывает Push(enc, STRING);
помещая возвращаемое значение в стек выражений. Нужно отметить, что стек
выражений очищается после каждой строки PHP/FI, так что, если Вы помещаете
выражения в стек, которые никогда не выталкиваются чем-либо, это не будет иметь
значения.
Вызов Debug() в примере Crypt() показывает, как добавить вывод
отладочной информации к вашей функции. Debug() - это функция с переменным
списком параметров, точно так же как printf.
Управление памятью внутри PHP/FI - сложная вещь. Так как пакет может
выполняться как модуль сервера, мы должны быть очень осторожны относительно
ресурсов памяти. Программа должна быть не только реентерабельной, но также нужно
учитывать тот факт, что мы можем получить в любое время сигнал по тайм-ауту, по
которому управление выбывает из модуля. Мы не получим никакого предупреждения, и
не будет времени, чтобы освободить память, которая может быть распределена. И
эта память должна быть освобождена, или область данных процесса httpd, с которым
мы связаны, может расти неопределенно. Это также применимо, когда PHP
выполняется в режиме CGI, так как это может быть установлено, чтобы выполниться
как постоянный процесс FastCGI .
Решение состоит в том, чтобы использовать подпулы памяти. Эти пулы
автоматически очищаются Apache, по завершению сеанса, или в случае FastCGI, эти
пулы очищаются в main.c, каждый раз, когда выполняется цикл оболочки
FastCGI. В настоящий момент используются три таких пула. Они пронумерованы 0,1 и
2. Номер подпула является первым аргументом для функций emalloc и
estrdup.
Использование подпулов полностью устраняет потребность явно освобождать
память где-либо в программе, с одним исключением - памятью распределенной, с
использованием регулярного вызова malloc различными библиотеками, которые могут
быть слинкованы в PHP. Библиотека gdbm - один из таких примеров.
Инструкции по установке
Это не важно если Вы, устанавливаете пакет в виде модуля
Apache. Если нет, Вы не можете использовать этот пакет. У многих ISP CGI
скрипты также запрещены или строго ограничены. Если на вашей системе дело
обстоит именно так, поговорите с вашим системным администратором, и попросите,
чтобы он / она взглянул на этот пакет, и посмотрите, установят ли они его для
Вас.
Итак, что же я могу делать с PHP/FI?
Во первых
обратите внимание, если страница обрабатывается PHP/FI - то, добавляется нижний
колонтитул с информацией относительно количества обращений к вашей странице ( в
том случае если Вы скомпилировали программу с опцией регистрации доступа). Это -
всего лишь малая часть того что PHP/FI может сделать для Вас. Пргорамма (модуль)
играет другую очень важную роль - интерпретатор форм cgi (часть имени FI).
Например, если Вы создаете форму на одной из ваших web страниц, то вам нужно
что-нибудь для обработатки информации связанной с этой формой. Даже если вы
хотите только передать информацию в другую web страницу, вам нужно будет иметь
программу cgi, которая это сделает. PHP/FI делает чрезвычайно простым делом
получение данных из форм и производить их обработку.
<INPUT TYPE="text" name="name">
<INPUT
TYPE="text" name="age"> <INPUT TYPE="submit">
</FORM>
<?
if($age>50);
echo "Hi $name, you are ancient!<p>"; elseif($age>30);
echo "Hi $name, you are very old!<p>"; else;
echo "Hi $name."; endif;
>
Переадресация CGI
union align {
/* Types which are likely to have the longest RELEVANT alignment
* restrictions... we don't do much with doubles.
*/
char *cp; void (*f)();
long l;
FILE *fp;
};
union align {
/* Types which are likely to have the longest RELEVANT alignment
* restrictions... we don't do much with doubles.
*/
char *cp; void (*f)();
long l;
FILE *fp; double d;
};
Проблемы защиты
Установление подлинности HTTP
<?
if(!$PHP_AUTH_USER) {
Header("HTTP/1.0 401 Unauthorized");
Header("WWW-authenticate: basic realm=\"My Realm\"");
exit;
} else {
echo "Hello $PHP_AUTH_USER.<P>";
echo "You entered $PHP_AUTH_PW as your password.<P>";
}
>
Примечания к модулю Apache
Директивы конфигурации Модуля Apache
Все эти директивы необязательные. Если директива не определена
где-нибудь, будет использоваться значение по умолчанию, заданное во время
компиляции .
Поддержка FastCGI
AddType application/x-httpd-fcgi .fcgi
AppClass
/usr/local/etc/httpd/fcgi-bin/php.fcgi -processes 4
AddType
application/x-httpd-fphp .fhtml
Action application/x-httpd-fphp
/fcgi-bin/php.fcgi
Контроль доступа
Регистрация Доступа
msqladmin create phpfi
database=phpfi
read=*
write=nobody,<your user id>
access=local
msqllog <user id>
http://your.machine.domain/cgi-bin/php.cgi/path/log.html
Относительный против Абсолютного URL - или, почему не
отображаются мои изображения?
http://my.machine/~rasmus/file.html
~rasmus/public_html/file.html
<IMG SRC="pic.gif">
http://my.machine/cgi-bin/php.cgi/~rasmus/file.html
<IMG SRC="/~rasmus/pic.gif">
<IMG SRC= "<? ECHO $PATH_DIR>/pic.gif">
Как программа PHP обрабатывает методы данных GET и
POST
/cgi-bin/php.cgi/file.html?abc+def+EMAIL_ADDR=rasmus@vex.net&var==value
$argc = 4
$argv[0] = abc
$argv[1] = def
$argv[2] = EMAIL_ADDR=rasmus@vex.net&var==value $EMAIL_ADDR = rasmus@vex.net
$var = value
?EMAIL_ADDR=
<SELECT NAME="var" MULTIPLE>
var=option2
var=option3
<SELECT NAME="var[]" MULTIPLE>
IMAGE SUBMIT и PHP
<input type=image src=image.gif name=sub>
GD (графическая библиотека для создания GIF) Поддержка в
PHP
PHP/FI и виртуальные сервера
Поддержка закачки файлов
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_"
METHOD=POST> <
INPUT TYPE="hidden" name="MAX_FILE_SIZE"
value="1000">
Send this file: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
Поддержка Cookie
SetCookie("MyCookie[]","Rasmus Lerdorf", time()+3600);
$Count++;
SetCookie("Count",$Count, time()+3600);
SetCookie("Cart[$Count]",$item, time()+3600);
Поддержка mSQL
Поддержка Postgres95
<?
$conn = pg_Connect("localhost", "5432", "", "", "mydb");
if (!$conn) {
echo "An error occured.\n";
exit;
}
$result = pg_Exec($conn, "select * from table1");
if (!$result) {
echo "An error occured.\n";
exit;
}
$num = pg_NumRows($result);
$i = 0;
while ($i < $num) {
echo "name: ";
echo pg_Result($result, $i, "name");
echo " age: ";
echo pg_Result($result, $i, "age");
echo "<BR>";
$i++;
}
pg_FreeResult($result);
pg_Close($conn);
>
Регулярные Выражения
<?$string = "This is a test";
$cnt = reg_match("\(\w*\).*\(\")
echo $cnt;
echo $regs[0];
echo $regs[1];
echo $regs[2];
>
Скрипт язык PHP/FI
Синтаксис
Каждая команда PHP начинается с тэга
<? и оконивается >. Или, команды могут
быть сгруппированы внутри одной пары <? > и отделяться
друг от друга символом ; .
<?$a = 5>
<?echo $a>
<; $a = 5; echo $a >
<
$a = 5;
echo $a;
>
Переменные
<?$a = 5>
<?$a = 5.0>
<?$a = "5">
<?
$a[0] = 5;
$a["hello"] = 6;
echo $a[0];
echo $a["hello"];
>
$a = 1;
$a[0] = 1;
$a[] = "Hello";
$a[] = "There";
echo $a[0];
echo $a[1];
$a = $b + $c;
Ассоциативные массивы
Ссылки на переменные
$a = "hello";
$$a = "world";
Имя переменной Содержимое переменной
a hello
hello hello world
echo "$a $$a";
echo "$a $hello";
Конструкции Языка
Синтаксис условных выражений подобен синтаксису в языке C.
== проверка на равенство.!= означает не равно.
Также поддерживаются: >, <,
>=, <=. Условное И -
&&, условное ИЛИ - ||.
<?
if($a==5 && $b!=0 );
$c = 100 + $a / $b;
endif;
>
<?
if($a==5 && $b!=0) {
$c = 100 + $a / $b;
}
>
<?if($a==5 && $b!=0)>
<b>Normal html text</b>
<?endif>
<?if($a==5 && $b!=0) {>
<b>Normal html text</b>
<? } >
Функции определяемые пользователем
<?
Function Test (
echo "This is a test\n";
);
>
<?
Test();
>
<?
Function Sum $a,$b,$c (
return($a+$b+$c);
);
echo Sum($a,$b,$c);
>
Область видимости переменных
$a=1; /* глобальная переменная */
Function Test (
echo $a;/* ссылка на локальную переменную */
);
Test();
$a=1;
$b=2;
Function Sum $first,$second (
global $a,$b;
$b = $a + $b;
);
Sum();
echo $b;
Function Test (
$a=0;
echo $a;
$a++;
);
Function Test (
static $a=0;
echo $a;
$a++;
);
Function Test (
static $count=0;
$count++;
echo $count;
if($count < 10 {
Test();
}
);
Математические Выражения
<? $a = 2 + 1 > Сложение
<? $a = 2 - 1 > Bычитание
<? $a = 2 * 1 > Умножение
<? $a = 2 / 1 > Деление
<? $a = 2 % 1 > Деление по модулю
<?$a = (2"+1")*3+6/3>
<? $a += $b>
<? $a = $a + $b>
<? $a &== 4>
<? $a = $a & 4>
Циклы While
<?
$a=0;
while($a <100) {
$a++;
echo $list[$a];
}
>
Конструкция Switch
PHP поддерживает switch конструкцию очень похожую на эквивалентную в C.
Безопасные Переменные - Победа над взломами метода
GET
<?SecureVar("data")>
<?SecureVar(".*data.*")>
Отметит любую переменную со словом "data" где-нибудь в имени, как
являющуюся безопасной.
Перегруженные Операторы и работа с типами данных
$a = 1; Тип будет integer
$b = 1.5; Тип будет double
$c = "1"; Тип будет string
$d = $a + $c;
$d = 2 Тип integer
$d = $c + $a
$d = "11" Тип - string
$a = 1;
Integer: 1 <--- flag
Double: 1.0
String: "1"
SetType($a,"double");
IntVal($a) вернет 1
DoubleVal($a) вернет 1.0
StrVal($a) вернет "1"
Подавление Ошибок при обращении к функциям
$err_code = @dbmopen($filename,"w");
SetErrorReporting(0);
SetErrorReporting(1);
Внутренние функции
<?$t=time()>
Алфавитный Список функций
Все эти флажки зависят от того,
поддерживает ли их ваша функция printf библиотеки C (''', например, является
расширением GNU).
<?
Reset($array);
$first_key = key($array);
End($array);
$k = key($array);
while($k != $first_key);
echo $array[$k];
prev($array);
$k = key($array);
endwhile;
echo $array[$k];
>
<?system(EscapeShellCmd($cmd))>
$a = "echo phpversion();";
eval($a);
eval("echo phpversion();");
eval("\$a=1; echo \$a;");
$fp = fopen("/home/rasmus/file.txt","r");
Эта функция доступна, только если PHP компилировался с
опцией регистрации доступа.
Эта функция доступна, только если PHP компилировался с опцией регистрации
доступа.
Эта функция доступна, только если
PHP компилировался с опцией регистрации доступа.
Эта функция доступна, только если PHP компилировался с
опцией регистрации доступа.
Эта функция доступна, только если PHP компилировался с
опцией регистрации доступа.
Эта функция доступна, только если PHP компилировался с опцией регистрации
доступа.
Эта функция доступна, только если PHP
компилировался с опцией регистрации доступа.
Эта функция доступна,
только если PHP компилировался с опцией регистрации доступа.
Эта
функция доступна только, если в PHP включена поддержка GD .
Эта функция доступна только, если в
PHP включена поддержка GD.
Эта функция доступна только, если в
PHP включена поддержка GD.
Эта функция доступна
только, если в PHP включена поддержка GD.
Эта функция доступна только, если в PHP включена поддержка GD.
Эта функция доступна только, если в PHP
включена поддержка GD.
Эта функция доступна только, если
в PHP включена поддержка GD.
Эта функция доступна
только, если в PHP включена поддержка GD.
Эта функция доступна только, если в PHP включена поддержка GD.
Эта функция доступна только, если в PHP включена поддержка GD.
Эта функция доступна только, если в PHP включена
поддержка GD.
Эта функция доступна только, если в PHP включена поддержка GD.
Эта функция доступна только,
если в PHP включена поддержка GD.
Эта функция доступна только, если в
PHP включена поддержка GD.
Эта функция доступна только, если в PHP включена поддержка GD.
Эта функция доступна только, если в PHP включена поддержка
GD.
Эта
функция доступна только, если в PHP включена поддержка GD.
Эта функция доступна только, если в PHP включена поддержка GD.
Эта функция доступна только, если в
PHP включена поддержка GD.
Эта функция доступна только, если в
PHP включена поддержка GD.
Эта функция доступна только на операционных
системах, которые поддерживают системный вызов gettimeofday() .
Эта
функция доступна только, если в PHP разрешена поддержка mSQL .
Эта функция доступна только, если в PHP разрешена
поддержка mSQL.
Эта функция доступна
только, если в PHP разрешена поддержка mSQL .
Эта функция доступна только, если в PHP разрешена
поддержка mSQL.
Эта
функция доступна только, если в PHP разрешена поддержка mSQL.
Эта функция доступна только, если в PHP разрешена поддержка mSQL.
Эта функция доступна
только, если в PHP разрешена поддержка mSQL.
Эта функция доступна только, если в PHP разрешена поддержка mSQL.
Эта
функция доступна только, если в PHP разрешена поддержка mSQL.
Эта функция
доступна только, если в PHP разрешена поддержка mSQL.
Эта функция доступна
только, если в PHP разрешена поддержка mSQL.
Эта функция доступна только, если в PHP разрешена
поддержка mSQL.
Эта функция доступна только, если в PHP разрешена
поддержка mSQL.
Эта функция
доступна только, если в PHP разрешена поддержка mSQL.
Эта
функция доступна только, если в PHP разрешена поддержка mSQL.
Эта функция доступна только, если в PHP разрешена
поддержка mSQL. <?
$name = "bob";
$result = msql($database,"select * from table where firstname='$name'");
$num = msql_numrows($result);
echo "$num records found!<p>";
$i=0;
while($i < $num);
echo msql_result($result,$i,"fullname");
echo "<br>";
echo msql_result($result,$i,"address");
echo "<br>";
$i++;
endwhile;
>
Эта функция доступна только, если в PHP разрешена
поддержка mSQL. <?
$result = msql_listtables("dbname");
$i=0;
while($i < msql_numrows($result));
$tb_names[$i]=msql_tablename($result, $i);
echo $tb_names[$i];
echo "<BR>";
$i++;
endwhile;
>
Эта функция доступна только, если в PHP разрешена поддержка mSQL.
<?
Reset($array);
$i=0;
while($i < count($array)); echo key($array);
next($array);
$i++;
endwhile;
>
Эта функция доступна только если в PHP
включена поддержка Postgres95.
Эта
функция доступна только если в PHP включена поддержка Postgres95.
Эта функция доступна только если в PHP включена
поддержка Postgres95.
Эта функция доступна только если в PHP
включена поддержка Postgres95.
Эта функция доступна только если в PHP включена
поддержка Postgres95.
Эта функция доступна только если в PHP включена поддержка Postgres95.
Эта функция
доступна только если в PHP включена поддержка Postgres95.
Эта функция доступна
только если в PHP включена поддержка Postgres95.
Эта функция
доступна только если в PHP включена поддержка Postgres95.
Эта
функция доступна только если в PHP включена поддержка Postgres95.
Эта функция
доступна только если в PHP включена поддержка Postgres95.
Эта функция доступна только если в PHP включена поддержка
Postgres95.
Эта функция доступна только если в PHP включена
поддержка Postgres95.
Эта функция доступна
только если в PHP включена поддержка Postgres95.
Эта функция доступна только если в PHP
включена поддержка Postgres95.
Эта функция доступна только
если в PHP включена поддержка Postgres95.
Эта функция доступна только если в PHP включена
поддержка Postgres95.
Эта функция
доступна только если в PHP включена поддержка Postgres95.
Эта функция доступна
только если в PHP включена поддержка Postgres95. <?
Reset($array);
$i=0;
while($i < count($array));
echo $array[]; /* pointer automatically moves ahead one */
$i++;
endwhile;
>
SetCookie("TestCookie","Test Value");
SetCookie("TestCookie",$value,time()+3600); /* expire in 1 hour */
SetCookie("TestCookie",$value,time()+3600,"/~rasmus/",".utoronto.ca",1);
echo $TestCookie;
<?srand(date("s")>
<?
$string = "This is an example string";
$tok = strtok($string," ");
while($tok);
echo "Word=$tok<br>";
$tok = strtok(" ");
endwhile;
>
Добавление ваших собственных внутренних функций к
PHP/FI
{ "time",INTFUNC0,UnixTime },
void UnixTime(void) {
char temp[32];
sprintf(temp,"%ld",(long)time(NULL));
Push(temp,LNUMBER);
}
void UnixTime(void);
%token CRYPT
.
.
.
| CRYPT '(' expr ',' expr ')'
{
if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(1);
}
| CRYPT '(' expr ')'
{
if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(0);
}
{ "crypt",CRYPT,NULL },
/*
* If mode is non-zero, a salt is expected.
* If mode is zero, a pseudo-random salt will be selected.
*/
void Crypt(int mode) {
#if HAVE_CRYPT
Stack *s;
char salt[8];
char *enc;
salt[0] = '\0';
if(mode) {
s = Pop();
if(!s) {
Error("Stack error in crypt");
return;
}
if(s->strval) strncpy(salt,s->strval,2);
}
s = Pop();
if(!s) {
Error("Stack error in crypt");
return;
}
if(!salt[0]) {
salt[0] = 'A' + (time(NULL) % 26);
salt[1] = 'a' + (time(NULL) % 26);
salt[2] = '\0';
}
enc = (char *)crypt(s->strval,salt);
#if DEBUG
Debug("Crypt returned [%s]\n",enc);
#endif
Push(enc,STRING);
#else
Error("No crypt support compiled into this version");
#endif
}
/* Expression Stack */
typedef struct Stack {
short type;
unsigned char *strval;
long intval;
double douval;
VarTree *var;
struct Stack *next;
} Stack;
Примечания для хакания кода