php 程序设计代码

                     
讲到 PHP 的全名就蛮有趣的,它是一个巢状的缩写名称,"PHP: Hypertext Preprocessor",打开缩写还是缩写。PHP 是一种 HTML 内嵌式的语言 (类似 IIS 上的 ASP)。而 PHP 独特的语法混合了 C、Java、Perl 以及 PHP 式的新语法。它可以比 CGI 或者 Perl 更快速的执行动态网页。PHP 最初是在西元 1994 年 Rasmus Lerdorf 开始计画发展。在 1995 年以 Personal Home Page Tools (PHP Tools) 开始对外发表第一个版本。在这早期的版本中,提供了访客留言本、访客计数器等简单的功能。随后在新的成员加入开发行列之后,在 1995 年中,第二版的 PHP 问市。第二版定名为 PHP/FI(Form Interpreter)。PHP/FI 并加入了 mSQL 的支援,自此奠定了 PHP 在动态网页开发上的影响力。在 1996 年底,有一万五千个 Web 站台使用 PHP/FI;在 1997 年中,使用 PHP/FI 的 Web 站台成长到超过五万个。而在 1997 年中,开始了第三版的开发计划,开发小组加入了 Zeev Suraski 及 Andi Gutmans,而第三版就定名为 PHP3。PHP3 跟 Apache 伺服器紧密结合的特性;加上它不断的更新及加入新的功能;并且它几乎支援所有主流与非主流资料库;再以它能高速的执行效率,使得 PHP 在 1999 年中的使用站台超过了十五万!!它的原始码完全公开,在 Open Source 意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函式库加入,以及不停地更新的活力,使得 PHP 无论在 UNIX 或是 Win32 的平台上都可以有更多新的功能。它提供丰富的函式,使得在程式设计方面有着更好的支援。PHP 的第四代 Zend 核心引擎已经进入测试阶段。整个剧本程式的核心大幅更动,让程式的执行速度,满足更快的要求。在最佳化之后的效率,已较传统 CGI 或者 ASP 等程式有更好的表现。而且还有更强的新功能、更丰富的函式馆。无论您接不接受,PHP 都将在 Web CGI 的领域上,掀起巅覆性的革命。对于一位专业的 Web Master 而言,它将也是必修课程之一。PHP 在资料库方面的丰富支援,也是它迅速窜红的原因之一,它支援下列的资料库或是资料表:
  • Adabas D
  • DBA
  • dBase
·         dbm
  • filePro
  • Informix InterBase
  • mSQL
  • Microsoft SQL Server
  • MySQL
  • Solid
  • Sybase
  • ODBC
  • Oracle 8
  • Oracle
  • PostgreSQL
而在 Internet 上它也支援了相当多的通讯协定 (protocol),包括了与电子邮件相关的 IMAP, POP3;网管系统 SNMP;网路新闻 NNTP;帐号共用 NIS;全球资讯网 HTTP 及 Apache 伺服器;目录协定 LDAP 以及其它网路的相关函式。除此之外,用 PHP 写出来的 Web 后端 CGI 程式,可很轻易的移植到不同的作业平台上。例如,先以 Linux 架的网站,在系统负荷过高时,可以快速地将整个系统移到 SUN 工作站上,不用重新编译 CGI 程式。面对快速发展的
程式介面
PHP
ASP
CGI
NSAPI
ISAPI
作业系统
均可
Win32
均可
均可
Win32
Web伺服器
数种
IIS
均可
Netscape Server
IIS
执行效率
极快
极快
稳定性
中等
最高
开发时间
中等
修改时间
中等
程式语言
PHP
VB
不限
C/C++
C/Delphi
网页结合
学习门槛
极高
函式支援
不定
中等
系统安全
极差
最佳
尚可
使用站台
超多
极少
改版速度
其中的 PHP 可用在数种 Web 伺服器上;传统 CGI 就不限是哪种作业系统或 Web 伺服器平台;NSAPI 一定要在 Netscape 的伺服器 (如 Netscape Enterprise Server 或 FastTrack Server) 上才可以执行,但可支援多种作业系统 (UNIX 或 Win32);ASP 及 ISAPI 只在 IIS 上有完整的功能。在稳定性上,由于 NSAPI 或 ISAPI 是动态连结的方式,因此在执行若出现问题,会使得 Web 伺服器一起瘫痪。而 ASP 在吾人实际应用经验上,隔阵子就会使系统不稳定,需要重开作业系统。PHP 在许多的站台使用上,不但长期使用都没有问题,而且程式的稳定性也不错。当然最稳的还是传统 CGI 程式,因为它是由作业系统负责控制,不会因 CGI 程式的错误导致 Web 伺服器的不稳定。在开发及维护时间上,PHP 及 ASP 都有不错的表现。而 NSAPI 及 ISAPI 则需要长时间的开发过程,在稳定上线后,这二种介面反倒是效率最佳的方法。传统的 CGI 程式则要视开发工具语言而定了,用 Perl 或是 shell script 不需要编译的过程,直接就可以执行,若用 Delphi 或 VC/BCB 甚至用组合语言等都要经过编译才能执行,至于用 VB 来写传统 CGI,唉....。要比较和网页结合的能力,PH和 ASP 是并驾齐驱的,其它的方式就不能内嵌 HTML 语法了。而这也是影响开发时间的因素之一。就系统安全性而言,ASP 是最差的,在没有经过微软的 IIS Service Pack 处理过,使用 ::$DATA 就可以看到 ASP 的原始码,这真是叫人不敢领教。当然,传统 CGI 的程式,由于是由作业系统直接管理,要破解的难度最高,骇客必须由作业系统下手,而不能由 Web 伺服器下手。PHP 在许多商业及非商业使用时,也没有听过有什么安全的问题。在新增功能及改版方面,传统的 CGI 由于不受任何语言限制,没有这方面的问题。PHP 是最有活力的,数天至数周就有一个新版本出现,每次的新版,就代表更多的功能及修正更多的错误。其它的 ASP、NSAPI、ISAPI 就视它的 Web 伺服器改版速度了,ASP 要等到 IIS 5.0 出现时才会有 ASP 3.0,也就是要等到 Windows 2000 正式上市。综言之,在 Web 的后端 CGI 程式,就像鱼与熊掌一般,没有高效能又开发方便的选择。不过相信 PHP 是处于开发容易、效能亦不错的平衡点上。
PHP 与其它 CGI 的比较/
Internet,这是长期规划的最好选择。
在加入其它的模组之后,提供了更多样的支援如下:
  • 英文拼字检查
  • BC 高精确度计算
  • 西洋历法
  • PDF 档案格式
  • Hyperwave 伺服器
  • 图形处理
  • 编码与解码功能
  • 杂凑处理
  • WDDX 功能
  • qmail 与 vmailmgr 系统
  • 压缩档案处理
  • XML 解析
除此之外,一般语言有的数学运算、时间处理、档案系统、字串处理、行程处理等功能,它一样都不缺。再加上它是免费的系统,使得成本与效益比,几乎等于无限大!
环境需求与准备工作
在安装 PHP 做为 WWW 伺服器的一部份时,我们可以考虑用 UNIX 作业系统;或者是 Windows NT/95 等 Win32 API 的平台。当然,大部份的人都会使用 UNIX 来当作 PHP 的执行平台 (在 Windows NT 的使用者大多数都会选择 IIS + ASP),因此,本书的所有内容以及范例程式都是在 UNIX 上为主。实际上,Linux + Apache + PHP 应是最经济的选择,因为这样的组合几乎是不用钱的,成本与效益比这也是最好的选择。而许多成功站台的经验,更是采用这种组合最好的背书。
Linux 作业系统方面,您可以选择各式的 Linux 套件,包括 Slackware Linux、RedHat、OpenLinux、SuSE....等等,反正这方面的软体在坊间也是很容易而且很便宜就可以买到。对学生而言,也可以去各大 FTP 站下载完整的系统安装。
Apache 伺服器则是目前最多 WWW 网站所采用伺服器。您可以至 http://www.apache.org 下载最新版的程式及相关文件,若您觉得从国外下载要很久的话,也可以用它的 Mirror 站台下载。/PHP 则可以去它的官方网站 http://www.php.net 下载所需要的程式。
虽然目前 WindowsNT 或者 Windows98 等 Win32 的作业平台也能安装 PHP 及 Apache 伺服器,不过这似乎没什么道理,因为 PHP 和 Apache 在 UNIX下可以跑得更快更好。当然,若想使用商业化的作业平台,SUN、IBM、HP、DEC、SGI、NEC 等公司都有提供相关的 UNIX 或者是 WindowsNT 的作业平台。加上高安全性调整过后的 Apache 伺服器:Stronghold 或是其它支援 SSL 的 Apache 版本。这种组合,相信能满足商业化的需求。而 PHP 就扮演着快速方便的 CGI 角色,让客户对站台的服务品质更加满意。快速设定及安装
以下是基本的安装动作,作业环境是 UNIX 系列的作业平台。在安装之前,要先下载 apache_1.3.x.tar.gz 及 php-3.0.x.tar.gz 二个档案。可以将这二个档案放在 /usr/src 中再开始执行以下的动作。而下面每个行号后的动作都是整串字连在一起的,在这可能会分行而造成误会。
1.        gzip -d -c apache_1.3.x.tar.gz | tar xvf -
2.        gzip -d -c php-3.0.x.tar.gz | tar xvf -
3.        cd apache_1.3.x
4.        ./configure --prefix=/www
5.        cd ../php-3.0.x
6.        ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
7.        make
8.      make install
9.        cd ../apache_1.3.x
10.     ./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a
11.     make
12.     make install
第一、二行利用 gzip 及 tar 加上管道功能,将压缩档解压还原。然后在 Apache 的原始档目录中执行环境设定,--prefix 选项指示 Apache 的安装目录路径。之后进入 PHP3 的原始档目录中,若没有 MySQL 资料库,则可省略 --with-mysql 的选项,重要的是一定要加入 --with-apache 选项,而且 Apache 原始档的路径要正确。设定完 PHP3 之后就编译、安装到 Apache 的原始档目录中。之后在 Apache 原始档目录中再加入 PHP 的模组档。在编译及安装 Apache 之后就初步完成了。之后就是要设定 Apache 才能让 Web Server 顺利运作。
值得注意的是,PHP 要和任何资料库连线,都要在执行这些动作之前先将资料库设好,并确定 Web Server 上可以顺利存取资料库系统。若有需要其它的一些 PHP 外部模组也要先设定好这些模组。
13.     cd ../php-3.0.x
14.     cp php3.ini-dist /usr/local/lib/php3.ini
之后将 php3.ini 放在指定的目录,若有需要,也可以手动修改 php3.ini 档档,以符合使用的要求。
在 Apache 伺服器的设定方面,要在 Apache 的设定档 httpd.conf 或 srm.conf 档案中加入下面的字串。告诉 Apache 伺服器,副档名 php3 是一个特殊的程式档案。当然副档名可以设成别的副档名,还有一些站台将 php 的程式副档名设为 phtml 也是不错的选择,反正这就要看 Webmaster 的规划了。
AddType application/x-httpd-php3 .php3/在 PHP 4.x 版的方法大致和 PHP 3.0.x 版相同,不同的地方在于 PHP 4.x 的目录名称及编译后的模组放置目录不同。此外,内定的副档名也由 .php3 变成了 .php。当然在安装前还是要先下载 PHP 4.x 的程式才行。
1.        gzip -dc apache_1.3.x.tar.gz | tar xvf -
2.        gzip -dc php-4.0.x.tar.gz | tar xvf -
3.        cd apache_1.3.x
4.        ./configure --prefix=/www
5.        cd ../php-4.0.x
6.        ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
7.        make
8.        make install
9.        cd ../apache_1.3.x
10.     ./configure --prefix=/www --activate-module=src/modules/php4/libphp4.a
11.     make
12.     make install
13.     cd ../php-4.0.x
14.     cp php.ini-dist /usr/local/lib/php.ini
在 httpd.conf 或 srm.conf 加入
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
而 PHP 4.x 版中对 Apache 伺服器加入了新的环境变数设定项。
php_value [PHP directive name] [value]
php_flag [PHP directive name] [On|Off]
php_admin_value [PHP directive name] [value]
php_admin_flag [PHP directive name] [On|Off]
在 PHP 3.0.x 版中,有些目录可能会有 .htaccess 的档案,使用 PHP 4.0.x 版的系统,必须将这个档案拿掉,可以使用改名字的方式或者直接删除。
13.   当一切设定好了之后,重新执行 Apache 伺服器。在 Apache 目录下有 bin 或是 sbin 的目录,其中会有 apachectl 的 shell 程式,输入 apachectl restart 就可以重新启动 Apache 伺服器了。赶快试看看 hello, world 程式吧!
PHP 的编译设定细部选项
在细部选项上,除了上述的安装简述外,也可以在编译时加入其它的选项。
阿帕契模组
语法: --with-apache=DIR
说明:用本选项可以让 PHP 以阿帕契的模组方式使用,DIR 的字串可以是 /usr/local/apache 或其它安装阿帕契的目录
范例: --with-apache=/var/lib/apache
fhttpd 伺服器模组
语法: --with-fhttpd=DIR
说明:若使用 fttpd 伺服器,可以使用本指令编译 PHP。用模组的方式配合 fttpd 伺服器,可以有较好的效能。
Adabas D 资料库
语法: --with-adabas=DIR
说明:资料库系统为 Adabas D 资料库时需要加本选项。关于 Adabas D 资料库的细节,可以参考 http://www.adabas.com。
范例: --with-adabas=/usr/local/adabasd
dBase 资料表
语法: --with-dbase
说明:只要加本选项,不用其它的参数或函式库,PHP 就会让系统有存取 dBase 资料表的功能。
filePro 资料库
语法: --with-filepro
说明:不用指定资料库路径及其它函式库等,可以读取 filePro 资料库 (唯读)。
mSQL 资料库
语法: --with-msql=DIR
说明:提供存取 mSQL 资料库。更多的细节请参考 mSQL 的网站 http://www.hughes.com.au。
范例: --with-msql=/usr/local/Hughes
MySQL 资料库
语法: --with-mysql=DIR
说明:提供存取 MySQL 资料库。更多的细节请参考 MySQL 的网站 http://www.tcx.se。
范例: --with-mysql=/usr/local/mysql
iODBC 资料库装置
语法: --with-iodbc=DIR
说明:提供 ODBC 资料库装置,用来存取后端资料库。更多的细节请参考 iODBC 的网站 http://www.iodbc.org。
范例: --with-iodbc=/usr/local/iodbc
OpenLink ODBC 资料库装置
语法: --with-openlink=DIR
说明:使用 OpenLink ODBC 资料库装置,用来存取后端资料库。更多的细节请参考 OpenLink ODBC 的网站 http://www.openlinksw.com。
范例: --with-openlink=/usr/local/openlink
Oracle 资料库
语法: --with-oracle=DIR
说明:使用 Oracle 资料库。Oracle 的版本要在 7.3 版以上。您也可以在 PHP 程式中使用环境变数 ORACLE_HOME 来指定 Oracle 的路径。更多有关 Oracle 的资讯请参考 Oracle 的网站 http://www.oracle.com。
范例: --with-oracle=/export/app/oracle/product/7.3.2
PostgreSQL 资料库
语法: --with-pgsql=DIR
说明:使用 PostgreSQL 资料库。更多有关 PostgreSQL 的资讯请参考 PostgreSQL 的网站 http://www.postgreSQL.org 或台湾的 Mirror 站 http://postgresql.ccit.edu.tw。
范例: --with-pgsql=/usr/local/pgsql
Solid 资料库
语法: --with-solid=DIR
说明:使用 Solid 资料库。更多有关 Solid 的资讯请参考 Solid 的网站 http://www.solidtech.com。
范例: --with-solid=/usr/local/solid
Sybase 资料库
语法: --with-sybase=DIR
说明:使用 Sybase 资料库。更多有关 Sybase 的资讯请参考 Sybase 的网站 http://www.sybase.com。
范例: --with-sybase=/home/sybase
Sybase-CT 资料库
语法: --with-sybase-ct=DIR
说明:使用 Sybase-CT 资料库。
范例: --with-sybase-ct=/home/sybase
Velocis 资料库
语法: --with-velocis=DIR
说明:使用 Velocis 资料库。有关 Velocis 资料库的进一步资料请参考 Raima 公司的网站 http://www.raima.com。
范例: --with-velocis=/usr/local/velocis
自订 ODBC 资料库驱动程式
语法: --with-custom-odbc=DIR
说明:使用自订的 ODBC 函式库。当然,在使用本方式时要指定 CUSTOM_ODBC_LIBS 及 CFLAGS 变数。例如在 QNX 机器上使用 Sybase SQL Anywhere 时可能要设定系统环境变数 CFLAGS=-DODBC_QNX、LDFLAGS=-lunix 及 CUSTOM_ODBC_LIBS="-ldblib -lodbc",并要在 PHP 设定加入 --with-custom-odbc=/usr/lib/sqlany50
范例: --with-custom-odbc=/usr/local/odbc
不使用 ODBC 资料库驱动程式
语法: --disable-unified-odbc
说明:使用本选项将使所有的 ODBC 资料库驱动程式不作用。本选项不用指定路径,而受本选项影响的选项有 --with-iodbc、--with-solid、--with-adabas、--with-velocis 及 --with-custom-odbc。
LDAP 目录协定
语法: --with-ldap=DIR
说明:若要使用目录协定 (Lightweight Directory Access Protocol, LDAP) 则必须要打开本选项。有关 LDAP 的细节,可以参考 RFC 文件的 RFC1777 及 RFC1778。
范例: --with-ldap=/usr/local/ldap.
mcrypt 编码函式库
语法: --with-mcrypt=DIR
说明:当安装了 mcrypt 函式库后,可在编译 PHP 时加入本选项,让程式可以使用编解码功能。
范例: --with-mcrypt=/usr/local/include
Sys V 信号
语法: --enable-sysvsem
说明:要使用 SysV 的信号 (semaphores) 机制,则要打开本选项。
XML 支援
语法: --with-xml
说明:打开本选项可以支援 James Clark's 写的 XML 剖析程式库。
维护模式
语法: --enable-maintainer-mode
说明:本选项一般不会打开,除非是 PHP 开发人员比较有用。
常规表示程式库
语法: --with-system-regex
说明:若您需要额外的常规表示功能,可以加入本选项。
PHP 设定档
语法: --with-config-file-path=DIR
说明:用来指定 php3.ini 或 php4.ini 的路径,供 PHP 初始化时使用。
范例: --with-config-file-path=/usr/local/lib
PHP 执行路径
语法: --with-exec-dir=DIR
说明:有时为了系统的安全性考量,会指定 PHP 程式一定要在哪个目录执行。
范例: --with-exec-dir=/usr/local/bin
除错模式
语法: --enable-debug
说明:本选项一般不会使用,除非在开发 PHP 程式时比较有用。它可以显示额外的错误讯息。
安全模式
语法: --enable-safe-mode
说明:内定值是打开的,可以对系统安全提供比较多的保护。
变数追踪
语法: --enable-track-vars
说明:让 PHP 能追踪 HTTP_GET_VARS、HTTP_POST_VARS 及 HTTP_COOKIE_VARS 三个变数,一般是打开的。
自动加引入字元
语法: --enable-magic-quotes
说明:可让程式在执行时自动加入反斜线的引入字元。
开启除错器
语法: --enable-debugger
说明:打开内建的 PHP 除错器。目前本功能还在实验阶段,尚未成熟。
取消路径 (discard path)
语法: --enable-discard-path
说明:打开这个选项,使用者就不能透过浏览器读取 .htaccess 等和系统安全相关的档案。
高精确度数学函式
语法: --enable-bcmath
说明:打开高精确度函式。必须要先安装本函式库,本选项方有效。
强迫 CGI 重导
语法: --enable-force-cgi-redirect
范例:若使用 CGI VERSION 模式来执行 PHP 的设,打开本选项会增加安全性。例如使用者读 http://my.host/cgi-bin/php/secret/doc.html 遇到比较了解 PHP 系统的骇客级使用者可能会自已输入以下网址 http://my.host/secret/doc.html 来读取相关资讯。若 PHP 和 Apache 编译在一起,让 PHP 变成 Apache 的一部份,则不需要加入本选项。
不使用短的标记
语法: --disable-short-tags
说明:设定本选项后,PHP 的程式就不能使用短的 <? .... ?> 标记,一定要用 <?php ...... ?> 的长标记。
引入远端档案
语法: --enable-url-includes
说明:设定本选项可让 PHP 程式可以引入 (include) 远端的 HTTP 或 FTP 伺服器中的档案。
关闭语法效果
语法: --disable-syntax-hl
说明:使用本选项会关闭 PHP 语法的彩色效果。
函式库路径
语法: CPPFLAGS=-IDIR LDFLAGS=-LDIR
说明:若 PHP 在安全或编译所需的函式库在特别的路径,需要加入本选项,LDFLAGS 表示函式库的路径,CPPFLAGS 表示标头档的路径。
范例: LDFLAGS=-L/my/lib/dir CPPFLAGS=-I/my/include/dir ./configure
php.ini 设定细部选项

php.ini 或 php3.ini 是 PHP 在启动时会读取的设定档。该档的存放路径为 /usr/local/lib/。在 PHP 3.x 版的设定档为 php3.ini;而在 PHP 4.x 版改为 php.ini。若 PHP 安装成伺服器的模组,则在 Web 伺服器启动执行时会读取,之后就不再读取,因此更动设定的话要重新启动 Web 伺服器。若使用独立 PHP CGI 方式,则每次都读一次。
要看目前的系统设定,可以用 phpinfo() 看到。以下为选项设定
php_value name value
设定变数名称和值。本选项需 PHP 4.x 版之后方可使用。
php_flag name on|off
设定旗标布林变数选项。本选项需 PHP 4.x 版之后方可使用。
php_admin_value name value
设定 Apache 的设定档变数。原来在 .htaccess 的设定改到这个选项设定。本选项需 PHP 4.x 版之后方可使用。
php_admin_flag name on|off
设定布林变数当旗标。本选项需 PHP 4.x 版之后方可使用。
asp_tags boolean
设定 PHP 程式是否剖析以 ASP Script 语法 <% %> 的标记 (tag)。本选项在 PHP 3.0.4 之后才可使用。更多的细节可以参考 嵌入方法 的部份。
auto_append_file string
设定本选项可以让指定的档案附加在原 PHP 程式后面自动执行。若 PHP 程式中有用到 exit() 函式,则指定的档案不会执行。参数 string 即为指定自动执行的档案。
auto_prepend_file string
设定本选项可以让指定的档案在原 PHP 程式之前自动执行。参数 string 即为指定自动执行的档案。
cgi_ext string
本选项设定 CGI 程式的副档名。
display_errors boolean
本选项设定是否要将执行的错误讯息显示在使用者的浏览器上。
doc_root string
设定伺服器的文件及 PHP 档案放置的根目录。
engine boolean
本选项需要使用阿帕契的模组方式使用 PHP。可设定是否要使用 PHP 引擎。在 httpd.conf 中加入 php3_engine on/off 亦可设定某目录或某虚拟站台是否要用 PHP 解译器。
error_log string
本选项用来设定错误记录档。在 UNIX 系统上参数 string 即为档名。Windows NT 会将记录记在事件检视器的日志之中。Windows 95/98 则不支援系统记录。
error_reporting integer
本选项用来设定系统记录的等级。参数 integer 即为等级的级数旗标,可以加在一起,内定值为 7,见下表
级数
说明
1
一般的错误
2
一般的警告
4
剖析错误
8
非关键的警告
open_basedir string
本选项用来设定提供 PHP 存取的最底层目录。从该指定目录之下的档案或目录,PHP 程式方可存取。使用本选项主要是为了系统安全性的考量。参数 string 即为欲限制的最底层目录节点。值得注意的是在 UNIX 系统中,若该节点之下的档案或目录有符号链结 (symbolic link),则可能会让使用本选项的目的打折,因此在目录的设计上考量,也是 Webmaster 的重要任务。内定值是所有档案均可存取。在 PHP 3.0.7 版之后,可以设定多个底层目录。
gpc_order string
设定 GET/POST/COOKIE 三种模组的顺序及规则。参数 string 即为欲设定的规则,例如:设定成 "GP" 表示忽视 cookie,并在存取方法 (method) 相同时,以 POST 取代 GET。
ignore_user_abort string
内定值为 Off。用来设定当传输未完成时,使用者端断线是要继续处理。
include_path string
为 PHP 程式中 require、include 及 fopen_with_path 等函式的档案搜寻路径。在 UNIX 或 Windows 中的斜线方向不同。
log_errors boolean
指定程式错误时是否要记录在 log 档中。
magic_quotes_gpc boolean
设定 GET/POST/COOKIE 三种模组的特殊字元,包含单引号、双引号、反斜线、及空字元 (NUL) 是否要自动加入反斜线当溢出字元。
magic_quotes_runtime boolean
设定传回资料是否自动加入反斜线当溢出字元。
magic_quotes_sybase boolean
设定 sybase 资料中单引号要自动加上反斜线当溢出字元。
max_execution_time integer
设定程式最久执行时间。单位是秒。
memory_limit integer
设定程式最多使用多少记忆体。
short_open_tag boolean
设定是否使用短的 PHP 标记 (<? ?>)。若不使用,则必须要用 <?php 作为程式的开头,若要使程式合乎 XML 的标准则要关闭本功能。
track_errors boolean
打开本选项可使最后的错误讯息跟着全域变数 $php_errormsg。
track_vars boolean
打开本选项可让使用者输入的字串自动剖析到变数之中,而不用自己处理。
upload_tmp_dir string
指定上传档案暂存路径。
user_dir string
指定使用者自家目录的路径。
warn_plus_overloading boolean
若打开本选项,字串间就只能用英文的句号 (.) 连结,而不能用加号 (+) 连结字串。
SMTP string
在 Windows 系列作业系统中,用来指定 SMTP 伺服器,供 mail 函式使用。参数 string 为 SMTP 伺服器名字。
sendmail_from string
设定 "From: " 字串供 Windows 系列作业系统使用 mail 函式。
sendmail_path string
设定 sendmail 程式的放置路径。例如 /usr/sbin/sendmail。
safe_mode boolean
设定 PHP 在安全模式下执行。
safe_mode_exec_dir string
设定安全模式程式执行的路径。
debugger.host string
指定远端除错的伺服器名称,可以是 IP 或 Domain Name。
debugger.port string
设定远端除错伺服器的埠号 (port)。
debugger.enabled boolean
设定是否可以为除错模式。
enable_dl boolean
本选项要使用阿帕契模组 (Apache module) 的方式才有效。用来设定 PHP 的 dl() 函式可否作用。当系统处于安全模式 (safe-mode) 时,本选项 enable 也无法使用 dl() 函式。
extension_dir string
设定动态函式的路径。
extension string
PHP 启动时所要载入的动态扩充功能。
mysql.allow_persistent boolean
设定是否允许 MySQL 资料库长期连线 (persistent connections),会影响 mysql_pconnect() 函式。
mysql.max_persistent integer
设定每个处理程序最多保持几个 MySQL 长期连线。
mysql.max_links integer
设定每个处理程式最多开几个 MySQL 连线,包括长期连线。
msql.allow_persistent boolean
设定是否允许 mSQL 资料库长期连线 (persistent connections),会影响 msql_pconnect() 函式。
msql.max_persistent integer
设定每个处理程序最多保持几个 mSQL 长期连线。
msql.max_links integer
设定每个处理程式最多开几个 mSQL 连线,包括长期连线。
pgsql.allow_persistent boolean
设定是否允许 Postgres 资料库长期连线 (persistent connections),会影响 pg_pConnect() 函式。
pgsql.max_persistent integer
设定每个处理程序最多保持几个 Postgres 长期连线。
pgsql.max_links integer
设定每个处理程式最多开几个 Postgres 连线,包括长期连线。
sybase.allow_persistent boolean
设定是否允许 Sybase 资料库长期连线 (persistent connections),会影响 sybase_pconnect() 函式。
sybase.max_persistent integer
设定每个处理程序最多保持几个 Sybase 长期连线。
sybase.max_links integer
设定每个处理程式最多开几个 Sybase 连线,包括长期连线。
sybct.allow_persistent boolean
设定是否允许 Sybase-CT 资料库长期连线 (persistent connections),内定值是开启的。
sybct.max_persistent integer
设定每个处理程序最多保持几个 Sybase-CT 长期连线。内定值为 -1 表示无限制。
sybct.max_links integer
设定每个处理程式最多开几个 Sybase-CT 连线,包括长期连线。内定值为 -1,表示没有限制。
sybct.min_server_severity integer
设定 Sybase-CT 伺服器错误报告的最少笔数。内定值为 10。
sybct.min_client_severity integer
设定 Sybase-CT 客户端错误报告的最少笔数。内定值为 10。
sybct.login_timeout integer
设定 Sybase-CT 最久可以使用的登入时间。内定值为 1 分钟。
sybct.timeout integer
设定 Sybase-CT 的 query 操作时间限制。内定值为无限制。
sybct.hostname string
设定 Sybase-CT 可连线机器名称。内定值不设限
ifx.allow_persistent boolean
设定是否允许 Informix 资料库长期连线 (persistent connections),会影响 ifx_pconnect() 函式。
ifx.max_persistent integer
设定每个处理程序最多保持几个 Informix 长期连线。
ifx.max_links integer
设定每个处理程式最多开几个 Informix 连线,包括长期连线。
ifx.default_host string
设定 Informix 内定连线的伺服器名称,供 ifx_connect() 或 ifx_pconnect() 函式使用。
ifx.default_user string
设定 Informix 内定连线的使用者帐号,供 ifx_connect() 或 ifx_pconnect() 函式使用。
ifx.default_password string
设定 Informix 内定连线的使用者密码,供 ifx_connect() 或 ifx_pconnect() 函式使用。
ifx.blobinfile boolean
设定 Informix 长位元物件模式,0 表在记忆体;1 表在档案中。亦可以在 PHP 程式中使用 ifx_blobinfile_mode() 函式来修改。
ifx.textasvarchar boolean
设定 Informix 文字模式内定值,0 表传回 blob 的代码;1 表传回 varchar 字串。亦可在 PHP 程式中使用 ifx_textasvarchar() 函式来修改设定。
ifx.byteasvarchar boolean
设定 Informix 位元组模式内定值,0 表传回 blob 的代码;1 表传回 varchar 字串。亦可在 PHP 程式中使用 ifx_byteasvarchar() 来修改设定。
ifx.charasvarchar boolean
设定 Informix 传回字串的字尾空格是否要自动去除。
ifx.nullformat boolean
设定 NULL 栏位的传回方式,true 表示传回字串 NULL,false 表格传回字串 ""。亦可在 PHP 程式中以 ifx_nullformat() 修改。
bcmath.scale integer
设定 BC 高精确度函式库的小数点位数。
browscap string
设定浏览器的开档能力名。
uodbc.default_db string
设定 ODBC 内定连线的资料库名称,供 odbc_connect() 或 odbc_pconnect() 函式使用。
uodbc.default_user string
设定 ODBC 内定连线的使用者帐号,供 odbc_connect() 或 odbc_pconnect() 函式使用。
uodbc.default_pw string
设定 ODBC 内定连线的使用者密码,供 odbc_connect() 或 odbc_pconnect() 函式使用。
uodbc.allow_persistent boolean
设定是否允许 ODBC 资料库长期连线 (persistent connections),会影响 odbc_pconnect() 函式。
uodbc.max_persistent integer
设定每个处理程序最多保持几个 ODBC 长期连线。
uodbc.max_links integer
设定每个处理程式最多开几个 ODBC 连线,包括长期连线。
以下和 session 有关的设定值,都在 PHP 4.x 以上的版本方支援。在 php.ini 的设定档中。
session.save_handler
定义 session 储存资料的档案名称。内定值为 files。
session.save_path
定义 session 储存资料的档案路径。内定值为 /tmp。
session.name
设定 session 所使用的 cookie 名称。内定值为 PHPSESSID。
session.auto_start
设定 session 是否自动开启。内定值为 0 (否)。
session.lifetime
设定 cookie 送到浏览器后的保存时间,单位为秒。内定值为 0,表示直到浏览器关闭。
session.serialize_handler
定义连续/解连续资料的标头,本功能只有 WDDX 模组或 PHP 内部使用。内定值为 php。
session.gc_probability
设定每笔要求回应时的废物蒐集 (gc, garbage collection) 处理机率。内定值为 1。
session.gc_maxlifetime
设定废物被清除前的存活秒数。
session.extern_referer_check
决定参照到客户端的 Session 代码是否要删除。有时在安全或其它考量时,会设定不删除。内定值为 0。
session.entropy_file
设定 session 代码建立时,使用外部高熵值资源或档案来建立,例如 UNIX 系统上的 /dev/random 或 /dev/urandom。
session.entropy_length
设定 session 从高熵值资源读取的位元组数。内定值为 0。
session.use_cookies
设定是否要将 session 变成 cookie 存在使用者端。内定值为 1,表是开启本功能。
如何写作 PHP 程式

若只会用 Frontpage、Dreamweaver 的所见即所得编辑模式来写网页,而完全不懂 HTML 的语法,恐怕要先下点功夫了解 HTML 语法,才能顺利的写 PHP 程式了。若早就极度了解 HTML 幕后排版语言的语法,那么应该可以马上开始 PHP 的程式写作了。在 PHP 这种后端伺服器的程式语言,下苦功去学习 HTML 是写作的必备条件。
对熟悉 Windows 系列作业平台的使用者,有套软体倒是在开发 PHP 程式上是蛮方便的,就是 PHP Editor,若对这软体有兴趣,不妨到 http://www.soysal.com/PHPEd 下载最新的版本。同时还需要下载 PHP 程式 Win32 的版本。安装妥 PHP Win32 版后,在 PHP Editor 中设定好 PHP Win32 的路径,就可以让您轻松地开发 PHP 程式了。至于在写作 PHP 程式的工作平台上,有没有 Web 伺服器倒是不重要,因为在 PHP Editor 的环境中写好的程式,按下执行的键后,由 PHP Editor 直接将所写的 PHP 程式送给 PHP Win32,并将执行结果处理后,呈现在使用者的面前。
若您和笔者一样,对 Linux/UNIX 很偏执,或许可以尝试使用 Bluefish: 蓝鱼 PHP 写作工具,只要装好 Linux 及 X-Window 之后就可以使用了。要使用中文的话,需要在 X-Window 加入中文的字型及输入法,要方便的话,使用 RedHat 加上 CLE 中文支援就好了。
假使您已是老 Linux/UNIX 了,也不喜欢使用这些专门的开发工具。相信您对 vi 或是 Emacs 一定相当熟悉,那么就在装妥 Web 伺服器和 PHP 程式后,直接用 vi 或 Emacs 写 PHP 程式就可以了,并且可以直接看到执行的真正结果,和资料库或是其它的伺服程式连结,也不会有什么问题。这种「所写即所得」的方式,岂不痛快!!
语法
hello, world

在 K&R 二教授的经典名著 The C Programming Language 一书中的 "hello, world" 几乎已经变成了所有程式语言的第一个范例。因此,在这儿也用 PHP 来写个最基本的 "hello, world" 程式。
这十行程式在 PHP 中不需经过编译等复杂的过程,只要将它放在设定好可执行 PHP 语法的伺服器中,将它存成档案 helloworld.php 好了。在用户的浏览器端,只要在 Location: 输入 http://some.hostname/helloworld.php,就可以在浏览器上看到 hello, world 字串出现。
我们可以看到,这个程式只有三行有用,其它六行都是标准的 HTML 语法。而它在传回浏览器时和 JavaScript 或 VBScript 完全不一样,PHP 的程式没有传到浏览器,只在浏览器上看到短短的几个字 "hello, world"。<html>
<head>
<title>First program</title>
</head>
<body>
<?php
  echo "hello, world/n";
?>
</body>
在第六行及第八行,分别是 PHP 的开始及结束的嵌入符号。第七行才是伺服器端执行的程式。在这个例子中,"/n" 和 C 语言的表示都一模一样,代表换行的意思。在第一章也有介绍过 PHP 是混合多种语言而成,而 C 正是含量最多的语言。在一个叙述式结束后,要加上分号代表结束。
嵌入方法
要将 Homepage 中放入 PHP,有以下数种做法
<? echo ("这是一个 PHP 语言的嵌入范例/n"); ?>
1.        <?php echo("这是第二个 PHP 语言的嵌入范例/n"); ?>
2.        <script language="php"> 
echo ("这是类似 JavaScript 及 VBScript 语法
的 PHP 语言嵌入范例");
</script>
3.        <% echo ("这是类似 ASP 嵌入语法的 PHP 范例"); %>
其中第一种及第二种是最常用的二个方法,在小于符号加上问号后,可以加也可以不加 php 三个字,之后就是 PHP 的程式码。在程式码结束后,加入问号大于二符号就可以了。第三种方法对熟悉 Netscape 伺服器产品的 Webmaster 人员而言,有相当的亲切感,它是类似 JavaScript 的写作方式。而对于从 Windows NT 平台的 ASP 投向 PHP 的使用者来说,第四种方法似曾相似,只要用 PHP 3.0.4 版本以后的伺服器都可以用小于百分比的符号开始,以百分比大于结束 PHP 的区段,但想用第四种方法的使用者别忘了在 php.ini 加入 asp_tags 或是在编译 PHP 时加入--enable-asp-tags的选项,才能使第四种方法有效。建议少用第四种方法,当 PHP 与 ASP 原始码混在一起时就麻烦了。
其实,在写作 PHP 的程式最好的方法,就是先处理好纯 HTML 格式的 Homepage 文件之后,再将需要变数或其它处理的地方改成 PHP 程式。这种方法,可以让您在开发上达到事半功倍的效果。
引用档案
PHP 最吸引人的特色之一大概就是它的引用档案了。用这个方法可以将常用的功能写成一个函式,放在档案之中,然后引用之后就可以呼叫这个函式了。
引用档案的方法有二种:require 及 include。二种方式提供不同的使用弹性。
require 的使用方法如 require("MyRequireFile.php"); 。这个函式通常放在 PHP 程式的最前面,PHP 程式在执行前,就会先读入 require 所指定引入的档案,使它变成 PHP 程式网页的一部份。常用的函式,亦可以这个方法将它引入网页中。
include 使用方法如 include("MyIncludeFile.php"); 。这个函式一般是放在流程控制的处理区段中。PHP 程式网页在读到 include 的档案时,才将它读进来。这种方式,可以把程式执行时的流程简单化。
在 PHP 的官方网站中,每页都可以看到原始程式,更是处处看到这二种引入档案的方法。
程式注解
在 PHP 的程式中,加入注解的方法很灵活。可以使用 C 语言、C++ 语言或者是 UNIX 的 Shell 语言的注解方式,而且也可以混合使用。这可以让每个写 PHP 网页程式的 Webmaster 或 Programmer 发展出属于自己的写作风格。
<?php
  echo "这是第一种例子。/n"; // 本例是 C++ 语法的注解
  /* 本例采用多行的
     注解方式      */
  echo "这是第二种例子。/n";
  echo "这是第三种例子。/n"; # 本例使用 UNIX Shell 语法注解
?>
不过在使用多行注解时请注意,不能让注解陷入巢状回圈当中,否则会引起错误。
<?php
/*
echo "这是错误的示范。/n"; /* 巢状注解会引起问题 */
*/
?>
常数型态
PHP 在常数中定义了以下一些常数。
__FILE__
这个内定常数是 PHP 程式档名。若引用档案 (include 或 require)则在引用档案内的该常数为引用档案名,而不是引用它的档案名。
__LINE__
这个内定常数是 PHP 程式行数。若引用档案 (include 或 require)则在引用档案内的该常数为引用档案的行,而不是引用它的档案行。
PHP_VERSION
这个内建常数是 PHP 程式的版本,如 '3.0.8-dev'。
PHP_OS
这个内建常数指执行 PHP 剖析器的作业系统名称,如 'Linux'。
TRUE
这个常数就是真值 (true)。
FALSE
这个常数就是伪值 (false)。
E_ERROR
这个常数指到最近的错误处。
E_WARNING
这个常数指到最近的警告处。
E_PARSE
本常式为剖析语法有潜在问题处。
E_NOTICE
这个常式为发生不寻常但不一定是错误处。例如存取一个不存在的变数。
这些 E_ 开头形式的常数,可以参考 error_reporting() 函式,有更多的相关说明。
当然在程式写作时,以上的内定常数是不够用。define() 的功能可以让我们自行定义所需要的常数。见下例
<?php
define("COPYRIGHT", "Copyright &copy; 2000, netleader.126.com");
echo COPYRIGHT;  
?>
变数型态
PHP 的变数型态不多,有以下五种:
  • string
  • integer
  • double
  • array
  • object
string 即为字串变数,无论是单一字元或数千字的字串都是使用这个变数型态。值得注意的是要指定字串给字串变数,要在头尾加上双引号 (例如: "这是字串")。在欲让字串换行时,可使用溢出字元,也就是反斜线加上指定的符号,若是 /x 加上二位数字,如 /xFE 即表十六进位字元,详见下表:
符号
意义
/"
双引号
//
反斜线
/n
换行
/r
送出 CR
/t
跳位 (TAB)
integer 为整数型别。在 32 位元的作业系统中,它的有效范围是 -2,147,483,648 到 +2,147,483,647。要使用 16 进位整数可以在面加 0x。
double 为浮点数型别。在 32 位元的作业系统中,它效范围是 1.7E-308 到 1.7E+308。
array 为阵列变数,可以是二维、三维或者多维阵列,其中的元素也很自由,可以是 string、integer 或者 double,甚至是 array。
object 为物件变数,目前在 PHP 中的物件不多,若论及物件,Microsoft 的 ASP 物件仍然较 PHP 的内定物件多,相信这有赖大家的努力。不过话又说回来,Web CGI 程式要求的是效率,以完全物件导向的方式,恐怕使用者在浏览时也会因为程式执行速度慢而很不耐烦吧。
要使用变数,只要在英文字串前面加个钱号 $ 即可,目前变数名称仍不能使用中文。至于变数的大小写是不一样的,对开发 PHP 程式的 TEAM 来说,最好使用相同的变数使用风格,以免届时因为变数大小的问题,花许多无谓的时间去找寻问题点,那就麻烦了。
以下为变数的使用范例:
$mystring = "我是字串";
$WilsonPeng = "真是认真的作者";
$NewLine = "换行了/n";
$int1 = 38;
$int2 = 49;
$hexint = 0x10;
$float1 = 1.732;
$float2 = 1.4E+2;
$MyArray1 = array("子", "丑", "寅", "卯");
$MyArray2 = array(
              "地支" => array("子", "丑", "寅", "卯"),
              "生肖" => array("鼠", "牛", "虎", "兔"),
              "数字" => array(1, 2, 3, 4)
            );
物件的使用上就比较麻烦了,要先宣告类别,甚至必须先要方法,方可使用物件,如下例:
class foo {
  function do_foo () { 
    echo "Doing foo."; 
  }
}
$bar = new foo;
$bar -> do_foo ();
更多有关物件的讨论,参考 物件
此外,还有布林值 (boolean),通常 1 即为 true,0 为 false。
在变数之间,若要转换型态,在 PHP 程式中是很自由的,直接就拿来用了,不必经过特殊的转换函式。当然,浮点数转成整数就有点牵强了,不过可以将浮点数转成字变数的使用
就像大部份的结构化程式,有所谓的全域变数与区域变数,PHP 在这方面也是有相同的处理方式。
在 PHP 的程式执行时,系统会在记忆体中保留一块全域变数的区域。实际运用时,可以透过 $GLOBALS["变数名称"] 将需要的变数取出。在使用者自定的函式或程序中,就可以用 $GLOBALS 阵列取出需要的变数。当然别忘了 PHP 的变数有分大小写,搞错了大小写可是叫一百年,变数也不会出来。
$GLOBALS 阵列是 PHP 程式中比较特殊的变数,不必宣告,系统会自动匹配相关的变数在里面。在函式中,也不必管 $GLOBALS 阵列是否已经做全域宣告,就可以直接使用了。
和 $GLOBALS 变数类似的还有 $php_errormsg 字串变数。若 PHP 的设定档 (php.ini/php3.ini) 中的 track_errors 选项打开的话,会有全域变数 $php_errormsg 可以看到错误的讯息。
在 PHP 中,全域变数的有效范围 (scope) 仅限于主要程式中,不会影响到函式中同名的变数,也就是全域变数与区域变数互不侵犯。若要变数能通透到函式中,就要用到 $GLOBALS 阵列或是使用 global 宣告。
例如,在自行开发的函式中,要取得目前执行 PHP 程式页面的档名,就可以用 $GLOBALS["PHP_SELF"] 取出 $PHP_SELF 的值。
<?php
// 本程式使用 $GLOBALS 阵列
function myfunc() {
echo $GLOBALS["PHP_SELF"];
}
myfunc();
?>
下面是错误的示范,请勿模仿,上面的才是正确的示范。
<?php
// 这是错误的示范
function errfunc() {
echo $PHP_SELF;
}
errfunc();
?>
但是这个错误的示范要是改成下例就没问题了
<?php
// 本程式使用全域宣告
function myfunc() {
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
?>
在变数前面加上 global 的名称,就是宣告该变数为全域变数。用这种方式,就不需使用 $GLOBALS 阵列,也能让变数进入自行开发的函式中。
接下来先看静态变数的例子
<?php
// 静态变数的例子
function myfunc() {
static $mystr;
$mystr.="哈";
echo $mystr."<br>/n";
}
myfunc();   // 哈
myfunc();   // 哈哈
myfunc();   // 哈哈哈
?>
函式在执行时所产生的变数,在函式结束时就消失了,有时因为程式的需要,函式在回圈中,当不希望变数在每次执行完函式就消失的话,静态变数 (static variable) 就派上用场了。上例中,使用 $mystr 变数之前,先在变数前面加上 static,即表示变数 $mystr 是静态变数,当每次执行 myfunc() 函式时,$mystr 的值会一直增加,每执行一次就多一个哈字。若将 static 的静态变数宣告拿掉,就没办法累加哈字了。
<?php
// 不是静态变数的例子 (错误的)
function myfunc() {
$mystr.="哈";
echo $mystr."<br>/n";
}
myfunc();   // 哈
myfunc();   // 哈
myfunc();   // 哈
?>
再看一个比较实际的例子,它是处理表格的颜色,让隔行的颜色不同。
<?php
function TdBackColor() {
static $ColorStr;
if ($ColorStr=="808080") {
$ColorStr="c0c0c0";
} else {
$ColorStr="808080";
}
return($ColorStr);
}
echo "<table border=1>/n";
for ($i=0; $i<10; $i++) {
$ColorStr=TdBackColor();
echo "<tr><td bgcolor=".$ColorStr.">这是第".$i."行</td></tr>/n";
}
echo "</table>";
?>
PHP 的变数使用技巧上,最令人觉得不可思议的则是变数的变数 (variable variable)。这是充分利用 PHP 特性玩出的特殊技巧
<?php
$a = "Hello";
$$a = "world";
echo "$a, $hello";   // Hello, world
echo "$a, {$a}";    // 也是 Hello, world
?>
mdean@kcnet.com 举出一个更绝的例子 (24-Apr-1999),他称为变数的函式 (variable function)
<?php
function myCallbackFunction()
{
print("Hello from callback");
}
function myFunction($callback)
{
$callback();
}
// call to myFunction passing callback
// function as parameter
myFunction("myCallbackFunction");
?>
至于使用者在 FORM 中输入的资料,要怎么处理呢?要是在 PHP 的设定档中,track_vars 设为 On 时,直接使用变数名字就好了。如下例,next.php 在执行时,系统会自动产生二个变数 $username 及 $sex,直接使用就好了,比起传统的 CGI 要自己剖析,PHP 实在是太神奇了。
<form action=next.php method=post>
姓名: <input type=text name="username"><br>
性别: <input type=text name="sex"><br>
<input type=submit>
</form>
由于 PHP 许多语法都是 C 语言的翻版,故 PHP 在使用变数时,随时都可以使用新的变数,只要在使用前将变数初始化就好了,不必像 Pascal 语言那样严谨,所有要使用的变数都要事先宣告。这当然有好处与坏处:好处是使用方便、自由;坏处就是常常因这些自由而付出相当大的代价除错。在程式码短的 PHP 程式当然不成问题,当程式在数百数千行,甚至 include 或 require 好几层之后,问题就浮现出来了。无论如何,保持良好的写作习惯才是避免浪费青春的方法。串,也是很好处理。运算符号
运算符号可以用来处理数字、字串及其它需要比较运算的条件。PHP 的运算符号和 C 语言的运算符号与很类似,对于有经验的程式设计人员,应可以很顺利的掌握 PHP 的运算符号。
不同的运算符号,其实还是有优先顺序,就像小时候在学数学时,老师会教:先乘除、后加减。在 PHP 的运算优先顺序可以参考下面的表格,在混合式的情形下,愈往下表示优先权愈高。至于符号代表的意义,散见于以下的章节中。
运算符号 结合规则
, 左至右
or 左至右
xor 左至右
and 左至右
.=     &=     |=     /=     %=     ^=     =     +=     -=     *= 左至右
?    : 左至右
|| 左至右
&& 左至右
| 左至右
^ 左至右
& 左至右
==    != 不限
<     <=     >=     > 不限
<<     >> 左至右
+     -     . 左至右
*     /     % 左至右
!     ~     ++     --     @ 右至左
[] 右至左
就像先哲说的:物有本末、事有终始,知所先后,则近道矣,在运算时只要照着运算优先顺序写出来的程式,应该不会发生结果和预期不同的情形。在写作时多注意细节,可以减少除错的痛苦!算术运算
算术运算 (arithmetic operators) 符号,就是用来处理四则运算的符号,这是最简单,也最常用的符号,尤其是数字的处理,几乎都会使用到算术运算符号。
符号 意义
+ 加法运算
- 减法运算
* 乘法运算
/ 除法运算
% 取余数
++ 累加
-- 递减
以下为简单的算术运算范例
<?php
$a = 8;
$b = 2;
$c = 3;
echo $a+$b."<br>/n";
echo $a-$b."<br>/n";
echo $a*$b."<br>/n";
echo $a/$b."<br>/n";
echo $a%$c."<br>/n";
$a++;
echo $a."<br>/n";
$c--;
echo $c;
?>
字串运算
---------------------------------------------------------------------
字串运算 (string operator) 的运算符号只有一个,就是英文的句号 .。它可以将字串连接起来,变成合并的新字串。
以下是字串运算的例子
<?php
$a = "PHP 4";
$b = "功能强大";
echo $a.": ".$b;
?> 设定运算
设定运算 (assignment operator) 有时会让人搞得一头雾水,不过它可以让程式更精简,增加程式的执行效率。
符号 意义
= 将右边的值连到左边
+= 将右边的值加到左边
-= 将右边的值减到左边
*= 将左边的值乘以右边
/= 将左边的值除以右边
%= 将左边的值对右边取余数
.= 将右边的字串加到左边
<?php
$a = 5;
$a += 2;    // 即 $a = $a + 2;
echo $a."<br>/n";
$b = "哇";
$b .= "哈";   // $b = "哇哈";
$b .= "哈";   // $b = "哇哈哈";
echo "$b<br>/n";
?>
位元运算 -----------------------------------------------------------------PHP 的位元运算子 (bitwise operators) 共有六个,提供数字做一些快速而低阶的运算。欲了解更多有关位元运算的资讯,可以参考离散数学方面的书籍。
符号
意义
&
且 (And)
|
或 (Or)
^
互斥 (Xor)
<<
向左移位
>>
向右移位
~
取 1 的补数
逻辑运算 -------------------------------------------------------------------------逻辑运算 (logical operators) 通常用来测试真假值。最常见到的逻辑运算就是回圈的处理,用来判断是否该离开回圈或继续执行回圈内的指令。
符号 意义
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于
&& 而且 (And)
and 而且 (And)
|| 或者 (Or)
or 或者 (Or)
xor 互斥 (Xor)
! 不 (Not)
<?
$a = 5;
if ($a != 5) {
echo "$a 不是 5";
} else {
echo "$a 是 5";
}
?>
--------------------------------------------------------------------------------
其它运算符号
--------------------------------------------------------------------------------
除了上述的运算符号之外,还有一些运算符号难以归类。
符号 意义
$ 变数
& 变数的指标 (加在变数前)
@ 不显示错误讯息 (加在函数前)
-> 物件的方法或者属性
=> 阵列的元素值
? : 三元运算子
其中比较特殊的是三元运算子 ?   :,以下例来解释
(expr1) ? (expr2) : (expr3);
若 expr1 的运算结果为 true,则执行 expr2;否则执行 expr3。实际上它有点类以 if...else 回圈,但可以让程式较精简有效率。
流程控制 ------------------------------------------------------------------------由于 PHP 的大部份语法都是承袭了 C 语言的语法,因此,在流程控制方面,也是有着和 C 语言极类似的回圈。PHP 的回圈不像 ASP 般可以使用 goto 的 BASIC 语法,PHP 是结构化的程式语言,流程的设计上有一定的规定,而不能用 BASIC 的观念来乱跳到别的区段中。PHP 的语法没有像 C 语言的 main(){} 区段,其实整个 PHP 主页面 (就是浏览器输入的 URL) 就是 main(){} 区段,这点和其它的解译程式,如 Prel、Python、Shell Script 倒是很像。在流程的区段分隔符号上,都是使用 { 当作区段的开头,用 } 当作结尾,和 C 语言相同。不过 C 可以定义 begin 当开头、end 当结尾 (像 Pascal),而 PHP 中不能做这种特殊的定义。而 PHP 语法中在每道指令结束时都要加上分号 ;,但是在区段结尾符号 } 后面不用加上分号结束。
if..else 回圈 ------------------------------------------------------------------if..else 回圈有三种构造
第一种是只有用到 if 条件,当作单纯的判断。解释成 "若发生了某事则怎样处理"。语法如下:
if (expr) {
statement
}
其中的 expr 为判断的条件,通常都是用逻辑运算符号 (logical operators) 当判断的条件。而 statement 为符合条件的执行区段程式,若程式只有一行,可以省略大括号 {}。
范例:本例省略大括号。
<?php
if (date("D") == "Sat") echo "周末了,狂欢去";
?>
范例:本例的执行区段有三行,不可省略大括号。
<?php
if (file_exists("/usr/local/lib/php3.ini")) {
echo "以下是 PHP3 的设定档<p><pre>/n";
readfile("/usr/local/lib/php3.ini");
echo "</pre>/n";
}
?>
第二种是除了 if 之外,加上了 else 的条件,可解释成 "若发生了某事则怎样处理,否则该如何解决"。语法如下
if (expr) {
statement1
} else {
statement2
}
范例:上面的例子来修改成更完整的处理。其中的 else 由于只有一行执行的指令,因此不用加上大括号。
<?php
$f="/usr/local/lib/php3.ini";
if (file_exists($f)) {
echo "以下是 PHP3 的设定档<p><pre>/n";
readfile($f);
echo "</pre>/n";
} else echo "很抱歉,找不到 $f";
?>
第三种就是巢状的 if..else 回圈,通常用在多种决策判断时。它将数个 if..else 拿来合并运用处理。
直接看下面的例子
<?php
if ($a > $b) {
echo "a 比 b 大";
} elseif ($a == $b) {
echo "a 等于 b";
} else {
echo "a 比 b 小";
}
?>
上例只用二层的 if..else 回圈,用来比较 a 和 b 二个变数。实际要使用这种巢状 if..else 回圈时,请小心使用,因为太多层的回圈容易使设计的逻辑出问题,或者少打了大括号等,都会造成程式出现莫名其妙的问题。
do..while 回圈 -------------------------------------------------------------------------------do..while 是重复叙述的回圈,可以分成二种模式。
最单纯的就是只有 while 的回圈。用来在指定的条件内,不断地重覆指定的动作。语法如下
while (expr) {
statement
}
其中的 expr 为判断的条件,通常都是用逻辑运算符号 (logical operators) 当判断的条件。而 statement 为符合条件的执行区段程式,若程式只有一行,可以省略大括号 {}。
下例很有趣,要电脑的浏览器出现十次 "以后不敢了" 的字串,前面并加上数字,表示说了第几次不敢了。(感觉好像是 Web Server 做错事被处罚)
<?php
$i = 1;
while ($i <= 10) {
print $i++;
echo ". 以后不敢了<br>/n";
}
?>
while 可以不用大括号来包住执行区段,而使用冒号加上 endwhile。见下例
<?php
$i = 1;
while ($i <= 10):
print $i++;
echo ". 以后不敢了<br>/n";
endwhile;
?>
另外一种 do..while 回圈则先执行,再判断是否要继续执行,也就是说回圈至少执行一次,有点像是先斩后奏的方法。这种的回圈,和单用 while 是不同的 (单用 while 是先判断再处理)。若读者熟 Pascal 语言的话,会发现 do..while 回圈像是 Pascal 的 repeat..until 回圈。
do..whilte 的语法如下
do {
statement
} while (expr);
--------------------------------------------------------------------- for 回圈 --------------------------------------------------------------------for 回圈就单纯只有一种,没有变化,它的语法如下
for (expr1; expr2; expr3) {
statement
}
其中的 expr1 为条件的初始值。expr2 为判断的条件,通常都是用逻辑运算符号 (logical operators) 当判断的条件。expr3 为执行 statement 后要执行的部份,用来改变条件,供下次的回圈判断,如加一..等等。而 statement 为符合条件的执行区段程式,若程式只有一行,可以省略大括号 {}。
下例是用 for 回圈写的 "以后不敢了" 的例子,可以拿来和用 while 回圈的比较。
<?php
for ($i=1; $i<=10; $i++) {
echo "$i. 以后不敢了<br>/n";
}
?>
从上例中,可以很明显的看到,用 for 和用 while 的不同。实际应用上,若回圈有初始值,且都要累加(或累减),则使用 for 回圈比用 while 回圈好。例如将资料从资料库取出,可能用 for 回圈会比用 while 回圈适合--------------------------------------------------------------------------------switch 回圈--------------------------------------------------------------------switch 回圈,通常处理复合式的条件判断,每个子条件,都是 case 指令区段。在实作上若使用许多类似的 if 指令,可以将它综合成 switch 回圈。
语法如下
switch (expr) {
case expr1:
statement1;
break;
case expr2:
statement2;
break;
:
:
default:
statementN;
break;
}
其中的 expr 条件,通常为变数名称。而 case 后的 exprN,通常表示变数值。冒号后则为符合该条件要执行的区段。注意要用 break 跳离回圈。
<?php
switch (date("D")) {
case "Mon":
echo "今天星期一";
break;
case "Tue":
echo "今天星期二";
break;
case "Wed":
echo "今天星期三";
break;
case "Thu":
echo "今天星期四";
break;
case "Fri":
echo "今天星期五";
break;
default:
echo "今天放假";
break;
}
?>
很明显的,上述的例子用 if 回圈就很麻烦了。当然在设计时,要将出现机率最大的条件放在最前面,最少出现的条件放在最后面,可以增加程式的执行效率。上例由于每天出现的机率相同,所以不用注意条件的顺序。
其它的流程控制
除了上面的流程控制指令之外,尚有 break 及 continue 二个流程控制指令。
break 用来跳出目前执行的回圈,如下例
<?php
$i = 0;
while ($i < 10) {
if ($arr[$i] == "stop") {
break;
}
$i++;
}
?>
continue 即刻停止目前执行回圈,并回到回圈的条件判断处,见下例
<?php
while (list($key,$value) = each($arr)) {
if ($key % 2) { // 略过偶数
continue;
}
do_something_odd ($value);
}
?>
而 BASIC 常用的 goto 在 C 及 Borland Pascal 中或许可以使用。但在 PHP 中,由于它的 Web Server Script 特性以及结构化的组成,并不能在 PHP 中使用 goto 回圈指令? -------------------------------------------------------------------- 函式 ------------在 PHP 中,允许程式设计者将常用的流程或者变数等元件,组织成一个固定的格式。也就是说使用者可以自行组合函式或者是物件。
PHP 中的函式 (function) 和 C 语言一样,包括有传回值的及无传回值的,不像 Pascal 分成函式 (function) 和程序 (procedure) 那么复杂。
在函式的名称上,PHP 对于大小写的管制很松散。可以在定义函式时写成大写的名字,而在使用时使用小写的名字。总之,对函式而言,不用管大小写,只要注意名称没有重复就好了。
以下就是函式的使用语法
function myfunc($arg_1, $arg_2, ..., $arg_n) {
// 执行一些动作
return $retval;
}
在使用时,在自定的函式名称前要加入 function 的保留字,表示这是定义使用者自定函式。之后的 myfunc 可以是任何的英文字母开头的字串,字串除了开头不能是数字或是底线,在第一个字母后可以是阿拉伯数字或者是底线,当然其它的符号或是中文字不能当函式名。
$arg_1 到 $arg_n 为函式使用的参数,参数之间使用逗号隔开。在参数后的大括号 {},即为整个函式的区段。函式若有传回值,使用 return 可将值传回。而参数可以事先定义初始值或内定值。有定义内定值的参数在使用函式时可以省略,但一定要放在没有设定内定值参数的后面,否则 PHP 在解析函式时,会出现错误。
另外就是参数的形态,只要参数是 PHP 支援的变数型态都可以使用,无论是阵列、字串、或是整数....等等。传回值也是一样。
下面即为使用内定值及不用内定值的例子
<?php
function myfunc1($arg_1, $arg_2, $arg_3="我是内定字串") {
echo $arg_1+$arg_2;
echo $arg_3."<p>/n";
}
myfunc(3, 4);               // 参数 $arg_3 省略。
myfunc(6, 6, "不用内定值") // 输入参数 $arg_3。
?>
参数的值,通常使用传值的方式输入,有时在特别的需求时,可以使用传址的方式,传入参数的指标。方法就是在参数的前面加上 & 符号即可。如下例
<?php
function myfunc2(&$argstr) {
$argstr=ereg_replace("/", "-", $argstr);
}
$today="2000/01/01";
myfunc2($today);
echo $today;   // 2000-01-01;
?>------------------------------------------------------------------------------物件使用者定义的物件,也是学好 PHP 所必备的条件之一。而 PHP 的物件,和其它的物件导向语言比较起来,还算蛮单纯的。PHP 只有类别 (class)、方法 (method)、属性、以及单一继承 (extensions) 等。对不习惯使用 C++、Java、Delphi 等物件导向语言来开发程式的使用者,不妨先阅读一下有关物件导向观念的书,相信可以带来许多的收获。下面的范例是手推车的物件。可以看到,使用 class 表示它是一个物件类别。在类别中的 function,例如 add_item 则表示该物件的一个方法。方法可以封装物件的实际处理情形,让该物件自己能依封装好的方法来执行一些动作。程式中的 $this 物件变数也和 $GLOBALS 及 $php_errormsg 二个变数一样,在 PHP 中属于特殊的变数。$this 变数只用在物件类别中,表示物件的本身。
<?php
// 程式名: cart.inc
class Cart {
var $items; // 手推车物件
// 本方法加入 $num 件物品到手推车中 (加到 $artnr 变数)
function add_item ($artnr, $num) {
$this->items[$artnr] += $num;
}
// 本方法从手推车减少 $num 件物品 (从 $artnr 变数减掉)
function remove_item ($artnr, $num) {
if ($this->items[$artnr] > $num) {
$this->items[$artnr] -= $num;
return true;
} else {
return false;
}
}
}
?>
要使用手推车可以用类似下例的方式。可以先将每个物件存成 Include 档案,再将它 require 或 include 进来。在宣告变数 $cart 时,要使用 new 的保留字,表示 $cart 使用 Cart 物件。使用 -> 符号,表示执行物件的方法。
<?php
require("cart.inc");
$cart = new Cart;
$cart->add_item("10", 1);
?>
之后再设计有记名的手推车。记名手推车从手推车遗传下来,因此手推车拥有的方法及属性,记名手推车也有,而记名手推车比手推车增加了名字的方法 (或许该称属性较恰当)。
从下例中可以看到,子物件 Named_Cart 使用 extends 来继承其父物件 Cart。虽然 Named_Cart 物件中没有增加物品及减少物品的方法,不过由于遗传的特性,父物件有的东西它都有。
<?php
// 程式名: named_cart.inc
require("cart.inc");
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
?>
要使用记名手推车物件,请看下面的范例。当然这不算太好的设计,每个子物件都一直 require 它的父物件,会造成伺服器在 I/O 上面的负担。在实作时,可以将整个系列的物件在同一个程式档案中,从最早的袓先物件到最后的子孙物件,也方便日后修正。
<?php
require("named_cart.inc");
$ncart = new Named_Cart;           // 建立物件变数
$ncart->set_owner ("CyberRidder"); // 设定物件的记名属性
echo $ncart->owner;                // 显示物件的记名属性
$ncart->add_item ("10", 1);        // 从父物件遗传的方法也可使用
?>
因此,在 PHP 中使用了 extends 保留字,加上良好的系统分析与完整的 CRC 卡片 (详见物件导向相关书籍) 设计之后,PHP 可变成拥有强大物件能力的 CGI 语言。
PHP 由于是剧本语言 (Script),因此程式原始码可见,在软体工程中的元件黑箱并不会在目前的 PHP 版本中出现,也就是说,全部的物件其实没有隐藏起它的内容。对于软体业者而言,没有办法保护所谓的软体 IC,站在开放社群而言,反而有原始码是件好事,至于孰是孰非,就很难判定了,不过目前 PHP 还是 Open Source 社群的一份子,或许日后 Zend 引擎可以做到物件封装的功能也不一定。
函式库及函式
本章中的函式涵盖 PHP 3.0.11 版前的所有函式。
函式的格式如下:
函式库名称
函式名称
函式功能简述。
语法: 传回型态 函式名称(型态 参数1, 型态 参数2....);
传回值: 变数型态
函式种类: 例如: 资料库, 网路..等等
内容说明
函式说明详述内容
使用范例
函式的范例 (本栏可能省略)
参考
小节索引 函式名称, 小节索引 函式名称... (本栏可能省略)
以下为 PHP 的相关函式库
Adabas D 资料库连结函式库
阿帕契伺服器专用函式库
阵列处理函式库
拼字检查函式库
BC 高精确度函式库
历法函式库
ClibPDF 函式库
日期与时间函式库
DBA 函式库
dBase 格式资料表函式库
dbm 类资料库函式库
目录管理函式库
动态连结函式库
程式执行功能函式库
FDF 函式库
filePro 资料库函式库
档案系统函式库
HTTP 相关函式库
Hyperwave 伺服器函式库
图形处理函式库
IMAP 电子邮件系统函式库
PHP 选项及相关资讯函式库
Informix 资料库函式库
InterBase 资料库函式库
LDAP 目录协定函式库
电子邮件函式库
数学运算函式库
mcrypt 编码函式库
mhash 杂凑函式库
杂项函式库
mSQL 资料库函式库
SQL Server 资料库函式库
MySQL 资料库函式库
Sybase 资料库函式库
网路函式库
NIS 函式库
ODBC 资料库连结函式库
Oracle 8 资料库函式库
Oracle 资料库函式库
Perl 相容语法函式库
PDF 格式档案函式库
PostgreSQL 资料库函式库
常规表示法函式库
信号与共享记忆体函式库
Solid 资料库连结函式库
SNMP 网管函式库
字串处理函式库
URL 处理函式库
变数处理函式库
Vmailmgr 邮件处理函式库
WDDX 函式库
压缩档案函式库
XML 剖析函式库
Session 函式库
GNU 记录函式库
FTP 档案传输函式库
MCAL 模组日历存取函式库
 范例程式 --------------------------首先要说明的是,这几个范例程式都是不同性质的程式,每个程式在 Webmaster 学科 (若 Webmaster 也算是一门学科的话),都是不同的主题,也是成为专业人士所必须要研究的,也因此几乎所有和 CGI 有关的书都会提到这些主题。
当然从专业的角度而言,以下的程式实在太简单了,许多专业的 CGI 套件提供了完整而严谨的解决方案。在这儿只是要展现出 PHP 的程式实作,并真正与网站的系统相结合。至于真正要拿这些范例来赚钱,可能还有一段距离。实际上,可以在网路上找一些现成的套件,倒是比开发还容易。
以下就是这些主题
访客计数器: 探讨如何存取档案。
使用者认证: 探讨 PHP 与 MySQL 资料库的结合。并提供网页权限的架构。
聊天室: 探讨程式的共用变数档及用外部指令操作档案。
留言版: 探讨 PHP 与 Oracle 资料库的结合
意见信箱: 探讨 PHP 如何执行外部程式。
广告轮播: 探讨 PHP 所提供档案上传的功能。
 访客计数器
访客计数器是让 Web 访客知道该网页或者网站的人气指数最直接的方法。尤其是想利用网页赚钱的人,访客人数是找广告商最好的说词。当然可以将网站来访人数写成统计报表,但总是感觉直接看到比较真实,到底眼见为凭。
在上图中,访客计数器的流程如下
第一位使用者浏览某页。
伺服器程式从资料库或档案中读取该页被浏览次数。
将次数加一储存,并将它送回第一位使用者。
第二位使用者浏览某页。
伺服器程式从资料库或档案中读取该页被浏览次数。
将次数再加一储存,并将它送回第二位使用者。
PHP 在没有特殊的访客计数器函式,但是我们可以用 PHP 的强大功能自已写一个访客计数器函式
以下的函式是访客计数器的原型,是由 David W. Bettis 所提供,并经过作者少许修改。
<html>
<head>
<title>访客计数器 原型</title>
</head>
<body>
<?php
/*
simple access counter for php3
(c)1998 David W. Bettis
dbettis@eyeintegrated.com
medify by Wilson Peng
*/
$counterFile = "/tmp/counter.txt";
function displayCounter($counterFile) {
 $fp     = fopen($counterFile,"rw");
 $num    = fgets($fp,5);
 $num    += 1;
 print "您是第 "."$num"." 位无聊份子";
 exec( "rm -rf $counterFile");
 exec( "echo $num > $counterFile");
}
if (!file_exists($counterFile)) {
 exec( "echo 0 > $counterFile");
}
displayCounter($counterFile);
?>
</body>
</html>
Copyright © 1998 David W. Bettis
在读取到本页时,PHP 程式先找寻 /tmp/counter.txt 档案是否存在,若不存在,则建立一个 counter.txt 档案,然后将 0 写入档案。然后读取 counter.txt 档案的内容,也就是纯文字档,再将内文的数字存入 $num 变数中。在 $num 的变数出现在浏览器前,还有经过加一的动作,让使用者可以增加。当然,如果想灌水,就在加一动作时加二或者加三,不过自欺是无用的。最后将访客人数再回存 /tmp/counter.txt 就一切 OK。
当然,每一页都要这样写,岂不麻烦到了极点。这时,我们可以利用 PHP 提供的 require() 功能,将计数器整理成一个函式,酱子在使用上就方便多多了。
首先要先将 Apache 的设定档 (httpd.conf) 加入 PHP include 档案的路径。例如要设所有的 include 档都在 http://abcdefghijk.com.tw/include 中,可以在 httpd.conf 加入下面的例子
php3_include_path .:./include:../include
别忘了重新启动 Apache 伺服器,新增的 include 路径才有效。
./apachectl restart
再来就在伺服器的 .../include 目录中放入以下的档案,档名存成 counter.inc
下面就是 MyCounter() 函式。为了让读者方便了解,程式中的变数 $counterFile、$fp 及 $num 保持和 David W. Bettis 所设定的计数器中的变数功能相同。
<?php
//---------------------------
// 访客计数器函式 MyCounter()
// Author: Wilson Peng
//        Copyright (C) 1999
//---------------------------
function MyCounter() {
 $counterFile="/tmp".$GLOBALS["PHP_SELF"];
 if (!file_exists($counterFile)) {
    if (!file_exists(dirname($counterFile))) {
      mkdir(dirname($counterFile), 0700);
    }
    exec("echo 0 > $counterFile");
 }
 $fp = fopen($counterFile,"rw");
 $num = fgets($fp,5);
 $num += 1;
 print "$num";
 echo $counterFile;
 exec("rm -rf $counterFile");
 exec("echo $num > $counterFile");
}
?>
Copyright © 1999, Wilson Peng
当然,要用的话要加 Homepage 中嵌入 MyCounter() 函式,就可以使用了
<?php
require("counter.inc");
?>
<html>
<head>
<title>访客计数器 最终版</title>
</head>
<body>
您是第 <? MyCounter(); ?> 位参观者
</body>
</html>
Copyright © 1999, Wilson Peng
要用这个 MyCounter() 函式,先在 Homepage 的开头处加入 require() 函式,引入 MyCounter() 函式成为该 Homepage 的一部份。之后再将 <? MyCounter(); ?> 字串放在需要计数器的地方就可以了。
function MyCounter() {
:
:
}
在建立函式时,需要用上面的格式。在自订函式名称前加入 function 字串。
每页有用到 MyCounter() 的 Homepage 都会在 /tmp 之后加入该页的路径,这可以用 $PHP_SELF 变数达成。
 $counterFile="/tmp".$GLOBALS["PHP_SELF"];
当然,若您要将 /tmp 改成别的目录也可以,不然在 SUN 等伺服器,要是 reboot,/tmp 中的东西都没了,要重新开始再计数了。若您不知要使用什么目录,建议使用 /var/log/counter 这个目录,和其它的 log 等变动资料放在一起。
 if (!file_exists($counterFile)) {
    if (!file_exists(dirname($counterFile))) {
      mkdir(dirname($counterFile), 0700);
    }
    exec("echo 0 > $counterFile");
 }
这五行主要是检查 $counterFile 是否存在,若档案不存在则看目录是否存在,决定要不要建立目录。之后就建立档案,并写入 0。
 $fp = fopen($counterFile,"rw");
 $num = fgets($fp,5);
 $num += 1;
 print "$num";
 echo $counterFile;
这五行就是打开计数器存放的档案,并将它累加后的结果送到浏览器端。
 exec("rm -rf $counterFile");
 exec("echo $num > $counterFile");
最后将计数器档案删除,再重新建立一个。就完成了这个以档案为基础的纯文字计数器。
使用者认证
在专业的 Web 站台上,常常会需要使用者的帐号及密码,也就是身份确认的动作。早期的 NCSA httpd 伺服器并没有提供这项使用者确认的功能,Webmaster 只能用手工打造一个身份确认的 CGI 程式。
自 CERN httpd 之后的 Web 伺服器大部份都提供了使用者身份确认的功能。仅管每套 Web 伺服器的设定都不太相同,但在设定上都大同小异。
以下就是 Apache 伺服器上的使用者身份确认的设定。
<Directory /home/MyMember>
AuthType Basic
AuthName MyMember
AuthUserFile /usr/local/MyMember.txt
Options Includes ExecCGI
<Limit GET POST>
require valid-user
</Limit>
</Directory>
在这个例子中,当使用者在看 MyMember 目录下所有的档案,包括图片档案及其它各式档案时,都需要使用者的帐号密码确认。而使用者的帐号及密码档都存在于 /usr/local/MyMember.txt 之中。
这个帐号密码档 /usr/local/MyMember.txt 的样子可能如下例。其中冒号前的字串是使用者帐号,冒号之后的字串是经过不可还原加密的密码,编码一般都是使用传统的 DES 编码,密码的头二个字是类似种子的字元 (salt),本例中都是 3P。每行代表一位使用者。当然 Webmaster 要自行控制重覆帐号的情形。比较特殊是在 Win32 系统上架 Apache 的情形,冒号后的密码不可加密,因为 Win32 没有提供这方面的编码 API,因此使用者密码以明码的方式存在
john1234:3PWudBlJMiwro
queenwan:3PFNVLNPN9W0M
noname00:3PEsXaJx5pk7E
wilson49:3PjoWb0EnaG22
rootboot:3PIt0snI6.84E
sun_moon:3PvymMeNOc.x.
nobody38:3PbskPKwV94hw
在 Apache 1.3.6 版上,可以用 ~apache/bin/htpasswd 来产生单笔的帐号及密码,但对于需要大笔资料的商业站台,可能就需要自行写程式来处理了。UNIX 上需要呼叫 crypt() 来处理编码。
在专业的 Web 站台上,常常会需要使用者的帐号及密码,也就是身份确认的动作。早期的 NCSA httpd 伺服器并没有提供这项使用者确认的功能,Webmaster 只能用手工打造一个身份确认的 CGI 程式。
自 CERN httpd 之后的 Web 伺服器大部份都提供了使用者身份确认的功能。仅管每套 Web 伺服器的设定都不太相同,但在设定上都大同小异。
以下就是 Apache 伺服器上的使用者身份确认的设定。
<Directory /home/MyMember>
AuthType Basic
AuthName MyMember
AuthUserFile /usr/local/MyMember.txt
Options Includes ExecCGI
<Limit GET POST>
require valid-user
</Limit>
</Directory>
在这个例子中,当使用者在看 MyMember 目录下所有的档案,包括图片档案及其它各式档案时,都需要使用者的帐号密码确认。而使用者的帐号及密码档都存在于 /usr/local/MyMember.txt 之中。
这个帐号密码档 /usr/local/MyMember.txt 的样子可能如下例。其中冒号前的字串是使用者帐号,冒号之后的字串是经过不可还原加密的密码,编码一般都是使用传统的 DES 编码,密码的头二个字是类似种子的字元 (salt),本例中都是 3P。每行代表一位使用者。当然 Webmaster 要自行控制重覆帐号的情形。比较特殊是在 Win32 系统上架 Apache 的情形,冒号后的密码不可加密,因为 Win32 没有提供这方面的编码 API,因此使用者密码以明码的方式存在。
john1234:3PWudBlJMiwro
queenwan:3PFNVLNPN9W0M
noname00:3PEsXaJx5pk7E
wilson49:3PjoWb0EnaG22
rootboot:3PIt0snI6.84E
sun_moon:3PvymMeNOc.x.
nobody38:3PbskPKwV94hw
在 Apache 1.3.6 版上,可以用 ~apache/bin/htpasswd 来产生单笔的帐号及密码,但对于需要大笔资料的商业站台,可能就需要自行写程式来处理了。UNIX 上需要呼叫 crypt() 来处理编码。 在一切都设定好了之后,连线时就会在浏览器出现查核密码的视窗,如上图就是 SEEDNet 的 MySEED 网站的使用者查核机制。在输入了帐号及密码后,浏览器会将它用 BASE64 编码后,传到伺服器端。当然 BASE64 只是编码不是加密,因此在网路上这种传输的安全性仍然不高,还是有可能被中间的刽客截下,再将 BASE64 还原,这也是整个使用者认证中最美中不足的地方,或许日后支援摘要认证 (Digest) 及使用 MD5 编码后,可以解决这种问题。之后每一页仍然需要帐号及密码,只不过浏览器会帮你主动送出,不用再输入帐号密码了。这方面浏览器会保留到被关闭为止,下次重执行浏览器仍需输入第一次。在使用者数量少时,使用上述的方法轻松又省事。但是在使用者有数万人,甚至数十万人时,会发生整个伺服器的效率都被搜寻帐号密码下拖垮,可能读取一页需要数十秒到数分钟。这种情形再使用伺服器提供的密码查核机制就不太明智了。在 Netscape Enterprise Server 上可能就可以使用 NSAPI 来开发自己的查核方式,在 IIS 上也可以用 ISAPI 过滤器开发。写 C/C++ 程式呼叫 NSAPI/ISAPI 总是很累,在 PHP 上有了另外的选择,这也是本节的主题。PHP 的 HTTP 相关函式库提供了 header() 的函式。许多 Web 伺服器与客户端的互动,都可以使用这个函式来变戏法。例如在某个 PHP 页面最开始处,也就是第一行或第二行,加入以下的程式,可以将使用者重导到作者的网页。
<?php
header("Location: http://wilson.gs");
exit;
?>
当然,在上述程式之后的 HTML 文字或者是 PHP 程式都永远不会出现在使用者端了。同样的道理,我们就用 header() 来变使用者认证的把戏。可以在 PHP 的最开头送出字串到使用者端,就会在使用者端出现下图的视窗。
<?php
Header("WWW-Authenticate: Basic realm=/"Member/"");
Header("HTTP/1.0 401 Unauthorized");
?>
在程式中字串 realm=/"Member/" 中的 Member 字样出现在图中,当然若使用中文字取代,浏览器端也会出现中文字,如上面的 MySEED 图。若 Web 站台使用者还有其它语文,如英文或日文,送出中文的 realm 字串似乎就比较不合适。无论如何,这都要视站台的性质及使用者定位而决定。
当然这还是很粗糙,因为除了送出视窗后,就没有下文了,帐号输入正确也好,输入错误也罢,都不会有任何的结果。我们需要再更进阶的程式来处理。在后端的使用认证上,考虑使用资料库作为储存帐号及密码的后端,在这种架构可以容纳许多的使用者,管它一万个使用者还是十万个使用者。若您的站已有数十万个使用者帐号,那么恭喜您,您的站算是世界级的大站了。MySQL 是个不错的选择,许多站台,甚至是商业化的站台都用它来做后端的资料库。当然您要架真正的商业站台,钱不是问题的话,那可以使用口碑最广的 Oracle 资料库系列。要在 PHP 中使用任何资料库,都要先将资料库的伺服器端及客户端设定好,之后才编译 PHP 及 Apache 系统。准备好 MySQL 及 PHP 之后,先在 MySQL 中加入新的资料库,本例是加入 mymember,用别的名字当然也可以。MySQL 要加入资料库 (Database) 很容易,只要在 MySQL 存放 Database 的地方 mkdir 就可以了。例如在 UNIX Shell 下打hahaha:/usr/local/mysql/data# mkdir mymember在建立了资料库之后,尚需要建立资料表格 (Table) 方能使用。设定的表格如下,可以将它储在 /tmp/memberauth.sql 中CREATE TABLE MemberAuth (
   Serial mediumint(9) NOT NULL auto_increment,
   Username char(8) NOT NULL,
   Password char(8) NOT NULL,
   Enable char(1) DEFAULT '0' NOT NULL,
   PRIMARY KEY (Serial)
);
档案 memberauth.sql 先看看 memberauth.sql 的这些栏位。Serial 是个自动增加的整数栏位,每输入一笔资料,就会自动加一,这当然不能是空的栏位,于是就用 NOT NULL 了。第二个栏位是 Username,代表使用者的帐号,为了统一以及适应各系统起见,设定成八个字,当然这个栏位也不能是空的。Password 是第三个栏位,为使用者的密码。第四个栏位 Enable 做为帐号是否有效的旗标,设计上 0 表示无用,1 表可用,日后还可加入其它值做不同的用途。设计好了资料表之后,就要将资料表加入资料库了。由于常要使用 MySQL 资料库,可以到 http://www.phpwizard.net/phpMyAdmin 下载 phpMyAdmin,使用浏览器操作及管理 MySQL,轻松又方便。若使用这套 phpMyAdmin 可以在它的使用者介面上输入 memberauth.sql 加入 MySQL 中。或者也可以在 UNIX Shell 下输入下式,也是有同样的效果。
mysql mymember < /tmp/memberauth.sql
在准备好了之后,就可以输入使用者帐号及密码在 memberauth 资料表中了。当然还是使用 phpMyAdmin 方便,用 mysql 程式就要一笔笔的 INSERT 了。接着进入了设计函式的阶段了。
<?php
//---------------------------
// 使用者认证函式    auth.inc
// Author: Wilson Peng
//        Copyright (C) 1999
//---------------------------
$error401 = "/home/phpdocs/error/401.php";
if ($PHP_AUTH_PW=="") {
 Header("WWW-Authenticate: Basic realm=/"超金卡会员/"");
 Header("HTTP/1.0 401 Unauthorized");
 include($error401);
 exit;
} else
{
 $db_id = mysql_pconnect("localhost", "myid", "mypw");
 $result = mysql_db_query("mymember","select password, enable from MemberAuth where username='$PHP_AUTH_USER'");
 $row = mysql_fetch_array($result);
 $MemberPasswd = $row[0];
 $MemberEnable = $row[1];
 if ($MemberEnable==0) {
    echo "您的帐号被停用了";
    exit;
 }
 if ($PHP_AUTH_PW!=$MemberPasswd) {
    Header("WWW-Authenticate: Basic realm=/"超金卡会员/"");
    Header("HTTP/1.0 401 Unauthorized");
    include($error401);
    exit;
 }
}
?>
Copyright (C) 1999, Wilson Peng
要使用这个 auth.inc,要在每个 PHP 的第一行加入
<? require("auth.inc"); ?> 。在加入本程式的 PHP 档案都会检查帐号密码,图片等就不会检查,比起使用 Web 伺服器功能的某目录下全都检查,PHP 显得有弹性多了。
$error401 = "/home/phpdocs/error/401.php";
这行表示在使用者按下取消,或检查失败时,要显示给使用者看的档案。
if ($PHP_AUTH_PW=="") {
 Header("WWW-Authenticate: Basic realm=/"超金卡会员/"");
 Header("HTTP/1.0 401 Unauthorized");
 include($error401);
 exit;
} else {
到 else 之前,若没有传入密码,则送出输入密码的视窗。其中的 $PHP_AUTH_USER、$PHP_AUTH_PW 是 PHP 中特殊的变数,分别代表使用者确认的帐号及密码。上面的程式也是利用这二个变数来处理使用者认证。
 $db_id = mysql_pconnect("localhost", "myid", "mypw");
 $result = mysql_db_query("mymember","select password, enable from MemberAuth where username='$PHP_AUTH_USER'");
 $row = mysql_fetch_array($result);
 $MemberPasswd = $row[0];
 $MemberEnable = $row[1];
若使用者有输入帐号及密码,则向资料库查询。同时查核该使用者是否仍可使用
if ($MemberEnable==0) {
    echo "您的帐号被停用了";
    exit;
 }
上四行程式为帐号被停用的情形。
 if ($PHP_AUTH_PW!=$MemberPasswd) {
    Header("WWW-Authenticate: Basic realm=/"超金卡会员/"");
    Header("HTTP/1.0 401 Unauthorized");
    include($error401);
    exit;
 }
密码错误则再次向使用者要求输入帐号及密码。
在实际使用时,可以视需要加入的网页再加入 auth.inc 这个档案,就不用连看张图形也要查一次密码,降低伺服器和使用者二端的资源。当然,和 MySQL 的连系上,可以使用 mysql_pconnect() 一直和 MySQL 伺服器连线。或是使用 mysql_connect() 每次重新连线,用这个函式要记得早点使用 mysql_close() 将资料库关闭。下面的程式 auth1.inc 是另一版本的认证程式,就是开启连线后马上关闭,释放资源的例子。
<?php
//---------------------------
// 使用者认证函式-1 auth1.inc
// Author: Wilson Peng
//        Copyright (C) 1999
//---------------------------
$error401 = "/home/phpdocs/error/401.php";
if ($PHP_AUTH_PW=="") {
 Header("WWW-Authenticate: Basic realm=/"超金卡会员/"");
 Header("HTTP/1.0 401 Unauthorized");
 include($error401);
 exit;
} else {
 
 $db_id = mysql_connect("localhost", "myid", "mypw");
 $result = mysql_db_query("mymember","select password, enable from MemberAuth where username='$PHP_AUTH_USER'");
 $row = mysql_fetch_array($result);
 $MemberPasswd = $row[0];
 $MemberEnable = $row[1];
 mysql_close($db_id);
 if ($MemberEnable==0) {
    echo "您的帐号被停用了";
    exit;
 }
 if ($PHP_AUTH_PW!=$MemberPasswd) {
    Header("WWW-Authenticate: Basic realm=/"超金卡会员/"");
    Header("HTTP/1.0 401 Unauthorized");
    include($error401);
    exit;
 }
}
?>
Copyright (C) 1999, Wilson Peng
在实际应用时,可以在资料库中加入更多功能,如使用者分组 (CUG) 的功能;或是加入时间栏位,可做到期检查。其中的变化,端赖设计者的巧思了。
聊天室 聊天室,是 Web 站上打发无聊人士的秘密武器。同时,站长或其它人员也可以在这儿杀时间。甚至发生一段轰轰烈烈的网路恋情呢,就算没有,起码可以增加打字的速度。聊天室,其实就是多人共同使用的 CGI 程式。程式将每个人输入的字串,依系统接收完成的时间整理过后,再送给各个使用者。而 Web 聊天室和 BBS 的聊天室不同的地方是 BBS 聊天室可以每收到一句话,就马上分送给每位在聊天室的网路使用者;Web 由于 CGI 程式不能像 BBS 的 telnet 一直连线,Web CGI 必须以最快的速度将资讯送出,然后结束连线。会形成这种情形,就是因为 Web 聊天室还是使用 HTTP 传输协定,在 HTTP 实作的版本,无论是 0.9、1.0 或是 1.1 版都不能长期占据网路连线的 Port。为了解决资料无法马上传输的问题,及更新讯息的问题,Netscape 在 3.0 版浏览器之后使用了新的技术,而 Internet Explorer 也实作了这些 Netscape 研发出来的技术。Netscape 将它分成 Server Push 及 Client Pull 二种技术。Server Push 由 Web 伺服器将资料以多重 MIME 编码,送给使用者端,目前较少网站使用这种方式;而 Client Pull 则利用了 HTML 的 meta 标签,并利用 http-equiv="Refresh" 的属性,表示资料要重新载入,至于载入时间,则利用 content 属性来达成。<meta> 标签通常都放在 <head>..</head> 的区段中,以便让浏览器可以仅早准备更新使用者端的网页。下面为 meta 和 PHP 合用的例子,设定为每十五秒重新载入一次<meta http-equiv="Refresh" content="15; url=<? echo $PHP_SELF; ?>">如果不用 Server Push 或是 Client Pull 来做聊天室,是否有其它的方法,让 Web 的浏览器能聊天呢?答案是肯定的。可以使用 Java 或是 ActiveX (限 IE4、5) 来做甚至自行开发专属的 Browser Plug-in 程式 (如奇摩的聊天室),不过这就和 PHP 没有关系了,不是我们要的重点除此之外,由于定期更新所有网友的留言,为了怕写了一半因为 refresh 而被清掉尚未写好的字串,因此将聊天室以 frame 的页框技术来做是有必要的。下例就是聊天室的主程式。
<html>
<head>
<title>聊天室</title>
</head>
<frameset rows="*,40" border=1>
<frame src="list.php" name=list scrolling=auto>
<frame src="post.php" name=post scrolling=no>
<noframes>
<body>
本聊天室需使用页框,您的浏览器无法使用
</body>
</noframes>
</frameset>
</html>
程式中以 frame 带出二支 PHP 程式,建议将它们放在同一目录之中,例如 /chatroom,以便日后维护。另外,为了 list.php 及 post.php 可以使用相同的变数,下例将共通的变路路径放在 env.inc 中,可以将它放在 /chatroom 或是 Web 伺服器 (如 Apache) 的 PHP include 设定路径中。
<?php
// 档名: env.inc
$tempdir="/tmp/";
$chatfile="/tmp/abc";
?>
聊天室的后端可以设计的很简单,单纯的使用档案来做,也可以弄个资料库,将聊天的内容丢入,若是真的很在意系统效率,或许可以考虑使用 UNIX 的行程通讯 IPC 了。本节即将使用者留言的内容放入档案中,在这儿的例子大部份都使用 UNIX/Linux 的外部指令。若系统无该指令 (或称程式),请自行安装相关程式。实际上将资料丢入档案中会比使用资料库还快,若还很在乎速度,可以在 UNIX 机器中装上 RAM Disk,再将档案的存取路径都设在该 RAM Disk 上,保证存取速度能满足严苛的要求。在有些以高速度搜寻引擎为号召的网站,甚至将整个资料库资料都放到 RAM Disk 中,马上让系统速度提高十倍百倍,而且 RAM 的价格和其它解决方案相比的话还算很便宜。若使用 Windows NT,那就没办法了,看微软什么时候提供,或者用 Third Party 的产品了。有些使用者可能对 UNIX 还不是很熟,在这儿先简介会用到的指令:/
touch: 建立新档案,或修改旧档的最后更新日期。
echo 加上二个大于符号: 将字串显示转向到指定的地方。
tail: 显示档案最后数行的资料,内定值为十行,可使用减号加数字,修改欲显示的行数
下面为送出及处理留言字串的程式,程式用到 env.inc 的档案。
<?php
// 档名: post.php
require("env.inc");
if (($chatuser!="") and ($chattext!="")) {
 $chatstr="<font color=8080ff>".date("h:i:s")."</font>-<font color=ff8080>".$chatuser."</font>: ".$chattext;
 $cmdstr="echo /"".$chatstr."/" >> ".$chatfile;
 if (!file_exists($chatfile)) passthru("touch ".$chatfile);
 passthru($cmdstr);
}
?><html>
<body bgcolor=ffffff leftmargin=0 topmargin=0 marginheight=0 marginwidth=0>
<form action=<? echo $PHP_SELF; ?> method=post>
<table border=0 width=100%><tr>
<td align=right>匿称:</td>
<td><input type=text name=chatuser size=8 value="<? echo $chatuser; ?>"></td>
<td align=right>发言:</td>
<td><input type=text name=chattext size=30 maxlength=500></td>
<td><div align=right><input type=submit value="送出"></td>
</tr></table>
</form>
</body>
</html>
程式先检查是否有输入字串,若无匿名及发言内容字串则显示发言的表单 (Form),若有资料则将字串及当时时间存入档案中 (利用 UNIX 的转向指令)。当然,为了防止错误,先检查是否有档案可存档,若没有则先 touch 该档,例中的档案就是 /tmp/abc。
<html>
<meta http-equiv="Refresh" content="5; url=<? echo $PHP_SELF; ?>">
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
<body bgcolor=ffffff leftmargin=0 topmargin=0 marginheight=0 marginwidth=0>
<?
// 档名: list.php
require("env.inc");
if (!file_exists($chatfile)) {
 echo "尚未开张</body></html>";
 exit;
}
$uniqfile=$tempdir.uniqid(rand());
$shellcmd="/usr/bin/tail -50 ".$chatfile. " > ".$uniqfile;
passthru($shellcmd);
$chatfilearray=file($uniqfile);
$j=count($chatfilearray);
for ($i=1; $i<=$j; $i++) {
 echo $chatfilearray[$j-$i]."<br>/n";
}
unlink($uniqfile);
?>
</body>
</html>
上面的程式就是使用 Client Pull 的技术,每五秒就重新更新一次。同样地,它也 require 共用的 env.inc 档,要改变其中的变数时,马上就可以让所有的程式用到,这对开发网站来说,是蛮重要的方法,可以将网页程式中都会出现的地方。例如 Copyright (C) 1996-2000 的字串,放在一个档案上,到了新的一年,只要改一个档,整个站都改了。
if (!file_exists($chatfile)) {
 echo "尚未开张</body></html>";
 exit;
}
$uniqfile=$tempdir.uniqid(rand());
$shellcmd="/usr/bin/tail -50 ".$chatfile. " > ".$uniqfile;
passthru($shellcmd);程式先检查有没有使用者发送聊天内容的档案 /tmp/abc,若没有就显示尚未开张,等使用者送聊天内容。若已有聊天资料,就抓出最后五十笔,在在另外的档案中准备显示。
$chatfilearray=file($uniqfile);
$j=count($chatfilearray);
for ($i=1; $i<=$j; $i++) {
 echo $chatfilearray[$j-$i]."<br>/n";
}
unlink($uniqfile);将档案读入阵列变数 $chatfilearray 中,并以最后的资料最先显示的方式送给浏览器端,当然可以使用对阵列排序的方法,但确定一定时最后存入的资料在最后面,将它排序实在很浪费 CPU 时间,因此就从最后 echo 到最前面的资料。使用完成还要用 unlink() 指令,将临时档杀掉。
这样就完成了最粗糙的聊天室系统,当然还有很多改进的空间,例如统计使用人数、呼叫个人....等,就要 Webmaster 再精雕细琢了。
 留言版
大部份的网站,都会考虑到和使用者之间的互动关系。这时,用留言版的功能,可让使用者留下到此一游,或者是一些和网站的互动讯息。在设计上,可以很简单的只留下使用者的短篇留言,也可以设计到依性质分门别类很复杂的 Web BBS 系统。当然,要如何打造一个属于自己网站的留言版,就端赖网站的性质以及 Web 网站开发人员的巧思了。在这里介绍的范例,是简单的列示所有留言的内容。供使用者可以一次看到多笔留言的资料。系统的后端存放留言是用 Oracle 7.x 版的资料库系统。范例中的资料库 (database) 名称为 WWW,连线的使用者帐号为 user38、密码为 iam3849。要直接使用本例,必须先执行下面的 SQL 指令,建立 guestbook 的资料表格。
CREATE TABLE guestbook (
 serial    varchar2(255) not null,
 ref       varchar2(255) null,
 id        char(8)        not null,
 alias     varchar2(32)   not null,
 ip        varchar2(1024) null,
 msgdate   date           not null,
 email     varchar2(1024) null,
 msg       varchar2(2000) not null,
 flag      char(1)        default 1,
 primary key(serial)
);
上面的 SQL 各栏位说明及详细资料见下表
序号 栏位 名称 资料形态 资料长度 栏位说明 限制 Key
0 流水号 serial varchar2 255 NN PK
1 参照流水号 ref varchar2 255 暂保留。供回
覆留言功能用  
2 帐号 id char 8 使用者帐号 NN 
3 匿名 alias varchar2 32 显示的名字 NN 
4 网址 ip varchar2 1024 上网 IP  
5 时间 msgdate date   NN 
6 电子邮件 email varchar2 1024   
7 留言内容 msg varchar2 2000 NN 
8 显示旗标 flag char 1 0: 不显示
1: 显示 (内定)  
在本节的留言版相关程式中,若加入了使用者认证功能,则可以在 guestbook 资料表的帐号栏中留下使用者的认证帐号,方便 Webmaster 日后找寻不当的发信者。在这儿先留下栏位,让需要的读者们实习了。要使用本节的程式,首先要先装好 Oracle 7.x 版,并确定 Web Server 端的 SQL*net 可以顺利连上 Oracle 资料库。之后还要在编译 PHP 时加入 --with-oracle=/home/oracle/product/7.3.2 的选项,当然改成其它的路径也没关系,只要该路径真的是 Oracle 的路径即可。有关 Oracle 装设及使用上的细节请参考相关书籍。下面的程式是将使用者的留言资讯加到 guestbook 留言资料表中。若要设定使用者认证功能,可在程式刚开始时检查,发留言者就可以确认身份,而读取留言就不必身份检查。这种设定可以防止不当发言,却又不会让留言功能只有少数人使用。
<?php
//---------------------------
// 新增留言程式 addmsg.php
// Author: Wilson Peng
//        Copyright (C) 2000
//---------------------------
//
// 可自行在这儿加入身份检查功能
//
if (($alias!="") and ($msg!="")) {
 putenv("ORACLE_SID=WWW");
 putenv("NLS_LANG=american_taiwan.zht16big5");
 putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
 putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
 putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
 putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
 $handle=ora_logon("user38@WWW","iam3849") or die;
 $cursor=ora_open($handle);
 ora_commitoff($handle);
 $serial=md5(uniqid(rand()));
 $ref="";
 $id=$PHP_AUTH_USER;
 $ip=$REMOTE_ADDR;
 $msg=base64_encode($msg);
 $flag="1";
 $query="INSERT into guestbook(serial, ref, id, alias, ip, msgdate, email, msg, flag) values('$serial', '$ref', '$id', '$alias', '$ip', sysdate, '$email', '$msg', '$flag')";
 ora_parse($cursor, $query) or die;
 ora_exec($cursor);
 ora_close($cursor);
 ora_logoff($handle);
 Header("Location: ./index.php");
 exit;
} else {
?>
<html>
<head>
<title>填写留言</title>
</head>
<body bgcolor=ffffff>
<form method=POST action="<? echo $PHP_SELF; ?>">
<table border=0 cellpadding=2 width=395>
 <tr>
    <td nowrap><font color=004080>代号小名</font></td>
    <td width=20%><input type=text name=alias size=8></td>
    <td nowrap><font color=004080>电子邮件</font></td>
    <td width=50%><input type=text name=email size=18></td>
 </tr>
 <tr>
    <td nowrapvalign=top><font color=004080>内容</font></td>
    <td width=80% colspan=3><textarea rows=5 name=msg cols=33></textarea></td>
 </tr>
 <tr>
    <td width=100% colspan=4 align=center>
       <input type=submit value="送出留言">
       <input type=reset value="擦掉留言">
    </td>
 </tr>
</table>
</form>
</body>
</html>
<?php
}
?>
上面的程式在执行时,先检查变数 alias 和 msg 是否有资料,若无资料则送出填写留言的表格到使用者端,供使用者填写留言若使用者填好留言,按下 "送出留言" 的按钮后,则执行程式的前半部份。程式大概分成五部份
设定 Oracle 需要的环境变数
连上 Oracle 资料库
整理资料,送入 Oracle 中
结束与 Oracle 的连线
结束程式,显示最新的留言资料
在设定 Oracle 环境的部份,用 PHP 的函式 putenv(),可设定作业系统层的环境变数。要使用中文要记得加入下面这行
putenv("NLS_LANG=american_taiwan.zht16big5");
之后就使用 Oracle 函式库的功能: ora_logon() 等等。详见 Oracle 资料库函式库。利用这个函式库,可以很轻易的操作 Oracle 资料库。
再来就是整理资料,以便置入 Oracle 资料库中
$serial=md5(uniqid(rand()));
$ref="";
$id=$PHP_AUTH_USER;
$ip=$REMOTE_ADDR;
$msg=base64_encode($msg);
$flag="1";
$query="INSERT into guestbook(serial, ref, id, alias, ip, msgdate, email, msg, flag) values('$serial', '$ref', '$id', '$alias', '$ip', sysdate, '$email', '$msg', '$flag')";
$serial 变数为独一无二的字串,程式先乱数产生独特的字串,再用 md5 编码,将字串弄乱,形成类似杂凑处理后的无意义字串。由于字串长,又变得很乱,可防止使用者,尤其是骇客或飞客利用序号来戳系统。
$ref 变数目前是无效的。$id 变数为使用者认证用,若在程式开始处有加入使用者认证的程式,则 $PHP_AUTH_USER 会变成使用者的帐号,传入 $id 变数中。至于使用者写的字串,为了防止资料库或处理时的复杂性甘脆将它用 BASE64 编码。可以让中文字的奇怪字元一字消失,当然这是锯箭法,不过对 Web 程式而言,执行快速、修改方便才是最重要的,实在没有必要再浪费精力去处理这些中文的冲码问题了。值得注意的是使用 BASE64 编码,会让字串膨胀大约 1/3,若资料库的储存空间有限,可能就不适合用这个方法了,话又说回来,现在硬碟便宜,随便就是十几 GB 以上,应该不会考虑资料库空间有限的问题才对。最后,将变数整理成 $query 字串,供资料库执行 SQL 指令使用就可以了。
ora_parse($cursor, $query) or die;
ora_exec($cursor);
ora_close($cursor);
ora_logoff($handle);
要执行 Oracle 的 SQL 指令前,要先经过 parse 的动作。若在前面加上 @ (如: @ora_prase();),可以不让使用者看到错误讯息。在执行 query 指令后,就可以关闭与 Oracle 之间的连线了。
Header("Location: ./index.php");
exit;
这二行让浏览器重导到 index.php。让使用者看到他的新留言,就完成了留言的动作。之后来看看留言的内容显示程式。
<html>
<head>
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
<title>留言版</title>
</head>
<body bgcolor=ffffff>
<?php
//---------------------------
// 留言显示程式 index.php
// Author: Wilson Peng
//        Copyright (C) 2000
//---------------------------
$WebmasterIPArray = array(
 "10.0.1.30",     // 管理人员甲的机器 IP
 "10.0.2.28"      // 管理人员乙的机器 IP
);
$WebmasterIP=false;
for ($i=0; $i<Count($WebmasterIPArray); $i++) {
 if ($REMOTE_ADDR == $WebmasterIPArray[$i]) $WebmasterIP=true;
}
putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);
$query="SELECT serial, ref, id, alias, ip, TO_CHAR(msgdate, 'yyyy/mm/dd hh:mi:ss'), email, msg FROM guestbook where flag='1' order by msgdate desc";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
$i=0;
while(ora_fetch($cursor)) {
 $guestbook[$i][0] = ora_getcolumn($cursor,0);
 $guestbook[$i][1] = ora_getcolumn($cursor,1);
 $guestbook[$i][2] = ora_getcolumn($cursor,2);
 $guestbook[$i][3] = ora_getcolumn($cursor,3);
 $guestbook[$i][4] = ora_getcolumn($cursor,4);
 $guestbook[$i][5] = ora_getcolumn($cursor,5);
 $guestbook[$i][6] = ora_getcolumn($cursor,6);
 $guestbook[$i][7] = ora_getcolumn($cursor,7);
 $i++;
}
ora_close($cursor);
ora_logoff($handle);
echo "<a href=addmsg.php>新增留言....</a><p>/n";
if ($QUERY_STRING!="") {
 $page = $QUERY_STRING;
} else {
 $page = 0;
}
$i=count($guestbook);
$msgnum=20;   // 每页二十笔
$start = $page * $msgnum;
$end = $start + $msgnum;
if ($end > $i) $end=$i;
$totalpage=$i/$msgnum;
$pagestr="";
if ($page>0) $pagestr=$pagestr."<a href=index.php?".($page-1).">&lt;上页</a> - ";
$pagestr=$pagestr."[第 ";
for ($i=0; $i<$totalpage; $i++) {
 if ($i!=$page) {
    $pagestr = $pagestr."<a href=index.php?$i>".($i+1)."</a> ";
 } else {
    $pagestr = $pagestr.($i+1)." ";
 }
}
$pagestr=$pagestr." 页] ";
if ($page<($totalpage-1)) $pagestr=$pagestr."- <a href=index.php?".($page+1).">下页&gt;</a> ";
$pagestr="<div align=center>$pagestr</div>";
echo "<p>".$pagestr."<hr><p>/n";
for ($i=$start; $i<$end; $i++) {
 echo "<p><hr><p>/n";
 echo "<p>/n<font color=e06060>".$guestbook[$i][5]."</font> &nbsp; ";
 if ($guestbook[$i][6]!="") echo "<a href=mailto:".$guestbook[$i][6].">";
 echo "<strong>".$guestbook[$i][3]."</strong>";
 if ($guestbook[$i][6]!="") echo "</a>";
 echo "<br>/n";
 if ($WebmasterIP) echo "<a href=erase.php?".$guestbook[$i][0].">删除本篇!!</a> (".$guestbook[$i][2].") &nbsp; ";
 echo "<font size=-1 color=c0c0c0>from: ".$guestbook[$i][4]."</font><p>/n";
 $msg=base64_decode($guestbook[$i][7]);
 $msg=nl2br($msg);
 echo $msg;
 echo "<p>/n";
echo "<p><hr><p>/n";
echo $pagestr;
?>
</body>
</html> 
在显示留言的部份,考虑到留言内容若很多,加上网路慢的话,可能会让使用者在线路慢的时候拖累整个资料库,因此,尽快的连上资料库,取得需要的资料后,马上关闭资料库,再慢慢送给使用者,应是最好的对策。
程式分成四部份
初始化
取资料库中的资料
计算要显示的页数
送出资料
$WebmasterIPArray = array(
 "10.0.1.30",     // 管理人员甲的机器 IP
 "10.0.2.28"      // 管理人员乙的机器 IP
);
$WebmasterIP=false;
for ($i=0; $i<Count($WebmasterIPArray); $i++) {
 if ($REMOTE_ADDR == $WebmasterIPArray[$i]) $WebmasterIP=true;
}
// 之后初始化 Oracle 程式略
显示程式和留言程式的初始化部份都差不多,但显示程式多加了一个功能,设定 Webmaster 的电脑。将 Webmaster 使用的 IP Address 加在 $WebmasterIPArray 阵列变数中,可以在显示留言时,显示删除留言的字串,方便处理不当的留言。
$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);
$query="SELECT serial, ref, id, alias, ip, TO_CHAR(msgdate, 'yyyy/mm/dd hh:mi:ss'), email, msg FROM guestbook where flag='1' order by msgdate desc";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
$i=0;
while(ora_fetch($cursor)) {
 $guestbook[$i][0] = ora_getcolumn($cursor,0);
 $guestbook[$i][1] = ora_getcolumn($cursor,1);
 $guestbook[$i][2] = ora_getcolumn($cursor,2);
 $guestbook[$i][3] = ora_getcolumn($cursor,3);
 $guestbook[$i][4] = ora_getcolumn($cursor,4);
 $guestbook[$i][5] = ora_getcolumn($cursor,5);
 $guestbook[$i][6] = ora_getcolumn($cursor,6);
 $guestbook[$i][7] = ora_getcolumn($cursor,7);
 $i++;
}
ora_close($cursor);
ora_logoff($handle);
在初始化后,就可以连上 Oracle 资料库,将留言的资料取出放在 $guestbook 阵列中。取得资料后,就赶紧将资料库关闭,再来处理 $guestbook 阵列的资料了
if ($QUERY_STRING!="") {
 $page = $QUERY_STRING;
} else {
 $page = 0;
}
这一段程式判断是要显示第几页,内定值是显示第一页。要显示第三页的页面,需要使用 http://xxxxxx/index.php?2 的格式,也就是传入 $QUERY_STRING,余类推。之后的数行程式,都是用来处理显示的页数及笔数的资料。
$msgnum=20;   // 每页二十笔
要改变每页的显示笔数,可以改 $msgnum 变数。程式的内定值为 20 笔。
for ($i=$start; $i<$end; $i++) {
 echo "<p><hr><p>/n";
 echo "<p>/n<font color=e06060>".$guestbook[$i][5]."</font> &nbsp; ";
 if ($guestbook[$i][6]!="") echo "<a href=mailto:".$guestbook[$i][6].">";
 echo "<strong>".$guestbook[$i][3]."</strong>";
 if ($guestbook[$i][6]!="") echo "</a>";
 echo "<br>/n";
 if ($WebmasterIP) echo "<a href=erase.php?".$guestbook[$i][0].">删除本篇!!</a> (".$guestbook[$i][2].") &nbsp; ";
 echo "<font size=-1 color=c0c0c0>from: ".$guestbook[$i][4]."</font><p>/n";
 $msg=base64_decode($guestbook[$i][7]);
 $msg=nl2br($msg);
 echo $msg;
 echo "<p>/n";
}
这一段程式就是真正显示留言资料给使用者看的程式了。利用 for 回圈,将 $guestbook 阵列的资料按照设定的页数取出,显示给使用者看。值得一提的是,若看留言的机器 IP 为 $WebmasterIPArray 变数阵列中的一个元素的话,则会在留言者的匿称后显示 "删除本篇!!" 的字串,供管理人员删除不当留言。
以下即为删除留言的程式。
<?php
//---------------------------
// 留言删除程式 erase.php
// Author: Wilson Peng
//        Copyright (C) 2000
//---------------------------
putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);
$query="UPDATE guestbook set flag='0' where serial='".$QUERY_STRING."'";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
ora_close($cursor);
ora_logoff($handle);
Header("Location: ./index.php");
?>
其实这个程式很单纯,只要打开 Oracle 资料库,将欲删除的序号那笔资料的 flag 栏位设成 0 就可以了,不用将资料真的从资料库上移除。
--------------------------------------------------------------------意见信箱 --------------------------------------------------------------------- 当使用者在参观网页时,有时想 Email 给 Webmaster 但是再执行 Email 程式总是不方使,使用者在按下 mailto:abc@abc.abc.tw 还要花段时间打开自己这儿的 Outlook 岂不麻烦。这时,若是 Homepage 能提供写信的功能就太酷了。同时意见信箱还是以提醒或者要求使用者一定要填入哪些资料,这对资料仓储而言,也是了解客户的最好方法。
整个意见信箱其实就像 Outlook 或者其它电子邮件软体,开启寄发新邮件的功能,不同的地方在于使用 Outlook 时,寄件人是固定的,而要填上收件人的地址;而网站上的意见信箱,收件人几乎都是 Webmaster,反而是要填上寄件人的电子邮件地址。当然另一个不同之处是 Outlook 处理寄信的动作;而意见信箱是由 Web 伺服器处理使用者发送的信件。
在更进阶的设计后,甚至可以变成 Web Mail,像 HotMail 般,只要用浏览器就可以在任何地方用任何电脑收发信件。
当然,也可以做进阶的设计,将使用者的意见储放在资料库中,留待日后整理成更有用的资料。不过这就不是这节要讨论的部份了。
在 UNIX 的系统中,大部份和电子邮件有关的问题都和 sendmail 有关,除非系统管理员较偏执,才会用其它的系统。因此,意见信箱的设计开发,也是使用 sendmail 来达成所需要的功能。而 WindowsNT 系统中,由于没有 sendmail 程式,需要另行符费购买,或使用其它的邮件派送软体,因此本节程式无法在 WindowsNT 系统执行。
程式的流程如下
送出填写意见的表格到使用者的浏览器上。
使用者填好后送出资料到伺服器。
伺服器将使用者填的资料整理后,存入档案。
利用 UNIX 的管道指令及 sendmail 程式将意见送给系统管理人员。
伺服器通知使用者意见已送出。
以下就是完整的范例程式
<html>
<head>
<title>意见信箱</title>
</head>
<body>
<?php
$mailto="yourname@hahaha.com.tw";
if (($topic!="") and ($Email!="") and ($body!="")) {
 $tmpfilename = tempnam("/tmp", "dm");
 $fp = fopen($tmpfilename, "w");
 fwrite($fp, "From: ".$Email."/n");
 fwrite($fp, "Subject: ".$topic." <访客来信>/n/n");
 fwrite($fp, $body."/n/n");
 fwrite($fp, "送信人:".$sender."/n");
 fwrite($fp, "发信IP:".$REMOTE_ADDR."/n");
 fclose($fp);
 $execstr="cat ".$tmpfilename." | /usr/lib/sendmail ".$mailto;
 exec($execstr);
 $execstr="echo $sender $REMOTE_HOST >> /var/log/mail.log";
 exec($execstr);
 echo "信件已送出!!本站工作人员尽快处理您的问题<p><br><br><br><br><br>";
} else {
 ?>
 <form action=<? echo($GLOBALS["PHP_SELF"]); ?> method=post>
 <table border=0>
 <tr><td>主题</td><td><input type=text size=20 name=topic></tr>
 <tr><td>姓名</td><td><input type=text size=20 name=sender></tr>
 <tr><td>Email</td><td><input type=text size=20 name=Email></tr>
 <tr><td colspan=2>内容<br><textarea cols=26 rows=10 name=body></textarea></td></tr>
 <tr><td colspan=2><div align=right><input type=submit value="送出"></td></tr>
 </table>
 </form>
 <?
}
?>
</body>
</html>
程式在 PHP 处理剖析时,先判断使用者是否填入资料。若没有资料则送出意见表单给使用者,若有资料则表示使用者已输入相关的资料,则进行处理。处理的原则是先将使用者填写的资料写入暂存档案中,但为了防止多使用者同时填写意见时,会造成档案被覆盖,因此需要每次都有不同的暂存档,这个问题可以使用 tempnam() 函式来解决,用来建立独一无二的临时档。 在档名的问题处理完后,利用 PHP 提供的档案处理功能,将使用者填写的资料写入方才建立的档案中。将档案关闭就初步完成。即使资料没有邮寄出去,系统仍能保存意见档案。值得注意的是,若存放在 /tmp 中,有些 UNIX 的系统 (如 SUN Solaris) 会在重新启动系统时遗失这些资料,而有些则不会 (如 Slackware Linux),这方面可能要先规划好,要保存的话需要存在不会被清掉的目录下。UNIX 中最强的功能就是管道,可以利用管道来处理寄信的动作,如下cat tmpfilename | /usr/lib/sendmail wilson@biglobe.net.tw这个指令的意思为将档案送给管道彼端的 sendmail 程式,而 sendmail 将该档案寄给 wilson@biglobe.net.tw。因此可利用本管道指令将意见寄给 Webmaster 或是客服部门的人员。若要寄给多人,可利用 mailing list 或是多用几次寄信的管道指令。在 PHP 程式中要使用 UNIX 的程式或者外部指令,可以使用 exec() 函式来做。寄完信后,通知使用者已经在处理了,就完成了意见处理的初步工作。当然之后要如何处理,就不是 PHP 书中所能讨论的。当然执行寄信的方式不只一种,可以利用 mail() 函式来寄信,亦可利用 UNIX 的网路 socket 来做,所谓戏法人人会变,巧妙各有不同。--------------------------------------------------------------------- 广告轮播-------------------------------------------------------------网路广告,变成了 Internet 上的热门学问。而 468x60 更变成了广告人员绞尽脑汁的尺寸。在处理广告时,若能直接使用浏览器将广告的 468x60 图档送到处理广告的伺服器中,相信是件很舒服的事,不用再开 FTP 程式,搞大半天只为了 upload。这个问题,是所有 Web CGI 程式的痛,包括 ASP、Prel....等等,都需要再经过系统元件的增加才能达成。号称最强的 Web CGI 程式: PHP,在这方面的表现没有令人失望,甚至傲视其它的 CGI 工具。File Upload 功能在 RFC 1867 文件有有详细的说明,是利用特殊的文件格式 (content-type) multipart/form-data。值得注意的是浏览器一定要用 Netscape 3.0 以上或 MS Internet Explorer 4.0 以上的版本才能将档案上传。
先看下面的 HTML 原始码
<form enctype="multipart/form-data" action="next.php" method=post>
您的大名: <input type=text name=user><br>
档案名称: <input name="myfile" type="file"><br>
<input type="submit" value="送出">
</form>
 在 form 的标签中,要加入 enctype="multipart/form-data" 的字串,表示使用者输入的资料上有档案上传,同时 method 一定要用 POST 而不能用 GET。在上面的码中,若使用者姓名填入 Wilson Peng,并选 c:/myphoto.gif 的档案,在使用者按下送出键后,浏览器则传送出下面的 POST 资料。
Content-type: multipart/form-data, boundary=AaB03x
--AaB03x
content-disposition: form-data; name="user"
Wilson Peng
--AaB03x
content-disposition: form-data; name="myfile"
Content-type: multipart/mixed, boundary=BbC04y
--BbC04y
Content-disposition: attachment; filename="myphoto.gif"
Content-type: image/gif
Content-Transfer-Encoding: binary
 ...myphoto.gif 内容略...
--BbC04y--
--AaB03x--
看到上面的资料中,boundary=AaB03x 即为分开不同栏位资料的讯息,其中的 AaB03x 编码方法,视浏览器的版本不同而异,通常是浏览器杂凑产生的。之后就可以看到用 --AaB03x 来隔开不同的栏位。以上面为例,处理 form 的 action 程式 next.php,会主动产生四个变数,见下表变数名 说明
$myfile 即上传的档案内容
$myfile_name 上传档案在使用者端的名称
$myfile_size 上传档案的大小
$myfile_type 上传档案的格式,如 "image/gif"
在 next.php 程式要做的最重要动作,就是好好的使用这四个变数,否则程式一结束,使用者上传的档案就消失了。因此,要先将 $myfile 复制到存放广告图的目录中
copy($banner,"/home1/biglobe3/ad/".$banner_name);
这行程式就是将档案存在 /home/htdocs/ad 的目录中,就上面的例子而言,就将档案存到 /home/htdocs/ad/myphoto.gif。重要的是,存放的目录不能是 Web Server 无法读到的目录,而应放在网站的 Homepage 所在目录中,才可以在网路上看到。
或许程式要更细部的处理,例如比对取得的档案大小与系统回报的是否相同....等等,就可以用 $myfile_size 变数了。
若在 form 中设定 input file 的名称改掉,则在 Upload 的变数也一起改,如
<input name="upfile" type="file">
则变数就改成 $upfile、$upfile_name、$upfile_size、与 $upfile_type。
因此,下面的例子就利用 File Upload 及 Oracle 7.x 后端资料库,将档案放在 Web Homepage 目录中,相关资讯则存在 Oracle 中。当然,加上使用者认证,让有帐号的使用者才能上传图片,可避免刽客 (cracker) 等将不雅或不适当的广告上传。例中有关资料库的设定和 5.4 留言版的设定相同。
<html>
<head>
<?php
// adadd.php
if (($banner=="") and ($url=="")) {
?>
<title>新增广告</title>
</head>
<body>
加权值数字愈大,图片出现的机率就愈高,内定值为 1。
<FORM ENCTYPE="multipart/form-data" ACTION="adadd.php" METHOD=POST>
<table border=0>
<tr><td align=right>广告 Banner: </td><td><input name=banner TYPE="file"></td></tr>
<tr><td align=right>广告网址 URL: </td><td><input name=url type=text size=30></td></tr>
<tr><td align=right>辅助字串 ALT: </td><td><input name=alt type=text size=30></td></tr>
<tr><td align=right>广告说明: </td><td><input name=descript type=text size=30></td></tr>
<tr><td align=right>显示加权: </td><td><input name=priority type=text size=5 value=1></td></tr>
<tr><td colspan=2 align=right><input type="submit" VALUE="确定"></td></tr>
</table>
</FORM>
<?
} else {
 if (file_exists("/home/htdocs/ad/".$banner_name)) {
    CommonHeader("档案 ".$banner_name." 已存在");
    echo "<p><br><br>广告档案已经存在/n<p><br><br></body></html>";
    exit;
 };
 copy($banner,"/home1/biglobe3/ad/".$banner_name);
 putenv("ORACLE_SID=WWW");
 putenv("NLS_LANG=american_taiwan.zht16big5");
 putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
 putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
 putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
 putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
 $handle=ora_logon("user38@WWW","iam3849") or die;
 $cursor=ora_open($handle);
 ora_commitoff($handle);
 $query="insert into ad(url, banner, alt, descript, priority) values('$url', '$banner_name', '$alt', '$descript', $priority)";
 ora_parse($cursor, $query) or die;
 ora_exec($cursor);
 ora_close($cursor);
 ora_logoff($handle);
 echo "<title>广告新增完成</title>";
 echo "</head>";
 echo "<body>";
 echo "<a href=".$url."><img src=/ad/".$banner_name." alt=/"".$alt."/" border=0></a><p>";
 echo "<ul type=disc>";
 echo "<li>广告网址: ".$url;
 echo "<li>辅助字串: ".$alt;
 echo "<li>广告说明: ".$descript;
 echo "<li>显示加权: ".$priority;
 echo "</ul>";
}
?>
</body>
</html>
当然要使用上面的程式之前别忘了先增加 ad 资料表,SQL 及栏位如下
CREATE TABLE ad (
 url       varchar2(1024) not null,
 banner    varchar2(1024) not null,
 alt       varchar2(255) null,
 descript varchar2(255) null,
 priority number(4) not null default 1
);
序号 栏位 名称 资料形态 资料长度 栏位说明
0 广告网址 url varchar2 1024 
1 图片路径 banner varchar2 1024 
2 字串显示 alt varchar2 255 
3 广告说明 descript varchar2 255 
4 显示加权 priority number 4 1 为内定值,0 表停用
值得一提的是在这加入了加权的功能,若一个广告要提升曝光率,则可以将显示加权的栏位数字加大,例如 5,它的出现机率就会比只设为 1 的高五倍。
<?php
// ad.php
putenv("ORACLE_SID=WWW");
putenv("NLS_LANG=american_taiwan.zht16big5");
putenv("ORACLE_HOME=/home/oracle/product/7.3.2");
putenv("LD_LIBRARY_PATH=/home/oracle/product/7.3.2/lib");
putenv("ORA_NLS=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
putenv("ORA_NLS32=/home/oracle/product/7.3.2/ocommon/nls/admin/data");
$handle=ora_logon("user38@WWW","iam3849") or die;
$cursor=ora_open($handle);
ora_commitoff($handle);
$query="SELECT url, banner, alt, priority FROM ad where priority > 0";
ora_parse($cursor, $query) or die;
ora_exec($cursor);
$i=$pricount=0;
while(ora_fetch($cursor)) {
 $ad[$i][0] = ora_getcolumn($cursor,0);
 $ad[$i][1] = ora_getcolumn($cursor,1);
 $ad[$i][2] = ora_getcolumn($cursor,2);
 $ad[$i][3] = ora_getcolumn($cursor,3);
 $pricount += $ad[$i][3];
 $i++;
};
ora_close($cursor);
ora_logoff($handle);
srand((double)microtime()*1000000);
$pri = rand(1,$pricount);
$pricount=0;
for($i=0; $i<count($ad); $i++) {
 $pricount += $ad[$i][3];
 if ($pri <= $pricount) {
    $ad1[]="<a href=".$ad[$i][0]." target=new><img src=/ad/".$ad[$i][1]." width=468 height=60 border=0 alt=/"".$ad[$i][2]."/"></a>";
 }
}
echo $ad1[0];
?>
上面的程式为公用的广告显示程式,其中的 $pricount 变数为所有广告 priority 加起来的和。程式先将所有的广告资讯读到阵列变数 $ad 中,随即关上资料库。再依时间取乱数种子,之后再从 1 到 $pricount 间随机取一个数字。
网页中要用广告程式,只要在需要广告的地方加上 <? include("ad.php"); ?> 就可以了,当然 Include 的路径 (在 httpd.conf 中) 要先设好才行。上面的程式还有改进空间,可以加入广告的 Click Log 功能,或是显示的 Log 功能,改动显示加权的程式....等等,就不做范例了,毕竟在这儿是要介绍 PHP 的实际应用及程式开发,而不是套件开发。真的需要现成的广告套件,不妨到 http://www.phpwizard.net/phpAds,这是一套用 PHP 开发出来的广告程式。----------------------------------------------------------------------------- PHP 函式索引
共有 967 个函式
Abs: 取得绝对值。
Acos: 取得反余弦值。
ada_afetch: 取得资料库的传回列。
ada_autocommit: 开关自动更动功能。
ada_close: 关闭 Adabas D 连结。
ada_commit: 更动 Adabas D 资料库。
ada_connect: 连结至 Adabas D 资料库。
ada_exec: 执行 SQL 指令。
ada_fetchrow: 取得传回一列。
ada_fieldname: 取得栏位名称。
ada_fieldtype: 取得栏位资料形态。
ada_freeresult: 释出传回资料的记忆体。
ada_numfields: 取得栏位数目。
ada_numrows: 取得传回列数目。
ada_result: 取得传回资料。
ada_resultall: 传回 HTML 表格资料。
ada_rollback: 撤消当前交易。
AddSlashes: 字串加入斜线。
apache_lookup_uri: 获得所有的 URI 相关资讯。
apache_note: 获得及设定阿帕契伺服器的请求纪录。
array: 建立一个新的阵列。
array_walk: 让使用者自订函数能处理阵列中的每一个元素。
arsort: 将阵列的值由大到小排序。
Asin: 取得反正弦值。
asort: 将阵列的值由小到大排序。
aspell_check: 检查一个单字。
aspell_check-raw: 检查一个单字,即使拼错也不改变或修正。
aspell_new: 载入一个新的字典。
aspell_suggest: 检查一个单字,并提供拼字建议。
Atan: 取得反正切值。
Atan2: 计算二数的反正切值。
base64_decode: 将 BASE64 编码字串解码。
base64_encode: 将字串以 BASE64 编码。
basename: 传回不含路径的档案字串。
base_convert: 转换数字的进位方式。
bcadd: 将二个高精确度数字相加。
bccomp: 比较二个高精确度数字。
bcdiv: 将二个高精确度数字相除。
bcmod: 取得高精确度数字的余数。
bcmul: 将二个高精确度数字相乘。
bcpow: 求一高精确度数字次方值。
bcscale: 设定程式中所有 BC 函式库的内定小数点位数。
bcsqrt: 求一高精确度数字的平方根。
bcsub: 将二个高精确度数字相减。
bin2hex: 二进位转成十六进位。
BinDec: 二进位转成十进位。
Ceil: 计算大于指定数的最小整数。
chdir: 改变目录。
checkdate: 验证日期的正确性。
checkdnsrr: 检查指定网址的 DNS 记录。
chgrp: 改变档案所属的群组。
chmod: 改变档案的属性。
Chop: 去除连续空白。
chown: 改变档案的拥有者。
Chr: 传回序数值的字元。
chunk_split: 将字串分成小段。
clearstatcache: 清除档案状态快取。
closedir: 关闭目录 handle。
closelog: 关闭系统纪录。
connection_aborted: 若连结中断则传回 true。
connection_status: 取得连线状态。
connection_timeout: 若超过 PHP 程式执行时间则传回 true。
convert_cyr_string: 转换古斯拉夫字串成其它字串。
copy: 复制档案。
Cos: 余弦计算。
count: 计算变数或阵列中的元素个数。
crypt: 将字串用 DES 编码加密。
current: 传回阵列中目前的元素。
date: 将伺服器的时间格式化。
dbase_add_record: 加入资料到 dBase 资料表。
dbase_close: 关闭 dBase 资料表。
dbase_create: 建立 dBase 资料表。
dbase_delete_record: 删除 dBase 资料表的资料。
dbase_get_record: 取得 dBase 资料表的资料。
dbase_numfields: 取得 dBase 资料表的栏位数。
dbase_numrecords: 取得 dBase 资料表的列数。
dbase_open: 开启 dBase 资料表。
dbase_pack: 清理 dBase 资料表。
dba_close: 关闭资料库。
dba_delete: 删除指定资料。
dba_exists: 检查键是否存在。
dba_fetch: 取回指定资料。
dba_firstkey: 取回首笔键值。
dba_insert: 加入资料。
dba_nextkey: 取回下笔键值。
dba_open: 开启资料库连结。
dba_optimize: 最佳化资料库。
dba_popen: 开启并保持资料库连结。
dba_replace: 更动或加入资料。
dba_sync: 资料库同步化。
dblist: 取得 DBM 的资讯。
dbmclose: 关闭 DBM 资料库。
dbmdelete: 删除指定资料。
dbmexists: 检查键是否存在。
dbmfetch: 取回指定资料。
dbmfirstkey: 取回首笔键名。
dbminsert: 加入资料。
dbmnextkey: 取回下笔键值。
dbmopen: 开启 DBM 资料库连结。
dbmreplace: 更动或加入资料。
debugger_off: 关闭内建的 PHP 除错器。
debugger_on: 使用内建的 PHP 除错器。
DecBin: 十进位转二进位。
DecHex: 十进位转十六进位。
DecOct: 十进位转八进位。
delete: 无用的项目。
die: 输出讯息并中断 PHP 程式。
dir: 目录类别物件。
dirname: 取得路径中的目录名。
diskfreespace: 取得目录所在的剩余可用空间。
dl: 载入 PHP 扩充模组。
doubleval: 变数转成倍浮点数型态。
each: 传回阵列中下一个元素的索引及值。
easter_date: 计算复活节日期。
easter_days: 计算复活节与三月廿一日之间日期数。
echo: 输出字串。
empty: 判断变数是否已设定。
end: 将阵列的内部指标指到最后的元素。
ereg: 字串比对剖析。
eregi: 字串比对剖析,与大小写无关。
eregi_replace: 字串比对剖析并取代,与大小写无关。
ereg_replace: 字串比对剖析并取代。
error_log: 送出一个错误讯息。
error_reporting: 设定错误讯息回报的等级。
escapeshellcmd: 除去字串中的特殊符号。
eval: 将值代入字串之中。
exec: 执行外部程式。
exit: 结束 PHP 程式。
Exp: 自然对数 e 的次方值。
explode: 切开字串。
extract: 汇入阵列到符号表。
fclose: 关闭已开启的档案。
FDF_close: 关闭 FDF 文件。
FDF_create: 建立新的 FDF 文件。
FDF_get_file: 取得 /F 键的值。
FDF_get_status: 取得 /STATUS 键的值。
FDF_get_value: 取得栏位的值。
FDF_next_field_name: 下一栏位的名称。
FDF_open: 打开 FDF 文件。
FDF_save: 将 FDF 文件存档。
FDF_set_ap: 设定显示栏位。
FDF_set_file: 设定 /F 键。
FDF_set_status: 设定 /STATUS 键。
FDF_set_value: 设定栏位的值。
feof: 测试档案指标是否指到档尾。
fgetc: 取得档案指标所指的字元。
fgetcsv: 取得档案指标所指行,并剖析 CSV 栏位。
fgets: 取得档案指标所指的行。
fgetss: 取得档案指标所指的行,并去掉 HTML 语言标记。
file: 将档案全部读入阵列变数中。
fileatime: 取得档案最后的存取时间。
filectime: 取得档案最后的改变时间。
filegroup: 取得档案所属的群组。
fileinode: 取得档案的 inode 值。
filemtime: 取得档案最后的修改时间。
fileowner: 取得档案的拥有者。
fileperms: 取得档案的权限设定。
filepro: 读取 FilePro Map 档。
filepro_fieldcount: 取得栏位数目。
filepro_fieldname: 取得栏位名称。
filepro_fieldtype: 取得栏位型态。
filepro_fieldwidth: 取得栏位宽度。
filepro_retrieve: 取得指定储存格资料。
filepro_rowcount: 取得列数目。
filesize: 获得档案的大小。
filetype: 获得档案的型态。
file_exists: 检查档案是否存在。
flock: 锁住档案。
Floor: 计算小于指定数的最大整数。
flush: 清出输出缓冲区。
fopen: 开启档案或者 URL。
fpassthru: 输出所有剩余资料。
fputs: 写到档案指标。
fread: 位元组的方式读取档案。
FrenchToJD: 将法国共和历法转换成为凯撒日计数。
fseek: 移动档案指标。
fsockopen: 打开网路的 Socket 连结。
ftell: 取得档案读写指标位置。
ftp_cdup: 回上层目录。
ftp_chdir: 改变路径。
ftp_connect: 开启 FTP 连结。
ftp_delete: 将档案删除。
ftp_fget: 下载档案,并存在已开的档中。
ftp_fput: 上传已开启档案。
ftp_get: 下载档案。
ftp_login: 登入 FTP 伺服器。
ftp_mdtm: 获得指定档案的最后修改时间。
ftp_mkdir: 建新目录。
ftp_nlist: 列出指定目录中所有档案。
ftp_pasv: 切换主被动传输模式。
ftp_put: 上传档案。
ftp_pwd: 取得目前所在路径。
ftp_quit: 关闭 FTP 连线。
ftp_rawlist: 详细列出指定目录中所有档案。
ftp_rename: 将档案改名。
ftp_rmdir: 删除目录。
ftp_size: 获得指定档案的大小。
ftp_systype: 显示伺服器系统。
function_exists: 查核函式是否已定义。
fwrite: 二进位位元方式写入档案。
getallheaders: 获得所有 HTTP 变数值。
getdate: 获得时间及日期资讯。
getenv: 取得系统的环境变数
gethostbyaddr: 传回机器名称。
gethostbyname: 传回 IP 网址。
gethostbynamel: 传回机器名称的所有 IP。
GetImageSize: 取得图片的长宽。
getlastmod: 传回该网页的最后修改时间。
getmxrr: 取得指定网址 DNS 记录之 MX 栏位。
getmyinode: 传回该网页的 inode 值。
getmypid: 传回 PHP 的行程代号。
getmyuid: 传回 PHP 的使用者代码。
getrandmax: 乱数的最大值。
getrusage: 传回系统资源使用率。
gettimeofday: 取得目前时间。
gettype: 取得变数的型态。
get_cfg_var: 取得 PHP 的设定选项值。
get_current_user: 取得 PHP 行程的拥有者名称。
get_magic_quotes_gpc: 取得 PHP 环境变数 magic_quotes_gpc 的值。
get_magic_quotes_runtime: 取得 PHP 环境变数 magic_quotes_runtime 的值。
get_meta_tags: 抽出档案所有 meta 标记的资料。
gmdate: 取得目前与 GMT 差后的时间。
gmmktime: 取得 UNIX 时间戳记的格林威治时间。
GregorianToJD: 将格里高里历法转换成为凯撒日计数。
gzclose: 关闭压缩档。
gzeof: 判断是否在压缩档尾。
gzfile: 读压缩档到阵列中。
gzgetc: 读压缩档中的字元。
gzgets: 读压缩档中的字串。
gzgetss: 读压缩档中的字串,并去掉 HTML 指令。
gzopen: 开启压缩档。
gzpassthru: 解压缩指标后全部资料。
gzputs: 资料写入压缩档。
gzread: 压缩档读出指定长度字串。
gzrewind: 重设压缩档指标。
gzseek: 设压缩档指标至指定处。
gztell: 取得压缩档指标处。
gzwrite: 资料写入压缩档。
header: 送出 HTTP 协定的标头到浏览器
HexDec: 十六进位转十进位。
htmlentities: 将所有的字元都转成 HTML 字串。
htmlspecialchars: 将特殊字元转成 HTML 格式。
hw_Children: 取得子物件代码。
hw_ChildrenObj: 取得子物件的物件记录。
hw_Close: 关闭 Hyperwave 连线。
hw_Connect: 连上 Hyperwave 伺服器。
hw_Cp: 复制物件。
hw_Deleteobject: 删除物件。
hw_DocByAnchor: 取得指定锚的文件物件代码。
hw_DocByAnchorObj: 取得指定锚的文件物件。
hw_DocumentAttributes: 取得指定文件物件属性。
hw_DocumentBodyTag: 取得指定文件物件的文件主体标记。
hw_DocumentContent: 取得指定文件物件的内容。
hw_DocumentSetContent: 重设指定文件物件的内容。
hw_DocumentSize: 取得文件大小。
hw_EditText: 更动文字文件。
hw_Error: 取得错误代码。
hw_ErrorMsg: 取得错误讯息。
hw_Free_Document: 释放文件使用的记忆体。
hw_GetAnchors: 取得文件的连结锚。
hw_GetAnchorsObj: 取得文件的连结锚记录。
hw_GetAndLock: 取得并锁住物件。
hw_GetChildColl: 取得子物件们的 ID。
hw_GetChildCollObj: 取得子物件们的资料。
hw_GetChildDocColl: 取得全部子文件聚集。
hw_GetChildDocCollObj: 取得全部子文件聚集记录。
hw_GetObject: 取得物件。
hw_GetObjectByQuery: 搜寻物件。
hw_GetObjectByQueryColl: 搜寻聚集物件。
hw_GetObjectByQueryCollObj: 搜寻聚集物件。
hw_GetObjectByQueryObj: 搜寻物件。
hw_GetParents: 取得父物件的 ID。
hw_GetParentsObj: 取得父物件的资料。
hw_GetRemote: 取得远端文件。
hw_GetRemoteChildren: 取得远端的子文件。
hw_GetSrcByDestObj: 取得指定目的的文件内容。
hw_GetText: 取得纯文字文件。
hw_GetUsername: 目前使用者名字。
hw_Identify: 使用者身份确认。
hw_InCollections: 检查物件聚集。
hw_Info: 连线资讯。
hw_InsColl: 插入聚集。
hw_InsDoc: 插入文件。
hw_InsertDocument: 上传文件。
hw_InsertObject: 插入物件记录。
hw_Modifyobject: 修改物件记录。
hw_Mv: 移动物件。
hw_New_Document: 建立新文件。
hw_Objrec2Array: 物件记录转为阵列。
hw_OutputDocument: 输出文件。
hw_pConnect: 连上 Hyperwave 伺服器。
hw_PipeDocument: 取得文件。
hw_Root: 取得根物件代码。
hw_Unlock: 取消锁定。
hw_Who: 列出目前使用者。
ibase_bind: 连结 PHP 变数到 InterBase 参数。
ibase_close: 关闭 InterBase 伺服器连线。
ibase_connect: 开启 InterBase 伺服器连线。
ibase_execute: 执行 SQL 的指令区段。
ibase_fetch_row: 传回单列的各栏位。
ibase_free_query: 释放查询指令占用记忆体。
ibase_free_result: 释放传回占用记忆体。
ibase_pconnect: 保持 InterBase 伺服器连线。
ibase_prepare: 分析 SQL 语法。
ibase_query: 送出一个 query 字串。
ibase_timefmt: 设定时间格式。
ifxus_close_slob: 删除 slob 物件。
ifxus_create_slob: 建立 slob 物件。
ifxus_open_slob: 开启 slob 物件。
ifxus_read_slob: 读取指定数目的 slob 物件。
ifxus_seek_slob: 设定目前档案或找寻位置。
ifxus_tell_slob: 传回目前档案或找寻位置。
ifxus_write_slob: 将字串写入 slob 物件中。
ifx_affected_rows: 得到 Informix 最后操作影响的列数目。
ifx_blobinfile_mode: 设定长位元物件模式。
ifx_byteasvarchar: 设定位元组模式内定值。
ifx_close: 关闭 Informix 伺服器连线。
ifx_connect: 开启 Informix 伺服器连线。
ifx_copy_blob: 复制长位元物件。
ifx_create_blob: 建立长位元物件。
ifx_create_char: 建立字元物件。
ifx_do: 执行已准备 query 字串。
ifx_error: 取得 Informix 最后的错误。
ifx_errormsg: 取得 Informix 最后错误讯息。
ifx_fetch_row: 传回单列的各栏位。
ifx_fieldproperties: 列出 Informix 的 SQL 栏位属性。
ifx_fieldtypes: 列出 Informix 的 SQL 栏位。
ifx_free_blob: 删除长位元物件。
ifx_free_char: 删除字元物件。
ifx_free_result: 释放传回占用记忆体。
ifx_free_slob: 删除 slob 物件。
ifx_getsqlca: 取得 query 后的 sqlca 资讯。
ifx_get_blob: 取得长位元物件。
ifx_get_char: 取得字元物件。
ifx_htmltbl_result: 将 query 传回资料转成 HTML 表格。
ifx_nullformat: 设定空字元模式内定值。
ifx_num_fields: 取得传回栏位的数目。
ifx_num_rows: 取得传回列的数目。
ifx_pconnect: 开启 Informix 伺服器长期连线。
ifx_prepare: 准备 query 字串。
ifx_query: 送出一个 query 字串。
ifx_textasvarchar: 设定文字模式内定值。
ifx_update_blob: 更改长位元物件。
ifx_update_char: 更改字元物件。
ignore_user_abort: 连线中断后程式是否执行。
ImageArc: 画弧线。
ImageChar: 写出横向字元。
ImageCharUp: 写出直式字元。
ImageColorAllocate: 匹配颜色。
ImageColorAt: 取得图中指定点颜色的索引值。
ImageColorClosest: 计算色表中与指定颜色最接近者。
ImageColorExact: 计算色表上指定颜色索引值。
ImageColorResolve: 计算色表上指定或最接近颜色的索引值。
ImageColorSet: 设定色表上指定索引的颜色。
ImageColorsForIndex: 取得色表上指定索引的颜色。
ImageColorsTotal: 计算图的颜色数。
ImageColorTransparent: 指定透明背景色。
ImageCopyResized: 复制新图并调整大小。
ImageCreate: 建立新图。
ImageCreateFromGIF: 取出 GIF 图型。
ImageCreateFromPNG: 取出 PNG 图型。
ImageDashedLine: 绘虚线。
ImageDestroy: 结束图形。
ImageFill: 图形着色。
ImageFilledPolygon: 多边形区域着色。
ImageFilledRectangle: 矩形区域着色。
ImageFillToBorder: 指定颜色区域内着色。
ImageFontHeight: 取得字型的高度。
ImageFontWidth: 取得字型的宽度。
ImageGIF: 建立 GIF 图型。
ImageInterlace: 使用交错式显示与否。
ImageLine: 绘实线。
ImageLoadFont: 载入点阵字型。
ImagePNG: 建立 PNG 图型。
ImagePolygon: 绘多边形。
ImagePSBBox: 计算 PostScript 文字所占区域。
ImagePSEncodeFont: PostScript 字型转成向量字。
ImagePSFreeFont: 卸下 PostScript 字型。
ImagePSLoadFont: 载入 PostScript 字型。
ImagePSText: 写 PostScript 文字到图中。
ImageRectangle: 绘矩形。
ImageSetPixel: 绘点。
ImageString: 绘横式字串。
ImageStringUp: 绘直式字串。
ImageSX: 取得图片的宽度。
ImageSY: 取得图片的高度。
ImageTTFBBox: 计算 TTF 文字所占区域。
ImageTTFText: 写 TTF 文字到图中。
imap_8bit: 将八位元转成 qp 编码。
imap_alerts: 所有的警告讯息。
imap_append: 附加字串到指定的邮箱中。
imap_base64: 解 BASE64 编码。
imap_binary: 将八位元转成 base64 编码。
imap_body: 读信的内文。
imap_check: 传回邮箱资讯。
imap_clearflag_full: 清除信件旗标。
imap_close: 关闭 IMAP 连结。
imap_createmailbox: 建立新的信箱。
imap_delete: 标记欲删除邮件。
imap_deletemailbox: 删除既有信箱。
imap_errors: 所有的错误讯息。
imap_expunge: 删除已标记的邮件。
imap_fetchbody: 从信件内文取出指定区段。
imap_fetchheader: 取得原始标头。
imap_fetchstructure: 获取某信件的结构资讯。
imap_getmailboxes: 取得全部信件详细资讯。
imap_getsubscribed: 列出所有订阅邮箱。
imap_header: 获取某信件的标头资讯。
imap_headers: 获取全部信件的标头资讯。
imap_last_error: 最后的错误讯息。
imap_listmailbox: 获取邮箱列示。
imap_listsubscribed: 获取订阅邮箱列示。
imap_mailboxmsginfo: 取得目前邮箱的资讯。
imap_mail_copy: 复制指定信件到它处邮箱。
imap_mail_move: 移动指定信件到它处邮箱。
imap_msgno: 列出 UID 的连续信件。
imap_num_msg: 取得信件数。
imap_num_recent: 取得新进信件数。
imap_open: 开启 IMAP 连结。
imap_ping: 检查 IMAP 是否连线。
imap_qprint: 将 qp 编码转成八位元。
imap_renamemailbox: 更改邮箱名字。
imap_reopen: 重开 IMAP 连结。
imap_rfc822_parse_adrlist: 剖析电子邮件位址。
imap_rfc822_write_address: 电子邮件位址标准化。
imap_scanmailbox: 寻找信件有无特定字串。
imap_search: 搜寻指定标准的信件。
imap_setflag_full: 设定信件旗标。
imap_sort: 将信件标头排序。
imap_status: 目前的状态资讯。
imap_subscribe: 订阅邮箱。
imap_uid: 取得信件 UID。
imap_undelete: 取消删除邮件标记。
imap_unsubscribe: 取消订阅邮箱。
implode: 将阵列变成字串。
intval: 变数转成整数型态。
iptcparse: 使用 IPTC 模组解析位元资料。
isset: 判断变数是否已设定。
is_array: 判断变数型态是否为阵列型态。
is_dir: 测试档案是否为目录。
is_double: 判断变数型态是否为倍浮点数型态。
is_executable: 测试档案是否为可执行档。
is_file: 测试档案是否为正常档案。
is_float: 判断变数型态是否为浮点数型态。
is_int: 判断变数型态是否为整数型态。
is_integer: 判断变数型态是否为长整数型态。
is_link: 测试档案是否为连结档。
is_long: 判断变数型态是否为长整数型态。
is_object: 判断变数型态是否为物件型态。
is_readable: 测试档案是否可读取。
is_real: 判断变数型态是否为实数型态。
is_string: 判断变数型态是否为字串型态。
is_writeable: 测试档案是否可写入。
JDDayOfWeek: 传回日期在周几。
JDMonthName: 传回月份名。
JDToFrench: 将凯撒日计数转换成为法国共和历法。
JDToGregorian: 将凯撒日计数 (Julian Day Count) 转换成为格里高里历法 (Gregorian date)。
JDToJewish: 将凯撒日计数转换成为犹太历法。
JDToJulian: 将凯撒日计数转换成为凯撒历法。
JewishToJD: 将犹太历法转换成为凯撒日计数。
join: 将阵列变成字串。
JulianToJD: 将凯撒历法转换成为凯撒日计数。
key: 取得阵列中的索引资料。
ksort: 将阵列的元素依索引排序。
ldap_add: 增加 LDAP 名录的条目。
ldap_bind: 系住 LDAP 目录。
ldap_close: 结束 LDAP 连结。
ldap_connect: 连上 LDAP 伺服器。
ldap_count_entries: 搜寻结果的数目。
ldap_delete: 删除指定资源。
ldap_dn2ufn: 将 dn 转成易读的名字。
ldap_explode_dn: 切开 dn 的栏位。
ldap_first_attribute: 取得第一笔资源的属性。
ldap_first_entry: 取得第一笔结果代号。
ldap_free_result: 释放传回资料记忆体。
ldap_get_attributes: 取得传回资料的属性。
ldap_get_dn: 取得 DN 值。
ldap_get_entries: 取得全部传回资料。
ldap_get_values: 取得全部传回值。
ldap_list: 列出简表。
ldap_modify: 改变 LDAP 名录的属性。
ldap_mod_add: 增加 LDAP 名录的属性。
ldap_mod_del: 删除 LDAP 名录的属性。
ldap_mod_replace: 新的 LDAP 名录取代旧属性。
ldap_next_attribute: 取得传回资料的下笔属性。
ldap_next_entry: 取得下一笔结果代号。
ldap_read: 取得目前的资料属性。
ldap_search: 列出树状简表。
ldap_unbind: 结束 LDAP 连结。
leak: 泄出记忆体。
link: 建立硬式连结。
linkinfo: 取得连结资讯。
list: 列出阵列中元素的值。
Log: 自然对数值。
Log10: 10 基底的对数值。
lstat: 取得连结档相关资讯。
ltrim: 去除连续空白。
mail: 寄出电子邮件。
max: 取得最大值。
mcrypt_cbc: 使用 CBC 将资料加/解密。
mcrypt_cfb: 使用 CFB 将资料加/解密。
mcrypt_create_iv: 从随机源将向量初始化。
mcrypt_ecb: 使用 ECB 将资料加/解密。
mcrypt_get_block_size: 取得编码方式的区块大小。
mcrypt_get_cipher_name: 取得编码方式的名称。
mcrypt_get_key_size: 取得编码钥匙大小。
mcrypt_ofb: 使用 OFB 将资料加/解密。
md5: 计算字串的 MD5 杂凑。
mhash: 计算杂凑值。
mhash_count: 取得杂凑 ID 的最大值。
mhash_get_block_size: 取得杂凑方式的区块大小。
mhash_get_hash_name: 取得杂凑演算法名称。
microtime: 取得目前时间的 UNIX 时间戳记的百万分之一秒值。
min: 取得最小值。
mkdir: 建立目录。
mktime: 取得 UNIX 时间戳记。
msql: 送出 query 字串。
msql_affected_rows: 得到 mSQL 最后操作影响的列数目。
msql_close: 关闭 mSQL 资料库连线。
msql_connect: 开启 mSQL 资料库连线。
msql_createdb: 建立一个新的 mSQL 资料库。
msql_create_db: 建立一个新的 mSQL 资料库。
msql_data_seek: 移动内部传回指标。
msql_dbname: 取得目前所在资料库名称。
msql_dropdb: 删除指定的 mSQL 资料库。
msql_drop_db: 删除指定的 mSQL 资料库。
msql_error: 取得最后错误讯息。
msql_fetch_array: 传回阵列资料。
msql_fetch_field: 取得栏位资讯。
msql_fetch_object: 传回物件资料。
msql_fetch_row: 传回单列的各栏位。
msql_fieldflags: 获得栏位的旗标。
msql_fieldlen: 获得栏位的长度。
msql_fieldname: 传回指定栏位的名称。
msql_fieldtable: 获得栏位的资料表 (table) 名称。
msql_fieldtype: 获得栏位的型态。
msql_field_seek: 设定指标到传回值的某栏位。
msql_freeresult: 释放传回占用记忆体。
msql_free_result: 释放传回占用记忆体。
msql_listdbs: 列出可用资料库 (database)。
msql_listfields: 列出指定资料表的栏位 (field)。
msql_listtables: 列出指定资料库的资料表 (table)。
msql_list_dbs: 列出可用资料库 (database)。
msql_list_fields: 列出指定资料表的栏位 (field)。
msql_list_tables: 列出指定资料库的资料表 (table)。
msql_numfields: 取得传回栏位的数目。
msql_numrows: 取得传回列的数目。
msql_num_fields: 取得传回栏位的数目。
msql_num_rows: 取得传回列的数目。
msql_pconnect: 开启 mSQL 伺服器长期连线。
msql_query: 送出一个 query 字串。
msql_regcase: 将字串逐字传回大小写字元。
msql_result: 取得查询 (query) 的结果。
msql_selectdb: 选择一个资料库。
msql_select_db: 选择一个资料库。
msql_tablename: 传回指定资料表的名称。
mssql_affected_rows: 取得最后 query 影响的列数。
mssql_close: 关闭与资料库的连线。
mssql_connect: 连上资料库。
mssql_data_seek: 移动列指标。
mssql_fetch_array: 传回阵列资料。
mssql_fetch_field: 取得栏位资讯。
mssql_fetch_object: 传回物件资料。
mssql_fetch_row: 传回单列的各栏位。
mssql_field_seek: 设定指标到传回值的某栏位。
mssql_free_result: 释放传回占用记忆体。
mssql_num_fields: 取得传回栏位的数目。
mssql_num_rows: 取得传回列的数目。
mssql_pconnect: 开启 MS SQL 伺服器长期连线。
mssql_query: 送出一个 query 字串。
mssql_result: 取得查询 (query) 的结果。
mssql_select_db: 选择一个资料库。
mt_getrandmax: 乱数的最大值。
mt_rand: 取得乱数值。
mt_srand: 设定乱数种子。
mysql_affected_rows: 得到 MySQL 最后操作影响的列数目。
mysql_close: 关闭 MySQL 伺服器连线。
mysql_connect: 开启 MySQL 伺服器连线。
mysql_create_db: 建立一个 MySQL 新资料库。
mysql_data_seek: 移动内部传回指标。
mysql_db_query: 送查询字串 (query) 到 MySQL 资料库。
mysql_drop_db: 移除资料库。
mysql_errno: 传回错误讯息代码。
mysql_error: 传回错误讯息。
mysql_fetch_array: 传回阵列资料。
mysql_fetch_field: 取得栏位资讯。
mysql_fetch_lengths: 传回单列各栏资料最大长度。
mysql_fetch_object: 传回物件资料。
mysql_fetch_row: 传回单列的各栏位。
mysql_field_flags: 获得目前栏位的旗标。
mysql_field_len: 获得目前栏位的长度。
mysql_field_name: 传回指定栏位的名称。
mysql_field_seek: 设定指标到传回值的某栏位。
mysql_field_table: 获得目前栏位的资料表 (table) 名称。
mysql_field_type: 获得目前栏位的型态。
mysql_free_result: 释放传回占用记忆体。
mysql_insert_id: 传回最后一次使用 INSERT 指令的 ID。
mysql_list_dbs: 列出 MySQL 伺服器可用的资料库 (database)。
mysql_list_fields: 列出指定资料表的栏位 (field)。
mysql_list_tables: 列出指定资料库的资料表 (table)。
mysql_num_fields: 取得传回栏位的数目。
mysql_num_rows: 取得传回列的数目。
mysql_pconnect: 开启 MySQL 伺服器长期连线。
mysql_query: 送出一个 query 字串。
mysql_result: 取得查询 (query) 的结果。
mysql_select_db: 选择一个资料库。
mysql_tablename: 取得资料表名称。
next: 将阵列的内部指标向后移动。
nl2br: 将换行字元转成 <br>。
number_format: 格式化数字字串。
OCIBindByName: 让动态 SQL 可使用 PHP 变数。
OCIColumnIsNULL: 测试传回行是否为空的。
OCIColumnSize: 取得栏位型态的大小。
OCICommit: 将 Oracle 的交易处理付诸实行。
OCIDefineByName: 让 SELECT 指令可使用 PHP 变数。
OCIExecute: 执行 Oracle 的指令区段。
OCIFetch: 取得传回资料的一列 (row)。
OCIFetchInto: 取回 Oracle 资料放入阵列。
OCILogOff: 关闭与 Oracle 的连结。
OCILogon: 开启与 Oracle 的连结。
OCINewDescriptor: 初始新的 LOB/FILE 描述。
OCINumRows: 取得受影响栏位的数目。
OCIParse: 分析 SQL 语法。
OCIResult: 从目前列 (row) 的资料取得一栏 (column)。
OCIRollback: 撤消当前交易。
OctDec: 八进位转十进位。
odbc_autocommit: 开关自动更动功能。
odbc_binmode: 设定二进位资料处理方式。
odbc_close: 关闭 ODBC 连结。
odbc_close_all: 关闭所有 ODBC 连结。
odbc_commit: 更动 ODBC 资料库。
odbc_connect: 连结至 ODBC 资料库。
odbc_cursor: 取得游标名。
odbc_do: 执行 SQL 指令。
odbc_exec: 执行 SQL 指令。
odbc_execute: 执行预置 SQL 指令。
odbc_fetch_into: 取得传回的指定列。
odbc_fetch_row: 取得传回一列。
odbc_field_len: 取得栏位资料长度。
odbc_field_name: 取得栏位名称。
odbc_field_type: 取得栏位资料形态。
odbc_free_result: 释出传回资料的记忆体。
odbc_longreadlen: 设定传回栏的最大值。
odbc_num_fields: 取得栏位数目。
odbc_num_rows: 取得传回列数目。
odbc_pconnect: 长期连结至 ODBC 资料库。
odbc_prepare: 预置 SQL 指令。
odbc_result: 取得传回资料。
odbc_result_all: 传回 HTML 表格资料。
odbc_rollback: 撤消当前交易。
odbc_setoption: 调整 ODBC 设定。
opendir: 开启目录 handle。
openlog: 打开系统纪录。
Ora_Bind: 连结 PHP 变数到 Oracle 参数。
Ora_Close: 关闭一个 Oracle 的 cursor。
Ora_ColumnName: 得到 Oracle 传回列 (Column) 的名称。
Ora_ColumnSize: 取得栏位型态的大小。
Ora_ColumnType: 得到 Oracle 传回列 (Column) 的型态。
Ora_Commit: 将 Oracle 的交易处理付诸实行。
Ora_CommitOff: 关闭自动执行 Oracle 交易更动的功能。
Ora_CommitOn: 打开自动执行 Oracle 交易更动的功能。
Ora_Do: 快速的 SQL 查询。
Ora_Error: 获得 Oracle 错误讯息。
Ora_ErrorCode: 获得 Oracle 错误代码。
Ora_Exec: 执行 Oracle 的指令区段。
Ora_Fetch: 取得传回资料的一列 (row)。
Ora_FetchInto: 取回 Oracle 资料放入阵列。
Ora_GetColumn: 从传回列 (row) 的资料取得一栏 (column)。
Ora_Logoff: 结束与 Oracle 的连结。
Ora_Logon: 开启与 Oracle 的连结。
Ora_Numcols: 取得栏位的数目。
Ora_Open: 开启 Oracle 的 cursor。
Ora_Parse: 分析 SQL 语法。
Ora_PLogon: 开启与 Oracle 的长期连结。
Ora_Rollback: 撤消当前交易。
Ord: 传回字元的序数值。
pack: 压缩资料到位元字串之中。
parse_str: 剖析 query 字串成变数。
parse_url: 剖析 URL 字串。
passthru: 执行外部程式并不加处理输出资料。
pclose: 关闭档案。
PDF_add_annotation: 加入注解。
PDF_add_outline: 目前页面加入书签。
PDF_arc: 绘弧。
PDF_begin_page: 启始 PDF 档案页面。
PDF_circle: 绘圆。
PDF_clip: 组合所有向量。
PDF_close: 关闭 PDF 档。
PDF_closepath: 形成封闭的向量形状。
PDF_closepath_fill_stroke: 形成封闭的向量形状沿向量绘线并填满。
PDF_closepath_stroke: 形成封闭的向量形状并沿向量绘线。
PDF_close_image: 关闭图档。
PDF_continue_text: 输出文字。
PDF_curveto: 绘贝氏曲线。
PDF_endpath: 关闭目前向量。
PDF_end_page: 关闭 PDF 档案页面。
PDF_execute_image: 放置 PDF 档中图片到指定位置。
PDF_fill: 填满目前的向量。
PDF_fill_stroke: 填满目前的向量并沿向量绘线。
PDF_get_info: 传回档案资讯。
PDF_lineto: 绘直线。
PDF_moveto: 设定处理的坐标点。
PDF_open: 建立新的 PDF 档。
PDF_open_gif: 开启 GIF 图档。
PDF_open_jpeg: 开启 JPEG 图档。
PDF_open_memory_image: 开启记忆体图档。
PDF_place_image: 放置图片到 PDF 档指定位置。
PDF_put_image: 放置图片到 PDF 档。
PDF_rect: 绘长方形。
PDF_restore: 还原环境变数。
PDF_rotate: 旋转物件。
PDF_save: 储存环境变数。
PDF_scale: 缩放物件。
PDF_setdash: 设定虚线样式。
PDF_setflat: 设定平滑值。
PDF_setgray: 指定绘图的颜色为灰阶并填入。
PDF_setgray_fill: 指定填入的颜色为灰阶。
PDF_setgray_stroke: 指定绘图的颜色为灰阶。
PDF_setlinecap: 设定 linecap 参数。
PDF_setlinejoin: 设定连线参数。
PDF_setlinewidth: 设定线宽。
PDF_setmiterlimit: 设定斜边界限。
PDF_setrgbcolor: 指定绘图的颜色为彩色并填入。
PDF_setrgbcolor_fill: 指定填入的颜色为彩色。
PDF_setrgbcolor_stroke: 指定绘图的颜色为彩色。
PDF_set_char_spacing: 设定字元间距。
PDF_set_duration: 设定二页的切换时间。
PDF_set_font: 设定使用的字型及大小。
PDF_set_horiz_scaling: 设定文字水平间距。
PDF_set_info_author: 设定档案作者。
PDF_set_info_creator: 设定建档者字串。
PDF_set_info_keywords: 设定档案的关键字。
PDF_set_info_subject: 设定档案主题。
PDF_set_info_title: 设定档案标题。
PDF_set_leading: 设定行距。
PDF_set_text_matrix: 设定文字矩阵。
PDF_set_text_pos: 设定文字位置。
PDF_set_text_rendering: 设定文字表现方式。
PDF_set_text_rise: 设定文字高度。
PDF_set_transition: 设定页的转换。
PDF_set_word_spacing: 设定字间距。
PDF_show: 输出字串到 PDF 档案。
PDF_show_xy: 输出字串到指定坐标。
PDF_stringwidth: 计算字串的宽度。
PDF_stroke: 沿向量绘线。
PDF_translate: 移动原点。
pfsockopen: 打开网路的 Socket 持续连结。
pg_Close: 关闭 PostgreSQL 伺服器连线。
pg_cmdTuples: 取得被 SQL 指令影响的资料笔数。
pg_Connect: 开启 PostgreSQL 伺服器连线。
pg_DBname: 取得目前的资料库名称。
pg_ErrorMessage: 传回错误讯息。
pg_Exec: 执行 query 指令。
pg_Fetch_Array: 传回阵列资料。
pg_Fetch_Object: 传回物件资料。
pg_Fetch_Row: 传回单列的各栏位。
pg_FieldIsNull: 检查栏位是否有资料。
pg_FieldName: 传回指定栏位的名称。
pg_FieldNum: 取得指定栏位的行数。
pg_FieldPrtLen: 计算可列示的长度。
pg_FieldSize: 计算指定栏位的长度。
pg_FieldType: 获得目前栏位的型态。
pg_FreeResult: 释放传回占用记忆体。
pg_GetLastOid: 取得最后的物件代码。
pg_Host: 取得连线机器名称。
pg_loclose: 关闭大型物件。
pg_locreate: 建立大型物件。
pg_loopen: 开启大型物件。
pg_loread: 读取大型物件。
pg_loreadall: 读取大型物件并输出。
pg_lounlink: 删除大型物件。
pg_lowrite: 读取大型物件。
pg_NumFields: 取得传回栏位的数目。
pg_NumRows: 取得传回列的数目。
pg_Options: 取得连线机器选项。
pg_pConnect: 开启 PostgreSQL 伺服器长期连线。
pg_Port: 取得连线机器埠号。
pg_Result: 取得查询 (query) 的结果。
pg_tty: 取得连线机器终端机。
phpinfo: 传回 PHP 所有相关资讯。
phpversion: 传回 PHP 版本讯息。
pi: 圆周率。
popen: 开启档案。
pos: 传回阵列目前的元素。
pow: 次方。
preg_match: 字串比对剖析。
preg_match_all: 字串整体比对剖析。
preg_replace: 字串比对剖析并取代。
preg_split: 将字串依指定的规则切开。
prev: 将阵列的内部指标往前移动。
print: 输出字串。
printf: 输出格式化字串。
putenv: 设定系统环境变数。
quoted_printable_decode: 将 qp 编码字串转成 8 位元字串。
QuoteMeta: 加入引用符号。
rand: 取得乱数值。
range: 建立一个整数范围的阵列。
rawurldecode: 从 URL 专用格式字串还原成普通字串。
rawurlencode: 将字串编码成 URL 专用格式。
readdir: 读取目录 handle。
readfile: 输出档案。
readgzfile: 读出压缩档。
readlink: 传回符号连结 (symbolic link) 目标档。
recode_file: 记录档案或档案请求到记录中。
recode_string: 记录字串到记录中。
register_shutdown_function: 定义 PHP 程式执行完成后执行的函式。
rename: 更改档名。
reset: 将阵列的指标指到阵列第一个元素。
rewind: 重置开档的读写位置指标。
rewinddir: 重设目录 handle。
rmdir: 删除目录。
round: 四舍五入。
rsort: 将阵列的值由大到小排序。
sem_acquire: 捕获信号。
sem_get: 取得信号代码。
sem_release: 释出信号。
serialize: 储存资料到系统中。
session_decode: Session 资料解码。
session_destroy: 结束 session。
session_encode: Session 资料编码。
session_id: 存取目前 session 代号。
session_is_registered: 检查变数是否注册。
session_module_name: 存取目前 session 模组。
session_name: 存取目前 session 名称。
session_register: 注册新的变数。
session_save_path: 存取目前 session 路径。
session_start: 初始 session。
session_unregister: 删除已注册变数。
setcookie: 送出 Cookie 资讯到浏览器。
setlocale: 设定地域化资讯。
settype: 设定变数型态。
set_file_buffer: 设定档案缓冲区大小。
set_magic_quotes_runtime: 设定 magic_quotes_runtime 值。
set_socket_blocking: 切换搁置与无搁置模式。
set_time_limit: 设定该页最久执行时间。
shm_attach: 开启建立共享记忆体区段。
shm_detach: 中止共享记忆体区段连结。
shm_get_var: 取得记忆体区段中指定的变数。
shm_put_var: 加入或更新记忆体区段中的变数。
shm_remove: 清除记忆体区段。
shm_remove_var: 删除记忆体区段中指定的变数。
shuffle: 将阵列的顺序弄混。
similar_text: 计算字串相似度。
Sin: 正弦计算。
sizeof: 获知阵列的大小。
sleep: 暂停执行。
snmpget: 取得指定物件识别码。
snmpwalk: 取得所有物件。
snmpwalkoid: 取得网路本体树状资讯。
snmp_get_quick_print: 取得 UCD 函式库中的 quick_print 值。
snmp_set_quick_print: 设定 UCD 函式库中的 quick_print 值。
solid_close: 关闭 solid 连结。
solid_connect: 连结至 solid 资料库。
solid_exec: 执行 SQL 指令。
solid_fetchrow: 取得传回一列。
solid_fieldname: 取得栏位名称。
solid_fieldnum: 取得栏位数目。
solid_freeresult: 释出传回资料的记忆体。
solid_numfields: 取得栏位数目。
solid_numrows: 取得传回列数目。
solid_result: 取得传回资料。
sort: 将阵列排序。
soundex: 计算字串的读音值
split: 将字串依指定的规则切开。
sprintf: 将字串格式化。
sql_regcase: 将字串逐字传回大小写字元。
Sqrt: 开平方根。
srand: 设定乱数种子。
stat: 取得档案相关资讯。
strchr: 寻找第一个出现的字元。
strcmp: 字串比较。
strcspn: 不同字串的长度。
strftime: 将伺服器的时间本地格式化。
StripSlashes: 去掉反斜线字元。
strip_tags: 去掉 HTML 及 PHP 的标记。
strlen: 取得字串长度。
strpos: 寻找字串中某字元最先出现处。
strrchr: 取得某字元最后出现处起的字串。
strrev: 颠倒字串。
strrpos: 寻找字串中某字元最后出现处。
strspn: 找出某字串落在另一字串遮罩的数目。
strstr: 传回字串中某字串开始处至结束的字串。
strtok: 切开字串。
strtolower: 字串全转为小写。
strtoupper: 字串全转为大写。
strtr: 转换某些字元。
strval: 将变数转成字串型态。
str_replace: 字串取代。
substr: 取部份字串。
sybase_affected_rows: 取得最后 query 影响的列数。
sybase_close: 关闭与资料库的连线。
sybase_connect: 连上资料库。
sybase_data_seek: 移动列指标。
sybase_fetch_array: 传回阵列资料。
sybase_fetch_field: 取得栏位资讯。
sybase_fetch_object: 传回物件资料。
sybase_fetch_row: 传回单列的各栏位。
sybase_field_seek: 设定指标到传回值的某栏位。
sybase_free_result: 释放传回占用记忆体。
sybase_num_fields: 取得传回栏位的数目。
sybase_num_rows: 取得传回列的数目。
sybase_pconnect: 开启伺服器长期连线。
sybase_query: 送出一个 query 字串。
sybase_result: 取得查询 (query) 的结果。
sybase_select_db: 选择一个资料库。
symlink: 建立符号连结 (symbolic link)。
syslog: 纪录至系统纪录。
system: 执行外部程式并显示输出资料。
Tan: 正切计算。
tempnam: 建立唯一的临时档。
time: 取得目前时间的 UNIX 时间戳记。
touch: 设定最后修改时间。
trim: 截去字串首尾的空格。
uasort: 将阵列依使用者自定的函式排序。
ucfirst: 将字串第一个字元改大写。
ucwords: 将字串每个字第一个字母改大写。
uksort: 将阵列的索引依使用者自定的函式排序。
umask: 改变目前的档案属性遮罩 umask。
uniqid: 产生唯一的值。
unlink: 删除档案。
unpack: 解压缩位元字串资料。
unserialize: 取出系统资料。
unset: 删除变数。
urldecode: 还原 URL 编码字串。
urlencode: 将字串以 URL 编码。
usleep: 暂停执行。
usort: 将阵列的值依使用者自定的函式排序。
utf8_decode: 将 UTF-8 码转成 ISO-8859-1 码。
utf8_encode: 将 ISO-8859-1 码转成 UTF-8 码。
virtual: 完成阿帕契伺服器的子请求 (sub-request)。
vm_addalias: 加入新别名。
vm_adduser: 加入新使用者。
vm_delalias: 删除别名。
vm_deluser: 删除使用者。
vm_passwd: 改变使用者密码。
wddx_add_vars: 将 WDDX 封包连续化。
wddx_deserialize: 将 WDDX 封包解连续化。
wddx_packet_end: 结束的 WDDX 封包。
wddx_packet_start: 开始新的 WDDX 封包。
wddx_serialize_value: 将单一值连续化。
wddx_serialize_vars: 将多值连续化。
xml_error_string: 取得 XML 错误字串。
xml_get_current_byte_index: 取得目前剖析为第几个位元组。
xml_get_current_column_number: 获知目前剖析的第几栏位。
xml_get_current_line_number: 取得目前剖析的行号。
xml_get_error_code: 取得 XML 错误码。
xml_parse: 剖析 XML 文件。
xml_parser_create: 初始 XML 剖析器。
xml_parser_free: 释放剖析占用的记忆体。
xml_parser_get_option: 取得剖析使用的选项。
xml_parser_set_option: 设定剖析使用的选项。
xml_set_character_data_handler: 建立字元资料标头。
xml_set_default_handler: 建立内定标头。
xml_set_element_handler: 设定元素的标头。
xml_set_external_entity_ref_handler: 设定外部实体参引的标头。
xml_set_notation_decl_handler: 设定记法宣告的标头。
xml_set_object: 使 XML 剖析器用物件。
xml_set_processing_instruction_handler: 建立处理指令标头。
xml_set_unparsed_entity_decl_handler: 设定未剖析实体宣告的标头。
yp_errno: 取得先前 YP 操作的错误码。
yp_err_string: 取得先前 YP 操作的错误字串。
yp_first: 传回 map 上第一笔符合的资料。
yp_get_default_domain: 取得机器的 Domain。
yp_master: 取得 NIS 的 Master。
yp_match: 取得指定资料。
yp_next: 指定 map 的下笔资料。
yp_order: 传回 map 的序数。
PHP简介及安装方式(含Apache Web Server)
作者:邱宏文
E-mail:chw1204@ms4.hinet.net
 
 
什么是PHP?
PHP=Personal Home Page Tools,于1994年由Rasmus Lerdorf创造,原本用途只是为知道他自己个人置于 Internet上的履历表曾被谁浏览过。
PHP是一个在伺服器端执行的Scripting Language。与ASP类似,其目的则为开发动态式的网页并可与资料库连结。
据估计,于1996年约有15,000个网站使用PHP,至今年1999年年中已有150,000网站使用PHP。
PHP的特性:
免费、轻巧快速 、真正跨平台 。
可支援多种资料库,包括常用的Oracle, mSQL, dBase, Sybase, Informix, MySQL等等。
具备CGI及类似JavaScript在Client端的功能。
语法与C及Perl相近
PHP的线上资源 :
官方网站: http://www.php.net/
线上说明手册:
可在www.php.net 查阅或download说明文件。
在安装完成后,可在PHP的目录底下的子目录../doc中取得,该手册为 html格式,可用浏览器直接浏览。
软体的取得:
可自www.php.net下载。目前最新版本为PHP 4.0 Beta 2 ,本次示范则以现行主流版本PHP 3.0为主。 其原始程式码为php-3.0.12.tar.gz。
安装方式:
背景描述:本次安装系与安装 Apache Web Server同时进行。系统平台为Linux Slackware 3.6。
应备的软体:php-3.0.12.tar.gz --用以安装PHP。
apache_1.3.9.tar.gz --用以安装Apache Web Server,该软体可自www.apache.org下载 。
安装流程:
将apache_1.3.9.tar.gz及php-3.0.12.tar.gz置于 /usr/local目录底下(该目录是一般习惯性的预设位置)并将其解压缩,解压缩完成后,会于/usr/local底下分别产生apache_1.3.9及php-3.0.12等二个子目录:
gunzip apache_1.3.9.tar.gz
tar xvf apache_1.3.9.tar
gunzip php-3.0.12.tar.gz
tar xvf php-3.0.12.tar
cd apache_1.3.9
将apache的程式目录指向/www:
./configure --prefix=/www
设定PHP的组态:
. cd /usr/local/php-3.0.12
./configure --with-apache=/usr/local/apache_1.3.9 --enable-track-vars
其中:--with-apache...为和apache连结成为apacheh的一个模组。
--enable-track-vars 为启动cookie的get/post等追踪功能。欲与资料库产生连结,也是在此做config,如 --with-MySQL。
开始安装PHP :
make
make install
设定apache的组态及安装:
cd /usr/local/apache_1.3.9
./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a
make
make install
将原始所附的php.ini范本:php.ini-dist cp 至 /usr/local/lib底下
cd /usr/local/php-3.0.12
cp php3.ini-dist /usr/local/lib/php3.ini
编修apache的httpd.conf或srm.conf档:
AddType application/x-httpd-php3 .php3
将php的档案格式的副档名指定为.php3,亦可自行指定,如:.phtml,.php等等。
启动Apache Web Server:
在/www/bin目录底下输入并执行 apachectl start便可启动apache server。
验证是否安装成功:
在Apache的html储存目录 /www/htdocs 底下用vi或joe等文字编辑器编辑一个 .php3档。
例子:<?php echo “Hello World!” ; ?>
php script的开始及结束符号可以有四种方式:
<? echo "Hello World" ?>
<?php echo "Hello World" ?>
<script language="php">
echo "Hello World";
</script>
<% echo "Hellm World" %>
可能的麻烦: 若在已安装有Apache的系统中,如教材所附的Slaciware3.6,再安装PHP时。要做组态设定会比较麻烦。心得: 如同操作或安装Linux的应用软体一般︌安装PHP也须叀考誸多的说明文件,即使PHP是属比较容易安装的软体
网页利器PHP简介与安装 ----------------PHP 3 (Hypertext Preprocessor)是一种䴺服器端崁入式HTML语言,它的语法大致䰊与C/C++、Perl、Java相似,只要有简单的程式设计观念便可以轻易的上手缌其功能与现今ASP功能类似,可以快速的写出功能强大的网页。PHP3除可以做一般的网页功能外,并提供像一般CGI的使用功能、cookies的功胼、档案上传、WWW使用者身分证明、GIF动画(需编辑组态加入GD library)等。
同时PHP3也支懴一般Unix系统所使用的资料库,它提些的资料库列表如下:
Adabas D InterBase Solid
dBase mSQL Sybase
Empress MySQL Velocis
FilePro Oracle Unix dbm
Informix PostgreSQL
另外PHP3也提供IMAP, SNMP, NNTP, POP3, HTTP的TCP/IP通讯协定上使用。笔者将利用几期的时间分别来介绍其安装、语法、函式、资料库连结、网页技巧等,或许读者可以先至 http://www.php.net取得最新的软体、资讯和详尽的手册,另外笔者建议可至http://linuxfab.cx/indexForumData.php3?FID=1浏览看看,那有许多相关的讨论。
1. 安装
PHP3可以分别编辑成apache module、fhttpd module、CGI三种形式。
1.1 原始档安装
因为笔者在目前发现PHP4.0 bata1已经公布,故完整安装使用PHP4 bata1安装,应PHP4只有bata版所以并不提供APXS更新及SETUP的方式产生组态安装档,所以必须使用最原始的方式安装,PHP4的组态及使用语法和PHP相同,另外注意PHP4在Apache上组态档设定和自己本身组态档名都以修改,请根据以下步骤安装以免发生问题。
PHP4使用的语法分析器改使用Zend,所以其执行效能比PHP3增强很多,几乎比一般 PHP3、APS快的3~6倍,如读者有兴趣请至http://www.zend.com/观看其比较结果。
下面步骤是针对apache module的PHP4 bata 1原始档快速安装的说明。
Step 1. tar xvfz apache_1.3.6.tar.gz ← 解压缩apache原始档。
Step 2. tar xvf php-4_0b1.tar.tar ← 解压缩php4 bata1原始档。
Step 3. cd apache_1.3.6 ← 切换至apache目录。
Step4. ./configure ← 执行apache组态设定(使用预设组态安装路径为/usr/local/apache)。
Step 5.cd ../php-4.0b1 ← 切换至php4路径。
Step 6 ./configure --with-apache=/root/apache_1.3.6 --enable-track-vars ← 执行php4组态并编辑成apache module型式,--enable-track-vars预设PHP4启动GET/POST/Cookie的功能,如有需要使用其他的参数请使用./configure --help观看其说明。Step 7. make ← 编辑PHP4。Step 8. make install ← 安装PHP4。Step 9 cd ../apache_1.3.6 ←切换回apache目录。Step10 ./configure --activate-module=src/modules/php4/libphp4.a ← 设定apache组态启动php4的模组。(注意:在apache module php4路径下并不会有libphp4.a这个档案,这是正常的,libphp4.a在之后会被apache 创造出来。)Step 11. make ← 编辑apache。tep 12. make install ← 安装apache。Step 13. 如果需要的话,将执行中的http server停止,并将/usr/local/apache/bin/下的httpd daemon拷贝至原本httpd daemon的路径,将旧的httpd daemon更换成新版,可使用httpd -l检查是否将PHP4编辑进入apache server,再重新启动http server。Step 14 cd ../php-4.0b1 ← 切换回PHP4路径。Step 15. cp php3.ini-dist /usr/local/lib/php.ini ← 将php.iji-dist拷贝至/usr/local/lib/php.ini这是PHP4预设的组态设定档预设组态路径,如果要使琨其它路径请至Step 6使用以下参数缔辑PHP3组怀,
--with-cojfig-file-path=/path in step 6
Step 16 编躑 httpd.conf 或 srm.bonf 档案ﴌ增加下列一行
AddTypa application/x-httpd-php .php
Step 17. 重新启动apache server。
1.2 RedHat Linux 6.0安装
RedHat 6.0已经将PHP3.0.7安装包含在apabhe module中了,但是在组态档并没有启动,需编辑以下组态档并重新启动apache。
Setp 1. joe /etc/httpd/conf/httpd.conf
LoadModule php3_module ← 载入php3 moduld。
moduleq.libphp3.so ← 设妚载入动态module路径及DSO module名称。
AddModule mod_php3.c ← 加入php3 module。
以上的组态已设定完成只需要将#号移除即可。
Setp 2. joe/etc/httpd/conf/srm.conf
AddType application/x-httpd-php3 .php3 ←加入处理php3档案
AddType application/x-httpd-php3-source .phps
以上的组态已设定完成只需要将#号移除即可。
Setp 3. 重新启动apache server,执行 /etc/rc.d/init.d/httpd restart。
1.3 PHP3更新
假如读者的apache一开始就编辑成DSO则可随时利用PHP原始码更新PHP3 apache module,步骤如下:
Setp 1.tar xvfz php-3.10.tar.gz ← 解压缩php3原始档。
Setp 2. cd php-3.0.10 ← 切换至php-3.0.10目录
Setp 3. 组态
./configure --with-apxs=/usr/local/apache/bin/apxs
(设定apache apxs的执行路径和档案名称)
--with-config-file-path=/usr/local/lib
(设定php3之前组态档的路径)
Step 4. make install ← 编辑并安装
2. 测试
我们可以执行下列步骤来测试PHP3是否正确编辑到apache module中。
Setp 1.切换至apache首页的路径(一般设定安装为/usr/local/apache/htdoc,RedHat Linux为/home/httpd/html)
Setp 2. 编辑新档(范例名称为info.php3),编辑内容如下:
<?php
phpinfo(); // phpinfo()为PHP3本身提供系统资讯函式
?>
Step3. 透过浏览器观看结果,如图一所示:
3. PHP3组态档说明
PHP3的组态档档名为php3.ini,其预设路径为/usr/local/lib,若RedHat Linux系统则路径为/etc/httpd/,如果要使用其它的组态档路径或是使用旧的PHP3组态,只要在编辑PHP3时加入下面参数即可--with-config-file-path=DIR,其中DIR为使用路径。PHP3.ini这个档案是当PHP3语法分析器启动时就会根据其设定来启动PHP3语法分析器,如果PHP3是编译成伺服器模组的话,这个档案会于伺服器启动一起启动,但是如果是编辑成CGI的形式,则这个档案会于每次执行CGI就读取此设定。PHP3组态设定主要分为以下六大部分︰
1. 一般的PHP3组态设定。
2. Mail的组态设定。
3. PHP3安全模式的组态设定。
4. PHP3除错的组态设定。
5. 扩展性的载入设定。
6. 资料库的组态设定。
我们可以自己编辑一个PHP3的档案,在档案中呼叫其info()的函数,并输出在浏览器上,这样就可以从远端得知自己的PHP3的组态设定状态。
一般的PHP3组态设定说明︰(较重要的几项说明)
1.display_errors=on (on/off)
设定是否将PHP3语法分析器所检查出的错误,显示于HTML档上。
2. engine=on (on/off)
设定是否启动PHP3语法分析器,只有当PHP3编辑成apache模组时,这个指令可以根据不同的路径、虚拟主机路径在apache组态档设定成(on/off)。
3.error_reporting=7
设定PHP3语法错误的等级,其设定值为整数值,数值意义如下︰
数值 数值意义
1 普通错误
2 普通警告
4 语法错误
8 警要性关联性错误
系统预设值为7,就是显示普通错误、普通警告和语法错误。
4.max_execution_time=30
设定每个PHP3程式所能执行的最大时间,预设为30秒。
5. memory_limit= 8388608
设定每个PHP3程式所能使用的最大记忆体大小,预设为8388608也就是8MB。
6. precision =14
设定浮点数其有效位数为几位数。
7.upload_max_filesize = 2097152
设定最大上传档案大小。
8.include_path =
额外设定PHP3的include档路径。
9.safe_mode boolean(on/off)
设定PHP3是否可以启动成为安全模式。
10.sendmail_path
设定sendmail程式的路径。
11.track_vars boolean(on/off)
设定是否使用track_var的功能, $HTTP_GET_VARS, $HTTP_POST_VARS and $HTTP_COOKIE_VARS
12.log_errors (on/off)
是否记录执行错误的PHP3程式错误。
5 使用简介我们可以使用下列方法在HTML档中执行PHP3的指令:(copy from http://www.php.net/manual/html/language.basic-syntax.html)
1. <? echo ("this is the simplest, an SGML processing instruction/n"); ?>
2. <?php echo("if you want to serve XML documents, do like this/n"); ?>
3. <script language="php">
echo ("some editors (like FrontPage) don't
like processing instructions");
</script>
4. <% echo ("You may optionally use ASP-style tags"); %>
<%= $variable; # This is a shortcut for "<%echo .." %>
其中笔者比较建议使用第二种方式,简单清楚,或许稍有程式设计的读者可以先看一下http://www.php.net/docs.php3,十分容易的。接下来笔者使用以下范例来说明PHP3 date函数的用法︰
<CENTER>One 3.0.10 script</CENTER>
<? php
$today = date("Y-m-d");
$time = date("H:i:s");
PRINT "<CENTER>Today is: $today</CENTER>";
PRINT "<CENTER>Now TIME is: $time</CENTER>";
?>
执行的结果如图二所示图二而此时可以检视输出的HTML档,如图三所示:图三从上面范例我们不难发现使用PHP3所写的部分并不会显示在一般网页原始程式上,这项就可有效保障自身网路程式的智慧财产权。
6. 语法说明
6.1程式注解方式
PHP3提供程式的注解方式有C、C++和Unix shell三种方式,范例如下:
<?php
echo "This is a test"; // This is a one-line c++ style comment ← 这是C++所使用的注解方式,就是使用//后面加上你要的注解文字, // 使用//注解方式其有效范围为到该行结束为止。
/* This is a multi line comment
yet another line of comment */ ← 这是C所使用的注解方式,也就是使用/*后面加上你要的注解文字,注解结束并加上*/,让程式了解注解结束。另外使用/*需注意在注解符号后不可有空白。
echo "This is yet another test";
echo "One Final Test"; # This is shell-style style comment
?>
井字号这是一般Unix shell注解的使用方法,使用时需注意#的有效范围为一行,如要多行注解则要在每行注解开头加上井字号。
6.2 资料类型
PHP提供以下的形态:
1. Integers 整数
2. Floating point numbers 浮点数
3. Strings 字串
4. Arrays 矩阵
5. Objects 物件
6.2.1 Integers 整数
整数的类型可以使用10、8或是16进制的数字表示法,例如36可以使用以下方式表达︰
$a = 36; # 10进制
$a = 044; # 8进制
$a = 0x24; # 16进制
$a=-36 ;# 负整数
凡是以0开头的常数会被compiler 视为8进制,而以0x开头的常数视为16进制。
6.2.2 Floating point numbers 浮点数
浮点数有以下两种类型,浮点数在PHP3下视为double的型别。
$a = 1.234;
$a = 1.2e3;
以上两种都是浮点数1.234的表示法,e的浮点数表示法是一般工程上常使用的表示方法。
6.2.3 Strings 字串
字串有以两种使用方式,第一种表示方法为将字串放于一对双引号之间,变数在双引号之间将被扩充(但主要还是受到语法分析器限制),在一般C、Perl语言中有定义一些特殊的反斜线字元(“/”),以使用在一般特殊的场所或用途,其符号说明如下︰
符号 说明
/n 换行 New line
/r carriage
/t Tab键
// 显示/
/$ 显示$
/” 显示”
使用特殊字元,你可以从其他字元跳脱,但是注意这样产生的错误可能会造成高于语法错误的错误等级。第二种字串使用方法是限定字串使用单引号(‘ ‘),字元将不能使用任何变数的延伸和使用反斜线。PHP3在处理字串除了”//”和”/”外,你可以使用反斜线(“/”)单引号(‘)和双引号(“)。当字串要被使用成数字时,它的结果数值和类型是借由以下决定,当字串转换为数值时,如果字串中有英文字母的e、E和小数点时,PHP3会自动将字串定为double。
$foo = 1 + "10.5"; // $foo is double (11.5)
$foo = 1 + "-1.3e3"; // $foo is double (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 1 + "10 Little Piggies"; // $foo is integer (11)
$foo = "10.0 pigs " + 1; // $foo is integer (11)
$foo = "10.0 pigs " + 1.0; // $foo is double (11)
6.2.4 矩阵
单一矩阵︰PHP提供阶梯状和关联性矩阵,事实上这两种并没有不同,你可以制造一个矩阵并使用list() or array() functions,如此你将可以设定矩阵中的每一个元素。
$a[0] = "abc";
$a[1] = "def";
$b["foo"] = 13;
也可以在所设定矩阵后面加上出始值︰
$a[] = "hello"; // $a[2] == "hello"
$a[] = "world"; // $a[3] == "world"
矩阵可以储存藉着使用以下的函数asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), and uksort()。
多维矩阵可以藉着以下的方式产生︰
$a[1][0] = $f; # 二维矩阵
$a["foo"][4]["bar"][0] = $f; # 四维矩阵
举例如下︰
# Example 1:
$a["color"] = "red";
$a["taste"] = "sweet";
$a["shape"] = "round";
$a["name"] = "apple";
$a[3] = 4;
# Example 2:
$a = array(
"color" => "red",
"taste" => "sweet",
"shape" => "round",
"name" => "apple",
3 => 4
);
array() 可以被使用在多为矩阵中。
<?
$a = array(
"apple" => array(
"color" => "red",
"taste" => "sweet",
"shape" => "round"
),
"orange" => array(
"color" => "orange",
"taste" => "sweet",
"shape" => "round"
),
"banana" => array(
"color" => "yellow",
"taste" => "paste-y",
"shape" => "banana-shaped"
)
);
echo $a["apple"]["taste"]; # will output "sweet"
?>
6.2.5 物件
起始化一个物件,必须使用新的叙述才能将物件提供给变数使用,举例如下︰
class foo {
function do_foo () {
echo "Doing foo.";
}
}
$bar = new foo;
$bar -> do_foo ();
6.2.6 改变类型PHP3并不需要或者说是并不提供额外类型让使用者去定义变数,变数本身的类型定义是借由变数的本身的类型来自行决定,也就是说假如$a是字串,则$a就是字串类型,如果$a=10,则$a此时的类型为整数。举例使用+来测试PHP3的自动类型转换,如果变数是整数结果就是整数,字串结果也就成为字串。如果你真的要订定变数类型,请观看以下说明变更类型。
$foo = "0"; // $foo is string (ASCII 48)
$foo++; // $foo is the string "1" (ASCII 49)
$foo += 1; // $foo is now an integer (2)
$foo = $foo + 1.3; // $foo is now a double (3.3)
$foo = 5 + "10 Little Piggies"; // $foo is integer (15)
$foo = 5 + "10 Small Pigs"; // $foo is integer (15)
自行设定变数类型方法和C有点类似,只要在变数之前加上( ),( )中加入所要设定的类型即可,举例如下︰
$foo = 10; // $foo is an integer
$bar = (double) $foo; // $bar is a double
自订类型的型态允许下面几种方式︰
(int), (integer) - cast to integer
(real), (double), (float) - cast to double
(string) - cast to string
(array) - cast to array
(object) - cast to object
注意︰在( )设定类型中可以使用空白加上类型名称,举例如下︰
$foo = (int) $bar;
$foo = ( int ) $bar;
6.3 变数范围
任何变数在PHP3函数中都预设为区域变数,例如︰
$a = 1; // 这时候变数a在整个程式中的值,永远为1,也就是$a为整体性变数。
Function Test () {
echo $a; // 因为$a被呼叫使用于函数中,所以$a此时为区域变数。
}
Test ();
这个程式执行会出现Warning: Uninitialized variable or array index or property (a),这样的错次讯息因为在echo这但叙述中$a为区域变数,它并未给$a设定值,所以输出时会产生错误。你必须注意在PHP3变数的范围有一点点不同于C,在C语言在上面的范例区域变数值会自动设定为1,除非在Function中宣告$a global 变数,在PHP3设定整体变数再函数使用必须向下面范例一样设定︰
$a = 1;
$b = 2;
Function Sum () {
global $a, $b;
$b = $a + $b;
}
Sum ();
echo $b;
则上面输出的结果等于3,因为在Function中加入global使得变数a,b将归类成为整体性变数。在这个Function并没有限制只能有多少个变数可以设定为区域性变数。第二种方法允许Function使用设定整体性变数的方式,是使用PHP3整体性矩阵($GLOBALS)来定义整体性变数。上面的范例也可以书写成以下的方式。
$a = 1;
$b = 2;
Function Sum () {
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum ();
echo $b;
这个$GLOBALS矩阵是一个关联性矩阵,它的矩阵元素内容是和输入的内容有关联。其他几个重要的变数区域特点是静态变数,静态变数是只有存在于Function之中,但是它并不会遗弃它的值当程式执行结束并跳出Function,它的值还是不变。利用以下的范例思考一下静态变数在PHP3的意义。
Function Test () {
$a = 0;
echo $a;
$a++;
}
上面是一个没有作用的程式。
6.4 设定变数
变数在一般PHP3是使用和设定成动态的数值,一般变数的语法使用语法如下︰
$a=”hello”;
设定$a是各字串变数,同时$a的值为hello。如何在一般变数设定中在设定变数呢?设定的方法如下,就是设定变数完之后,再加上设定变数的符号$,这样就设定成双层变数,举例如下︰
$a = "hello";
$$a = "world";
这个时候PHP3会将$$a的第一次变数设定为hello,再将$$a设定为$hello。上面的例题变数a=hello,变数变数a也就是变数hello的内容是world,因此上述内容等于以下表示法︰
echo "$a ${$a}"; // 它正确的输出结果也和以下结果相同︰
echo "$a $hello";
上述的范例输出为hello world.。
6.4.1 PHP从HTML中取得变数值
当一个表单由使用只送出,PHP将自动产生一个变数,同时变数值为所设表单所送出的值。详细考虑以下范例︰
<form action="foo.php3" method="post">
Name: <input type="text" name="name"><br>
<input type="submit">
</form>
当submitted PHP将自动产生一个$name,而$name的值就是我们输入的值。使用矩阵得到外在变数,只能使用单为矩阵方式,范例如下︰
<form action="array.php" method="post">
Name: <input type="text" name="personal[name]"><br>
Email: <input type="text" name="personal[email]"><br>
Beer: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog
<option value="guinness">Guinness
</select>
<input type="submit">
</form>
假如在安装 PHP有安装track_vars并予组态档设定这个功能时,则可以经由POST or GET得到变数并可配合PHP提供的矩阵$HTTP_POST_VARS 、$HTTP_GET_VARS来使用。
当我们要使用图形的submit button只要类似底下的方法就行了︰
<input type=image src="data:image.gif" name="sub">
6.5 环境变数
PHP可以将环境变数当成一般PHP的变数,举例如下︰
echo $HOME; //假如有设定系统家目录变数,则会输出变数内容。
如何得知变数的类型,可以使用PHP提供的函数得知,函数提供如下,gettype(), is_long(),
is_double(), is_string(), is_array(), and is_object()。
6.6 算术式
算术式是PHP相当重要的基本的功能之一,算术的运算对象是资料,算术式是将算术与资料、变数、函数做合法用算。运算符号说明︰
符号 名称
$a+$b 加
$a-$b 减
$a*$b 乘
$a/$b 除
$a%$b 余数
范例︰
$a=10;
$b=3;
$c=$a%$b;
echo $c // 此时输出为1。
字串连结符号︰字串连结符号,只有一种就是使用小数点加以连结两个字串,举例如下︰
$a = "Hello ";
$b = $a . "World!";
print $b; // 则显示字串HelloWorld。
指定符号︰(=)
基本的指定符号为等号(=),你必须承认它是一个相等的符号,等号的意义是将右边的值设定到等号左边。
范例︰$a = ($b = 4) + 5; // a的值为9,因为变数b被设定为4。
我们可以立刻使用指定符号来完成综合运算,例如字串结合、算数运算等等….举例如下︰
$a = 3;
$a += 5; //此时$a=8
$b = "Hello ";
$b .= "There!"; //设定$b为"Hello There!",它等于以下叙述
$b = $b . "There!"
Bitwise Operators可以让你去设定每一个bit是(0或1)。
Bitwise Operators 说明表格如下︰
符号 名称 结果
$a & $b And 将a和b对应的位元作AND
$a | $b Or 将a和b对应的位元作OR
~ $a Not 将a的每一个位元作NOT
$a << $b 左移 将a的位元左移b个bit(其意义为x2)
$a >> $b 右移 将a的位元右移b个bit (其意义为 /2)
范例︰
$a=10;
$b=4;
$c=$a&$b;
print $c; // 输出为0
逻辑运算(Logical Operators)︰
符号 名称 结果
$a and $b And 对a和b做逻辑And
$a or $b Or 对a和b做逻辑Or
$a xor $b Xor 对a和b做逻辑Xor
! $a Not 对a做逻辑Not
$a && $b And 对a和b做逻辑And
$a || $b Or 对a和b做逻辑Or
上面and和&&,or和||意义逻辑意义是相同,但其拥有不同的优先权。
范例︰将上述范例的$c修改成,$c=$a xor $b 其输出为10。
比较符号︰
比较无号的意义是你能将两个值加以比较,其运算结果传回ture(1)、not ture(0)。
符号 名称 结果
$a == $b 相等 比较a是否等于b
$a != $b 不等 比较a是否不等于b
$a < $b 小于 比较a是否小于b
$a > $b 大于 比较a是否大于b
$a <= $b 小于等于 比较a是否小于等于b
$a >= $b 大于等于 比较a是否大于等于b
另外PHP也提供和C语言相同的条件符号?,其使用格式如下︰
符号 范例 说明
?︰ a?b︰c 若a为真,则取b,否则则取c
运算符号的优先顺序︰运算符号的优先顺序决定两个运算式,该如何一起工作︰Examlpe 1 + 5 * 3 大家都知道答案为16并不是18,因为*的运算优先权大于+号,这样大家明白优先权的重要性了吧。请观看PHP手册的运算符号优先权列表。
6.8 PHP流程控制
6.8.1 条件控制
if 语法︰
if (条件式){叙述}范例︰
if ($a > $b)
print "a is bigger than b";
当$a>$b则显示a is bigger than b。
也可以配合else和else if 来加强if的功能,举类如下︰
if ($a > $b) {
print "a is bigger than b";
}
elseif ($a == $b) {
print "a is equal to b";
}
else {
print "a is smaller than b";
}
以上范例就是利用if写成一个判定两数>、<、= 的比较式子。
PHP例外提供另一种if 的语法,你可以选择要使用哪一种方式来书写,这个方式和HTML的if是相同的,举例如下︰
if ($a == 5):
print "a equals 5";
print "...";
elseif ($a == 6):
print "a equals 6";
print "!!!";
else:
print "a is neither 5 nor 6";
endif;
switch 是多重判断的流程控制指令,它的书写方式较if-else简单,举例如下︰
switch ($i) {
case 0:
print "i equals 0";
break;
case 1:
print "i equals 1";
break;
case 2:
print "i equals 2";
break;
default:
print "i is not equal to 0, 1 or 2";
}
6.8.2 回圈控制
while是最简单的回圈,基本的while语法如下︰
while (条件式)
{叙述}
其动作方式为当符合条件式的条件,则进行动作否则就跳过while回圈的动作。范例如下︰
/* example 1 */
$i = 1;
while ($i <= 10) {
print $i++;
}
/* example 2 */
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
这两个范例都是将1~10显示出来。
do..while是相似于while回圈,其基本动作方式如下︰
do{动作}
while(条件式)
do..while是先动作然后在检查条件式条件,直到不符合条件才跳出回圈,范例如下︰
do {
if ($i < 5) {
print "i is not big enough";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
print "i is ok";
...process i...
} while(0);
for是PHP最复杂的回圈,它基本的语法如下︰
for (expr1; expr2; expr3)叙述
expr1是for回圈起始值设定,只有在第一次执行才会被执行。
expr2 是for回圈条件判断式,条件为真则执行叙述。
expr3 当for回圈执行完expr2的叙述时,将值都到指加以运算,举例如下︰
/* example 1 */
for ($i = 1; $i <= 10; $i++) {
print $i;
}
此范例输出1~10的值。
break指令是可以从正在执行的回圈中跳出,范例如下︰
$i = 0;
while ($i < 10) {
if ($arr[$i] == "stop") {
break;
}
$i++;
}
continue 被使用在一回圈结构之中,它可以跳到回圈其他部分并加以执行回圈,或重复回圈运作等等的功能,continue范例如下︰
while (list($key,$value) = each($arr)) {
if ($key % 2) { // 重设定的数字中跳脱
continue;
}
do_something_odd ($value);
}
6.9 require
require就和C语言中的箝制处理#include相同,但结束叙述必须加上;,举例如下︰
require 'header.inc';
6.10 return
数值可以返回使用return的语法将数值return,任何类型都可以return包含lists、 objects,举例如下︰.
function square ($num) {
return $num * $num;
}
echo square (4); // outputs '16'.
结语
或许很多人都知道M$的ASP,事实上还有一个更好的网页设计语言 -- PHP,PHP高度的跨平台性,而且效率又高,可惜国内的资料不丰,希望能藉者笔者简单的说明可以让更多的人接触到这好的网页设计语言,并从中学习。另外PHP Club( http://phpclub.unet.ru)是一群程式设计师组织起来,成立的 MySQL 和 PHP 技术讨论专门网页,有兴趣的读者可以前往参观。

php 程序设计代码教程相关推荐

  1. c语言教程的辅导书,清华大学出版社-图书详情-《C语言程序设计案例教程学习辅导》...

    01C语言是国内广泛使用的计算机语言,是很多高等学校计算机及相关专业的核心课程,以及其他理工科专业的计算机通识基础课程.于延.周国辉主编的<C语言程序设计案例教程>(清华大学出版社出版)采 ...

  2. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  3. java程序设计p75_java语言程序设计实用教程第四讲控制结构.ppt

    java语言程序设计实用教程第四讲控制结构.ppt 还剩 29页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: ...

  4. java程序设计实用教程高飞pdf_普通高等教育“计算机类专业”规划教材:Java程序设计实用教程习题集 pdf epub mobi txt 下载...

    普通高等教育"计算机类专业"规划教材:Java程序设计实用教程习题集 pdf epub mobi txt 下载 图书介绍 ☆☆☆☆☆ 高飞,赵小敏,陆佳炜 等 著 下载链接在页面底 ...

  5. C语言程序设计入门教程

    C语言程序设计入门教程 目录 语言分类 C语言特点 最简单的C语言程序 注释方式 C语言程序的结构 程序设计的任务阶段 选择结构程序设计 关系运行算符 逻辑运算符 switch语句 条件运算符 数据类 ...

  6. java程序设计实践教程张永常_java程序设计实用教程

    典型案例,轻松易学:通过139个课堂案例讲解理论知识,直观.具体: 边做边学,练习巩固:随书附赠教学视频,边看边学,并且通过20个课堂练习和每章课后习题来实操练习,巩固提高: 学习资源丰富:随书附赠课 ...

  7. Windows程序设计入门教程[来自邪恶八进制信息安全团队(www.eviloctal.com)]

    Windows程序设计入门教程 前骤: 1.第一个windows程序: 先讲几个专有名词:HINSTANCE 由handle(句柄)和instance(实例) 句柄,类似于C中的指针,指向资源,是资源 ...

  8. 高精度小数乘法c语言程序设计教程课后答案,级C语言程序设计基教程课后习题答案.doc...

    级C语言程序设计基教程课后习题答案 C语言课后习题习题答案详解(11级教材) 第1章 填空题 应用程序ONEFUNC.C中只有一个函数,这个函数的名称是__main . 一个函数由__函数头__和__ ...

  9. 《基于 DirectX11 的 3D 图形程序设计案例教程》学习四 D3DTriangle

    源程序:   此次例子的大部分代码均拷贝自上一章 InitD3D 例子程序.   d3dUtility.h /********************************************* ...

  10. java6程序设计实践教程_Java 6 程序设计实践教程

    本书当前实时库存为: 本 书名:Java程序设计与实践教程 ISBN:9787115360458 出版社:人民邮电出版社 作者:张勇 页数:218 出版日期:2014年09月 参考重量:0.330Kg ...

最新文章

  1. 广东科技学院专插本c语言考卷_广东科技学院第二届红色文化节之红色影视经典配音大赛决赛...
  2. 新手关于import/export的理解
  3. quartz源码解析--转
  4. java枚举使用示例
  5. BERT可以上几年级了?Seq2Seq“硬刚”小学数学应用题
  6. c++类的静态成员特性
  7. linux vmcore 分析,crash分析vmcore
  8. java jni helloword_JNI学习一:编写HelloWorld程序
  9. LVS——DR模式(负载均衡)
  10. 领英·影响力2020:职场人再定位,千里马伯乐新论
  11. python之模块copy_reg(在python3中为copyreg,功能基本不变)
  12. 量化指标公式源码_通达信博尔量化指标 看了就明白 源码
  13. TC8:UDP_FIELDS_01-16
  14. 席位、交易单元、交易网关是什么
  15. js月份的计算公式_JavaScript getMonth() 方法
  16. 黑客窃取企业数据的后门程序技巧
  17. 动态修改esxi虚拟机的CPU和内容
  18. 面向对象思想----不看后悔!
  19. mixamo骨骼_mixamo动作库的模型和动作绑定控制器的方法-上集
  20. [学习]BES蓝牙芯片开发

热门文章

  1. 【杨中科解惑】我该怎么选择?选择就是放弃
  2. python字体大小设置苹果电脑_如何调整Mac字体大小Mac字体大小调整方法
  3. 如何在dev cpp中使用c++11标准
  4. 查看jdk版本号和安装目录
  5. html生物代码,方舟生存进化全生物代码
  6. html答题游戏代码,html5+css3+ajax手机端脑筋急转弯答题游戏代码
  7. 超宽屏幕比例_显示器屏幕比例与分辨率对照表
  8. unraid win10_搞定unraid直通核显给WIN10后黑屏、声卡无输出问题
  9. Tomcat优化详细教程
  10. Unity渲染管线,初探SRP