Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84989
  • 博文数量: 20
  • 博客积分: 1490
  • 博客等级: 上尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-18 08:43
文章分类

全部博文(20)

文章存档

2013年(1)

2010年(1)

2009年(4)

2008年(14)

我的朋友
最近访客

分类:

2008-09-08 11:08:00

算术运算 (arithmetic operators) 符号,就是用来处理四则运算的符号,这是最简单,也最常用的符号,尤其是数字的处理,几乎都会使用到算术运算符号。
符号 意义
+ 加法运算
- 减法运算
* 乘法运算
/ 除法运算
% 取余数
++ 累加
-- 递减
 
 
以下为简单的算术运算范例
 
 
 
$a = 8;
$b = 2;
$c = 3;
echo $a+$b."
\n";
echo $a-$b."
\n";
echo $a*$b."
\n";
echo $a/$b."
\n";
echo $a%$c."
\n";
$a++;
echo $a."
\n";
$c--;
echo $c;
?>
字串运算
---------------------------------------------------------------------
字串运算 (string operator) 的运算符号只有一个,就是英文的句号 .。它可以将字串连接起来,变成合并的新字串。
以下是字串运算的例子
$a = "PHP 4";
$b = "功能强大";
echo $a.": ".$b;
?> 设定运算
设定运算 (assignment operator) 有时会让人搞得一头雾水,不过它可以让程式更精简,增加程式的执行效率。
符号 意义
= 将右边的值连到左边
+= 将右边的值加到左边
-= 将右边的值减到左边
*= 将左边的值乘以右边
/= 将左边的值除以右边
%= 将左边的值对右边取余数
.= 将右边的字串加到左边
$a = 5;
$a += 2;    // 即 $a = $a + 2;
echo $a."
\n";
$b = "哇";
$b .= "哈";   // $b = "哇哈";
$b .= "哈";   // $b = "哇哈哈";
echo "$b
\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 为符合条件的执行区段程式,若程式只有一行,可以省略大括号 {}。
范例:本例省略大括号。
if (date("D") == "Sat") echo "周末了,狂欢去";
?>
范例:本例的执行区段有三行,不可省略大括号。
if (file_exists("/usr/local/lib/php3.ini")) {
echo "以下是 PHP3 的设定档

\n";
readfile("/usr/local/lib/php3.ini");
echo "\n";
}
?>
第二种是除了 if 之外,加上了 else 的条件,可解释成 "若发生了某事则怎样处理,否则该如何解决"。语法如下
if (expr) {
statement1
} else {
statement2
}
范例:上面的例子来修改成更完整的处理。其中的 else 由于只有一行执行的指令,因此不用加上大括号。
$f="/usr/local/lib/php3.ini";
if (file_exists($f)) {
echo "以下是 PHP3 的设定档

\n";
readfile($f);
echo "\n";
} else echo "很抱歉,找不到 $f";
?>
 
第三种就是巢状的 if..else 回圈,通常用在多种决策判断时。它将数个 if..else 拿来合并运用处理。
 
直接看下面的例子
 
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 做错事被处罚)
$i = 1;
while ($i <= 10) {
print $i++;
echo ". 以后不敢了
\n";
}
?>
while 可以不用大括号来包住执行区段,而使用冒号加上 endwhile。见下例
$i = 1;
while ($i <= 10):
print $i++;
echo ". 以后不敢了
\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 回圈的比较。
for ($i=1; $i<=10; $i++) {
echo "$i. 以后不敢了
\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 跳离回圈。
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 用来跳出目前执行的回圈,如下例
$i = 0;
while ($i < 10) {
if ($arr[$i] == "stop") {
break;
}
$i++;
}
?>
continue 即刻停止目前执行回圈,并回到回圈的条件判断处,见下例
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 支援的变数型态都可以使用,无论是阵列、字串、或是整数....等等。传回值也是一样。
下面即为使用内定值及不用内定值的例子
function myfunc1($arg_1, $arg_2, $arg_3="我是内定字串") {
echo $arg_1+$arg_2;
echo $arg_3."

\n";

}
myfunc(3, 4);               // 参数 $arg_3 省略。
myfunc(6, 6, "不用内定值") // 输入参数 $arg_3。
?>
参数的值,通常使用传值的方式输入,有时在特别的需求时,可以使用传址的方式,传入参数的指标。方法就是在参数的前面加上 & 符号即可。如下例
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 变数只用在物件类别中,表示物件的本身。
// 程式名: 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 物件。使用 -> 符号,表示执行物件的方法。
require("cart.inc");
$cart = new Cart;
$cart->add_item("10", 1);
?>
之后再设计有记名的手推车。记名手推车从手推车遗传下来,因此手推车拥有的方法及属性,记名手推车也有,而记名手推车比手推车增加了名字的方法 (或许该称属性较恰当)。
从下例中可以看到,子物件 Named_Cart 使用 extends 来继承其父物件 Cart。虽然 Named_Cart 物件中没有增加物品及减少物品的方法,不过由于遗传的特性,父物件有的东西它都有。
// 程式名: named_cart.inc
require("cart.inc");
class Named_Cart extends Cart {
var $owner;
function set_owner ($name) {
$this->owner = $name;
}
}
?>
要使用记名手推车物件,请看下面的范例。当然这不算太好的设计,每个子物件都一直 require 它的父物件,会造成伺服器在 I/O 上面的负担。在实作时,可以将整个系列的物件在同一个程式档案中,从最早的袓先物件到最后的子孙物件,也方便日后修正。
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 所提供,并经过作者少许修改。
访客计数器 原型
/*
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);
?>
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 档都在 中,可以在 httpd.conf 加入下面的例子
php3_include_path .:./include:../include
别忘了重新启动 Apache 伺服器,新增的 include 路径才有效。
./apachectl restart
再来就在伺服器的 .../include 目录中放入以下的档案,档名存成 counter.inc
下面就是 MyCounter() 函式。为了让读者方便了解,程式中的变数 $counterFile、$fp 及 $num 保持和 David W. Bettis 所设定的计数器中的变数功能相同。
//---------------------------
// 访客计数器函式 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() 函式,就可以使用了
require("counter.inc");
?>
访客计数器 最终版
您是第 位参观者
Copyright ? 1999, Wilson Peng
要用这个 MyCounter() 函式,先在 Homepage 的开头处加入 require() 函式,引入 MyCounter() 函式成为该 Homepage 的一部份。之后再将 字串放在需要计数器的地方就可以了。
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 伺服器上的使用者身份确认的设定。
AuthType Basic
AuthName MyMember
AuthUserFile /usr/local/MyMember.txt
Options Includes ExecCGI
require valid-user
在这个例子中,当使用者在看 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 伺服器的设定都不太相同,但在设定上都大同小异。
阅读(892) | 评论(0) | 转发(0) |
0

上一篇:busybox

下一篇:php程序设计代码教程(5)

给主人留下些什么吧!~~