当前位置: 编程技术>php
本页文章导读:
▪phpBB BBcode处理的漏洞
发布日期:2002-04-3 漏洞类别:PHP,远程WEB接口,拒绝服务 bugtraq ID 4432、4434 存在问题的版本: phpBB 1.44,更低的版本及 phpBB 2.0 未测试。 描述: phpBB是一个被.........
▪用IE远程创建Mysql数据库的简易程序
小生近日来学习Mysql数据库,自己编写一个用IE远程创建Mysql数据库的简易程序,此程序适用与对Mysql数据库一无所知的人,可以轻松的创建Mysql数据库及数据库中的各种类型的表,而且完全是图形.........
▪PHP使用者状态管理功能的应用
使用者状态管理(session support)是 PHP 4.0 一个让大家期待已久的新功能。在 PHP 3.0 的时代,程序设计员必须使用其它人写好的函式库来实作状态管理功能,或者就干脆放弃这项功能不用算了.........
[1]phpBB BBcode处理的漏洞
来源: 互联网 发布时间: 2013-11-30
发布日期:2002-04-3
漏洞类别:PHP,远程WEB接口,拒绝服务
bugtraq ID 4432、4434
存在问题的版本:
phpBB 1.44,更低的版本及 phpBB 2.0 未测试。
描述:
phpBB是一个被广泛应用的基于PHP的论坛。发现其BBcode中对于“源代码”类的引用处
理存在漏洞,通过发送特殊格式的转义字符串可导致数据库的损坏以及服务器的 CPU、内存
资源大量消耗。
详细:
phpBB在对“源代码”类的引用处理不当,主要是为了要支持镶套的标记
而造成的。有问题的代码是functions.php中的bbencode_code函数。
当我们提交一个这样的贴子:
实际向数据库中存储的数据是这样:
[1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1][1code]
\0\0\0\0\0\0\0
[/code1]
即实际系统要负担的数据量是输入的“\0”的数量的平方,如果发送 1 MByte的数据,系统
实际处理的数据将接近 1 TByte。
这是我们在实验机器上发送一个包含''*800的帖子时的资源占用情况:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
8643 nobody 13 0 212M 81M 13604 D 8.0 65.7 0:07 httpd
提交贴子后会提示出错:
Could not enter post text!
但实际上贴子的标题和提交者这两个数据已存到数据库中,但内容和其他一些数据没有,所
以打开的时候会出现错误页面。而且这样的帖子无法用正常的方法删掉,只能用直接连接到
数据库来删除。以下是提交不同数据量的结果:
''* =<583 正常贴上,可以删除
''* 584 正常贴上,可以编辑,但不能删除
''* 585 提示 Could not enter post text! 但贴子也没有
''* 586 正常贴上,可以删除
''* 587 提示 Could not enter post text! 但贴子也没有
''* 588 正常贴上,可以删除
''* 589 提示 Could not enter post text! 但贴子也没有
''* >=590 提示 Could not enter post text! 出现删不掉的帖子
如果发送镶套的标记则占用资源更多,我们在实验机器上发送这样的帖子:
代码如下:
[code]\0
\0[/code] 虽然只有49Byte的数据,但资源占用非常可观:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
25741 nobody 14 0 11828 9996 416 R 99.9 7.8 2:38 httpd
几秒钟后产生了大量的数据,内存大量消耗:
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
3 root 10 0 0 0 0 SW 2.5 0.0 4:13 kswapd
25742 nobody 17 0 265M 90M 52104 R 25.1 73.0 1:45 httpd
这样的镶套帖子是不会存储到数据库中的,但随着镶套的增加资源的占用会按照几何级数递
增。如果一次发送更多数据,或者不断的发送,可以导致系统资源大量占用,最终拒绝服务。
实验环境:linux 2.4.10 Apache/1.3.23 PHP 4.12
解决方案:
1、暂时禁用BBcode。
2、alert7给出了functions.php的如下修改方法,暂时停用对镶套标记的支持:
把773行开始的bbencode_code函数改为:
function bbencode_code($message, $is_html_disabled)
{
$message = preg_replace("/\[code\](.*?)\[\/code\]/si", "<!-- BBCode Start --><TABLE BORDER=0 ALIGN=CENTER WIDTH=85%><TR><TD><font size=-1>Code:</font><HR></TD></TR><TR><TD><FONT SIZE=-1><PRE>\\1</PRE></FONT></TD></TR><TR><TD><HR></TD></TR></TABLE><!-- BBCode End -->", $message);
return $message;
} // bbencode_code()
对于无法正常删除的帖子,需要手工连接数据库删除。假设有这样一个帖子:
http://host/forums/viewtopic.php?topic=1162&forum=1&0
可以这样:
$ mysql -uuser -ppasswd
mysql> use databasename;
mysql> select * from topics where topic_id = 1162; //得到post_id
mysql> delete from posts where post_id = 6280;
mysql> delete from posts_text where post_id = 6280;
mysql> delete from topics where topic_id = 1162;
关于我们:
WSS (Whitecell Security Systems),一个非营利性民间技术组织,致力于各种系统安
全技术的研究。坚持传统的hacker精神,追求技术的精纯。
WSS 主页:http://www.whitecell.org/
WSS 论坛:http://www.whitecell.org/forum/
补充:后来的测试发现相当多的BBS都有类似问题,包括基于php、cgi、asp的,希望大家自己对自己的论坛进行测试,如有问题,参考本文酌情解决。
[2]用IE远程创建Mysql数据库的简易程序
来源: 互联网 发布时间: 2013-11-30
小生近日来学习Mysql数据库,自己编写一个用IE远程创建Mysql数据库的简易程序,此程序适用与对Mysql数据库一无所知的人,可以轻松的创建Mysql数据库及数据库中的各种类型的表,而且完全是图形界面,你甚至可以一句sql语句都不知道,我编写的这个程序可能尚还十分简陋,在此我只想起一个抛砖引玉的作用,希望大家能不断完善此程序,做一个真正意义上的图形界面的Mysql管理器.
此程序共分两个文件:
mkdb.htm:搜集使用者信息,给下面的.php文件使用.
<HTML>
<HEAD>
<TITLE>MYSQL数据库创建单</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="/blog_article/MKDB.html">
<TABLE WIDTH=400 BORDER=1 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD ALIGN=CENTER COLSPAN=2>创建一个新的数据库</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入数据库名:</TD>
<TD WIDTH=250 ALIGN=CENTER>
<INPUT TYPE=TEST SIZE=30 VALUE=DATABASE NAME=DATABASENAME>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE=创建数据库 NAME=SWCODE>
</TD>
</TR>
</TABLE>
</FORM>
<FORM METHOD="POST" ACTION="/blog_article/MKDB.html">
<TABLE WIDTH=400 BORDER=1 cellspacing=0 cellpadding=0>
<TR>
<TD ALIGN=CENTER COLSPAN=2>删除一个已有的数据库</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入数据库名:</TD>
<TD WIDTH=250 ALIGN=CENTER>
<INPUT TYPE=TEST SIZE=30 VALUE=DATABASE NAME=DATABASENAME>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE=删除数据库 NAME=SWCODE>
</TD>
</TR>
</TABLE>
</FORM>
<FORM METHOD="POST" ACTION="/blog_article/MKDB.html">
<TABLE WIDTH=500 BORDER=1 cellspacing=0 cellpadding=0>
<TR>
<TD ALIGN=CENTER COLSPAN=2>在一个已有的数据库中创建表</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入数据库名:</TD>
<TD WIDTH=350>
<INPUT TYPE=TEST SIZE=30 VALUE=DATABASE NAME=DATABASENAME>
</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入表名:</TD>
<TD WIDTH=350>
<INPUT TYPE=TEST SIZE=30 VALUE=TESTABLE NAME=TABLENAME>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<TABLE WIDTH=500 BORDER=1 cellspacing=0 cellpadding=0>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 VALUE=IDX NAME=FIELDNAME[1]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[1] SIZE=1>
<OPTION VALUE=INTEGER(10) SELECTED>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[2]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[2] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[3]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[3] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[4]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[4] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[5]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[5] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[6]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[6] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[7]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[7] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[8]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[8] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[9]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[9] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[10]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[10] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE=创建表 NAME=SWCODE>
</TD>
</TR>
</TABLE>
</FORM>
<FORM METHOD="POST" ACTION="/blog_article/MKDB.html">
<TABLE WIDTH=400 BORDER=1 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD ALIGN=CENTER COLSPAN=2>删除一张已有的表</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入数据库名:</TD>
<TD WIDTH=250 ALIGN=CENTER>
<INPUT TYPE=TEST SIZE=30 VALUE=DATABASE NAME=DATABASENAME>
</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入表格名称:</TD>
<TD WIDTH=250 ALIGN=CENTER>
<INPUT TYPE=TEST SIZE=30 VALUE=TESTABLE NAME=TABLENAME>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE=删除表 NAME=SWCODE>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
mkdb.php:通过函数联系mysql.
<HTML>
<HEAD>
<TITLE>MYSQL数据库创建结果</TITLE>
<?php
function showdb($result)
{
echo "<CENTER><TABLE BORDER=1 WIDTH=350 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD WIDTH=100 ALIGN=CENTER>数据库序号</TD>
<TD WIDTH=250 ALIGN=CENTER>数据库名</TD>
</TR>";$i=0;
while($row=mysql_fetch_array($result))
{
$i=$i+1;
echo "<TR><TD WIDTH=100 ALIGN=CENTER>$i</TD>";
echo "<TD WIDTH=250 ALIGN=CENTER>";
echo $row["Database"];
echo "</TD></TR></CENTER>";
}
}
function showcol($result)
{
echo "<CENTER><TABLE BORDER=1 WIDTH=350 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD WIDTH=100 ALIGN=CENTER>字段名</TD>
<TD WIDTH=250 ALIGN=CENTER>字段类型</TD>
</TR>";$i=0;
while($row=mysql_fetch_array($result))
{
echo "<TR><TD WIDTH=100 ALIGN=CENTER>";
echo $row["Field"];
echo "</TD>";
echo "<TD WIDTH=250 ALIGN=CENTER>";
echo $row["Type"];
echo "</TD></TR></CENTER>";
}
}
function showtab($result,$DATABASENAME)
{
echo "<CENTER><TABLE BORDER=1 WIDTH=350 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD WIDTH=100 ALIGN=CENTER>表格序号</TD>
<TD WIDTH=250 ALIGN=CENTER>表格名称</TD>
</TR>";$i=0;
while($row=mysql_fetch_array($result))
{
$i=$i+1;
echo "<TR><TD WIDTH=100 ALIGN=CENTER>$i</TD>";
echo "<TD WIDTH=250 ALIGN=CENTER>";
echo $row["Tables_in_".$DATABASENAME];
echo "</TD></TR></CENTER>";
}
}
function creatdb($dbname)
{
$result=mysql_create_db($dbname);
if ($result){
echo "<CENTER><TABLE BORDER=0 WIDTH=350 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN=CENTER>";
echo "<H4>$dbname 创建成功!</H4>";
echo "</TD></TR></TABLE></CENTER>";}
else{
echo "<CENTER><TABLE BORDER=0 WIDTH=350 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN=CENTER>";
echo "<H4>创建失败!</H4>";
echo "</TD></TR></TABLE></CENTER>";}
}
function dropdb($dbname)
{
$result=mysql_drop_db($dbname);
if ($result){
echo "<CENTER><TABLE BORDER=0 WIDTH=350 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN=CENTER>";
echo "<H4>$dbname 成功删除!</H4>";
echo "</TD></TR></TABLE></CENTER>";}
else{
echo "<CENTER><TABLE BORDER=0 WIDTH=350 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN=CENTER>";
echo "<H4>删除失败!</H4>";
echo "</TD></TR></TABLE></CENTER>";}
}
?>
</HEAD>
<BODY>
<CENTER><H3>数据库创建结果如下:</H3></CENTER>
<?php
$result=mysql_connect();
switch($SWCODE){
case '创建数据库':
creatdb($DATABASENAME);
echo "<CENTER><H4>目前数据库列表如下:</H4></BR></CENTER>";
$result=mysql_list_dbs();
showdb($result);
break;
case '删除数据库':
dropdb($DATABASENAME);
echo "<CENTER><H4>目前数据库列表如下:</H4></BR></CENTER>";
$result=mysql_list_dbs();
showdb($result);
break;
case '创建表':
if (mysql_select_db($DATABASENAME))
{
if (mysql_db_query($DATABASENAME,"select * from $TABLENAME"))
echo "<H4><CENTER>在数据库: $DATABASENAME 中已存在 $TABLENAME 表。请检查表名称!</CENTER></H4>";
else
{
$string="CREATE TABLE ".$TABLENAME."(";
if ($TYPE[1]<>"NONE") $string=$string.$FIELDNAME[1]." ".$TYPE[1];
for($i=2;$i<=10;$i++)
{
if ($TYPE[$i]<>"NONE") $string=$string.",".$FIELDNAME[$i]." ".$TYPE[$i];
}
$string=$string.")";
$result=mysql_db_query($DATABASENAME,"$string");
if ($result)
{
echo "<H4><CENTER>成功的在数据库: $DATABASENAME 中创建 $TABLENAME 表!</CENTER></H4>";
$result=mysql_db_query($DATABASENAME,"SHOW COLUMNS FROM $TABLENAME");
showcol($result);
}
else
{
echo "<H4><CENTER>在数据库: $DATABASENAME 中创建 $TABLENAME 表的动作失败!请检查原因!</CENTER></H4>";
}
}
}
else
echo "<CENTER><H4>此数据库不存在!请检查数据库名。</H4></BR></CENTER>";
$result=mysql_db_query($DATABASENAME,"SHOW TABLES");
if ($result)
{
echo "<CENTER><H5>在".$DATABASENAME."中已存在的表格如下所示:</H5></CENTER>";
showtab($result,$DATABASENAME);
}
break;
case '删除表':
if (mysql_select_db($DATABASENAME))
{
$result=mysql_db_query($DATABASENAME,"DROP TABLE $TABLENAME");
if ($result)
{
echo "<CENTER><H3>已成功的在数据库".$DATABASENAME."中将表".$TABLENAME."删除</CENTER></H3>";
$result=mysql_db_query($DATABASENAME,"SHOW TABLES");
if ($result)
{
echo "<CENTER><H5>在".$DATABASENAME."中已存在的表格如下所示:</H5></CENTER>";
showtab($result,$DATABASENAME);
}
}
else
{
echo "<CENTER><H3>在数据库".$DATABASENAME."中未将表".$TABLENAME."删除!</CENTER></H3>";
$result=mysql_db_query($DATABASENAME,"SHOW TABLES");
if ($result)
{
echo "<CENTER><H5>在".$DATABASENAME."中已存在的表格如下所示:</H5></CENTER>";
showtab($result,$DATABASENAME);
}
}
}
else
echo "<CENTER><H3>数据库".$DATABASENAME."不存在!</H3></CENTER>";
break;
default:
echo "<center><h2>你什么事都没干!</h2></center>";
break;
}
?>
</BODY>
</HTML>
使用时,需将着两个文件分别放到Apache的访问目录下,并用IE访问mkdb.html便可.
此程序共分两个文件:
mkdb.htm:搜集使用者信息,给下面的.php文件使用.
<HTML>
<HEAD>
<TITLE>MYSQL数据库创建单</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="/blog_article/MKDB.html">
<TABLE WIDTH=400 BORDER=1 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD ALIGN=CENTER COLSPAN=2>创建一个新的数据库</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入数据库名:</TD>
<TD WIDTH=250 ALIGN=CENTER>
<INPUT TYPE=TEST SIZE=30 VALUE=DATABASE NAME=DATABASENAME>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE=创建数据库 NAME=SWCODE>
</TD>
</TR>
</TABLE>
</FORM>
<FORM METHOD="POST" ACTION="/blog_article/MKDB.html">
<TABLE WIDTH=400 BORDER=1 cellspacing=0 cellpadding=0>
<TR>
<TD ALIGN=CENTER COLSPAN=2>删除一个已有的数据库</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入数据库名:</TD>
<TD WIDTH=250 ALIGN=CENTER>
<INPUT TYPE=TEST SIZE=30 VALUE=DATABASE NAME=DATABASENAME>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE=删除数据库 NAME=SWCODE>
</TD>
</TR>
</TABLE>
</FORM>
<FORM METHOD="POST" ACTION="/blog_article/MKDB.html">
<TABLE WIDTH=500 BORDER=1 cellspacing=0 cellpadding=0>
<TR>
<TD ALIGN=CENTER COLSPAN=2>在一个已有的数据库中创建表</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入数据库名:</TD>
<TD WIDTH=350>
<INPUT TYPE=TEST SIZE=30 VALUE=DATABASE NAME=DATABASENAME>
</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入表名:</TD>
<TD WIDTH=350>
<INPUT TYPE=TEST SIZE=30 VALUE=TESTABLE NAME=TABLENAME>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<TABLE WIDTH=500 BORDER=1 cellspacing=0 cellpadding=0>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 VALUE=IDX NAME=FIELDNAME[1]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[1] SIZE=1>
<OPTION VALUE=INTEGER(10) SELECTED>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[2]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[2] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[3]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[3] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[4]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[4] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[5]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[5] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[6]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[6] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[7]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[7] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[8]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[8] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[9]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[9] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD WIDTH=75 ALIGN=CENTER>字段名</TD>
<TD WIDTH=175 ALIGN=CENTER><INPUT TYPE=TEST SIZE=20 NAME=FIELDNAME[10]></TD>
<TD WIDTH=75 ALIGN=CENTER>字段类型</TD>
<TD WIDTH=175 ALIGN=CENTER>
<SELECT NAME=TYPE[10] SIZE=1>
<OPTION VALUE=INTEGER(10)>普通整型</OPTION>
<OPTION VALUE=TINYINT(3)>短整型</OPTION>
<OPTION VALUE=FLOAT(10,4)>单精度浮点型</OPTION>
<OPTION VALUE=DOUBLE(10,4)>双精度浮点型</OPTION>
<OPTION VALUE=DATE>日期型</OPTION>
<OPTION VALUE=VARCHAR(255)>可变字符型</OPTION>
<OPTION VALUE=CHAR(20)>字符型(20个字符)</OPTION>
<OPTION VALUE=NONE SELECTED>空字段</OPTION>
</SELECT>
</TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE=创建表 NAME=SWCODE>
</TD>
</TR>
</TABLE>
</FORM>
<FORM METHOD="POST" ACTION="/blog_article/MKDB.html">
<TABLE WIDTH=400 BORDER=1 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD ALIGN=CENTER COLSPAN=2>删除一张已有的表</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入数据库名:</TD>
<TD WIDTH=250 ALIGN=CENTER>
<INPUT TYPE=TEST SIZE=30 VALUE=DATABASE NAME=DATABASENAME>
</TD>
</TR>
<TR>
<TD WIDTH=150 ALIGN=CENTER>请输入表格名称:</TD>
<TD WIDTH=250 ALIGN=CENTER>
<INPUT TYPE=TEST SIZE=30 VALUE=TESTABLE NAME=TABLENAME>
</TD>
</TR>
<TR>
<TD ALIGN=CENTER COLSPAN=2>
<INPUT TYPE=SUBMIT VALUE=删除表 NAME=SWCODE>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
mkdb.php:通过函数联系mysql.
<HTML>
<HEAD>
<TITLE>MYSQL数据库创建结果</TITLE>
<?php
function showdb($result)
{
echo "<CENTER><TABLE BORDER=1 WIDTH=350 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD WIDTH=100 ALIGN=CENTER>数据库序号</TD>
<TD WIDTH=250 ALIGN=CENTER>数据库名</TD>
</TR>";$i=0;
while($row=mysql_fetch_array($result))
{
$i=$i+1;
echo "<TR><TD WIDTH=100 ALIGN=CENTER>$i</TD>";
echo "<TD WIDTH=250 ALIGN=CENTER>";
echo $row["Database"];
echo "</TD></TR></CENTER>";
}
}
function showcol($result)
{
echo "<CENTER><TABLE BORDER=1 WIDTH=350 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD WIDTH=100 ALIGN=CENTER>字段名</TD>
<TD WIDTH=250 ALIGN=CENTER>字段类型</TD>
</TR>";$i=0;
while($row=mysql_fetch_array($result))
{
echo "<TR><TD WIDTH=100 ALIGN=CENTER>";
echo $row["Field"];
echo "</TD>";
echo "<TD WIDTH=250 ALIGN=CENTER>";
echo $row["Type"];
echo "</TD></TR></CENTER>";
}
}
function showtab($result,$DATABASENAME)
{
echo "<CENTER><TABLE BORDER=1 WIDTH=350 CELLSPACING=0 CELLPADDING=0>
<TR>
<TD WIDTH=100 ALIGN=CENTER>表格序号</TD>
<TD WIDTH=250 ALIGN=CENTER>表格名称</TD>
</TR>";$i=0;
while($row=mysql_fetch_array($result))
{
$i=$i+1;
echo "<TR><TD WIDTH=100 ALIGN=CENTER>$i</TD>";
echo "<TD WIDTH=250 ALIGN=CENTER>";
echo $row["Tables_in_".$DATABASENAME];
echo "</TD></TR></CENTER>";
}
}
function creatdb($dbname)
{
$result=mysql_create_db($dbname);
if ($result){
echo "<CENTER><TABLE BORDER=0 WIDTH=350 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN=CENTER>";
echo "<H4>$dbname 创建成功!</H4>";
echo "</TD></TR></TABLE></CENTER>";}
else{
echo "<CENTER><TABLE BORDER=0 WIDTH=350 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN=CENTER>";
echo "<H4>创建失败!</H4>";
echo "</TD></TR></TABLE></CENTER>";}
}
function dropdb($dbname)
{
$result=mysql_drop_db($dbname);
if ($result){
echo "<CENTER><TABLE BORDER=0 WIDTH=350 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN=CENTER>";
echo "<H4>$dbname 成功删除!</H4>";
echo "</TD></TR></TABLE></CENTER>";}
else{
echo "<CENTER><TABLE BORDER=0 WIDTH=350 CELLSPACING=0 CELLPADDING=0><TR><TD ALIGN=CENTER>";
echo "<H4>删除失败!</H4>";
echo "</TD></TR></TABLE></CENTER>";}
}
?>
</HEAD>
<BODY>
<CENTER><H3>数据库创建结果如下:</H3></CENTER>
<?php
$result=mysql_connect();
switch($SWCODE){
case '创建数据库':
creatdb($DATABASENAME);
echo "<CENTER><H4>目前数据库列表如下:</H4></BR></CENTER>";
$result=mysql_list_dbs();
showdb($result);
break;
case '删除数据库':
dropdb($DATABASENAME);
echo "<CENTER><H4>目前数据库列表如下:</H4></BR></CENTER>";
$result=mysql_list_dbs();
showdb($result);
break;
case '创建表':
if (mysql_select_db($DATABASENAME))
{
if (mysql_db_query($DATABASENAME,"select * from $TABLENAME"))
echo "<H4><CENTER>在数据库: $DATABASENAME 中已存在 $TABLENAME 表。请检查表名称!</CENTER></H4>";
else
{
$string="CREATE TABLE ".$TABLENAME."(";
if ($TYPE[1]<>"NONE") $string=$string.$FIELDNAME[1]." ".$TYPE[1];
for($i=2;$i<=10;$i++)
{
if ($TYPE[$i]<>"NONE") $string=$string.",".$FIELDNAME[$i]." ".$TYPE[$i];
}
$string=$string.")";
$result=mysql_db_query($DATABASENAME,"$string");
if ($result)
{
echo "<H4><CENTER>成功的在数据库: $DATABASENAME 中创建 $TABLENAME 表!</CENTER></H4>";
$result=mysql_db_query($DATABASENAME,"SHOW COLUMNS FROM $TABLENAME");
showcol($result);
}
else
{
echo "<H4><CENTER>在数据库: $DATABASENAME 中创建 $TABLENAME 表的动作失败!请检查原因!</CENTER></H4>";
}
}
}
else
echo "<CENTER><H4>此数据库不存在!请检查数据库名。</H4></BR></CENTER>";
$result=mysql_db_query($DATABASENAME,"SHOW TABLES");
if ($result)
{
echo "<CENTER><H5>在".$DATABASENAME."中已存在的表格如下所示:</H5></CENTER>";
showtab($result,$DATABASENAME);
}
break;
case '删除表':
if (mysql_select_db($DATABASENAME))
{
$result=mysql_db_query($DATABASENAME,"DROP TABLE $TABLENAME");
if ($result)
{
echo "<CENTER><H3>已成功的在数据库".$DATABASENAME."中将表".$TABLENAME."删除</CENTER></H3>";
$result=mysql_db_query($DATABASENAME,"SHOW TABLES");
if ($result)
{
echo "<CENTER><H5>在".$DATABASENAME."中已存在的表格如下所示:</H5></CENTER>";
showtab($result,$DATABASENAME);
}
}
else
{
echo "<CENTER><H3>在数据库".$DATABASENAME."中未将表".$TABLENAME."删除!</CENTER></H3>";
$result=mysql_db_query($DATABASENAME,"SHOW TABLES");
if ($result)
{
echo "<CENTER><H5>在".$DATABASENAME."中已存在的表格如下所示:</H5></CENTER>";
showtab($result,$DATABASENAME);
}
}
}
else
echo "<CENTER><H3>数据库".$DATABASENAME."不存在!</H3></CENTER>";
break;
default:
echo "<center><h2>你什么事都没干!</h2></center>";
break;
}
?>
</BODY>
</HTML>
使用时,需将着两个文件分别放到Apache的访问目录下,并用IE访问mkdb.html便可.
[3]PHP使用者状态管理功能的应用
来源: 互联网 发布时间: 2013-11-30
使用者状态管理(session support)是 PHP 4.0 一个让大家期待已久的新功能。在 PHP 3.0 的时代,程序设计员必须使用其它人写好的函式库来实作状态管理功能,或者就干脆放弃这项功能不用算了。而状态管理功能的缺乏事实上是 PHP 3.0 最让人感到失望的地方之一。不过现在状况已经得到改变,从 PHP 4.0 的早期测试版开始,使用者状态管理便已经成为 PHP 内建的功能之一了。
你可以使用状态管理功能来管理使用者从进入网站开始一直到离开网站为止这段期间内的所有相关变量(只要使用者没有离开网站,那么这些变量就都可以取用,不会因为使用者离开某个单一页面而造成资料消失),而不需要储存许多cookie 或者使用隐藏窗体字段,甚至将这些变量储存在数据库里面,造成数据库服务器的大量负荷。
一旦你在网站中的某一页激活状态管理,PHP 引擎便会开始纪录使用者状态(如果对这个使用者来说系统还没开始纪录该访问者的状态的话),或者继续纪录某个先前已经激活的使用者状态。要激活 PHP 的状态管理功能,你可以使用下面这个语法:
session_start();
一旦激活状态管理,PHP 会通过 cookie 传送一个独一无二的状态代码(这个代码看起来会像是:940f8b05a40d5119c030c9c7745aead9)给使用者,同时在服务器这端,PHP 引擎会自动产生一个档名与状态代码相对应的暂存文本文件(如:sess_940f8b05a40d5119c030c9c7745aead9),该档案会用来储存程序设计员在这个使用者状态纪录中所注册的所有变量。
谈到使用者状态管理,最常使用的例子便是一个页面存取计数器(access counter)了:现在我就开始教大家撰写 PHP 程序代码。
特别注意
在你尝试激活使用者状态纪录之前,千万不能够输出任何内容(不能有空格,TAB 甚至换行等等空格符,也不能有任何 HTML 卷标,任何内容都不行)给浏览器。这是因为状态管理相关函数会送出 HTTP 表头(header)信息给浏览器,如果在送出 HTTP 表头信息给浏览器之前已经有其它内容被输出的话,系统将会出现错误讯息。
如果该使用者的状态管理尚未被激活的话,下面这行程序便会激活该使用者的状态管理:
session_start();
接下来,注册一个名为count的变量:
session_register('count');
一旦你注册了一个变量,PHP 便会在从使用者进入网站一直到离开网站的整个浏览过程中自动替你维护这个变量的值,你可以随时取用这些注册过的变量。刚注册好的变量并没有指定任何值给它,不过一旦我们增加 count 变量的值,它的值便会是 1 了:
$count++;
把这些程序代码组合起来,我们的程序代码就会做下面这些事情了:激活使用者状态纪录功能(如果对该使用者而言尚未激活的话),指定一个独一无二的状态代码(session id)给该使用者,注册一个名为 count 的变量,并且在每次使用者浏览到该页面的时候,将变量 $count 的值加一,这个值就可以用来记录该使用者浏览过该页面的次数了。
如果要将使用者这次的浏览历程中观看了该页面多少次,我们只需要将变量$count 的值列印出来就行了:
echo "<P>您已经浏览这个页面$count 次了。</p>";
完整的页面浏览计数器程序代码看起来就像这样:
<?session_start();
session_register('count');
$count++;
echo "<P>您已经浏览这个页面 $count 次了。</p>";
?>
如果你不断重新加载这个页面,你会发现画面上显示的浏览次数会不断的增加。除了注册单纯的变量以外,我们也可以注册一个数组(array)到使用者状态纪录中。假设我们有下面这个名为 $faves 的数组:
$faves = array ('古典音乐','旅游','唱歌','Linux');
注册数组的做法和注册其它单纯变量是完全一样的:
session_register('faves');
注册完成数组以后,在往后的程序代码里面要参照到该数组的做法也没有任何不同,只要单纯地叫用 $faves 这个变量就行了。假设你的使用者在网站中某个页面窗体里头选择了一些他所喜欢的东西,而且你将这些项目通过 $faves 数组注册到该使用者的状态纪录里面,那么在网站中其它页面你可以很容易地把这些项目显示在画面上:
<?
session_start();
echo "我的访客喜欢的东西是:<ul>";
while (list($v) = each ($faves)) {
echo "<li>$v</li>"; }
echo "</ul>";
?>
就这么轻轻松松的,你就可以把访客喜欢的东西显示在网页上了。
使用者状态纪录所注册的变量是无法用查询字符串(query string)来盖过的,比方说,使用者无法直接在浏览器的地址列输入下面的 URL:
http:///www.yourdomain.com/yourscript.php?count=56 来企图盖过原本注册在使用者状态纪录中的 $count 变量的值。这是一个非常重要的安全观念:只有你自己能够在你的程序里面注册或者删除使用者状态纪录中的变量,其它使用者无法通过 URL 后面的查询字符串企图混淆这些变量的值。
要删除原本注册过的使用者状态变量,你可以使用下面的语法:
session_unregister('count');
要将整个使用者状态纪录变量全部删除并且停止纪录,请使用下面的语法:
session_destroy();
结语:
适当地善用使用者状态纪录功能的好处多多:它可以让我们不须将使用者状态资料储存在数据库中,减少数据库服务器的负荷。它也可以让我们不需要自己撰写长长的程序代码来通过 cookie 纪录这些使用者状态变量(而且,这样一来我们也不用在网站的隐私权声明里头花上很长的篇幅来解释为什么当使用者登入网站的时候,我们要储存五十个 cookie 到他们的硬盘里面去了)。这项功能让我们只需要一个 cookie 来储存一个变量(session id)就行了,其它所有的信息都通过一个精巧无比的机制来帮我们纪录,让我们的工作变得再简单不过了!
你可以使用状态管理功能来管理使用者从进入网站开始一直到离开网站为止这段期间内的所有相关变量(只要使用者没有离开网站,那么这些变量就都可以取用,不会因为使用者离开某个单一页面而造成资料消失),而不需要储存许多cookie 或者使用隐藏窗体字段,甚至将这些变量储存在数据库里面,造成数据库服务器的大量负荷。
一旦你在网站中的某一页激活状态管理,PHP 引擎便会开始纪录使用者状态(如果对这个使用者来说系统还没开始纪录该访问者的状态的话),或者继续纪录某个先前已经激活的使用者状态。要激活 PHP 的状态管理功能,你可以使用下面这个语法:
session_start();
一旦激活状态管理,PHP 会通过 cookie 传送一个独一无二的状态代码(这个代码看起来会像是:940f8b05a40d5119c030c9c7745aead9)给使用者,同时在服务器这端,PHP 引擎会自动产生一个档名与状态代码相对应的暂存文本文件(如:sess_940f8b05a40d5119c030c9c7745aead9),该档案会用来储存程序设计员在这个使用者状态纪录中所注册的所有变量。
谈到使用者状态管理,最常使用的例子便是一个页面存取计数器(access counter)了:现在我就开始教大家撰写 PHP 程序代码。
特别注意
在你尝试激活使用者状态纪录之前,千万不能够输出任何内容(不能有空格,TAB 甚至换行等等空格符,也不能有任何 HTML 卷标,任何内容都不行)给浏览器。这是因为状态管理相关函数会送出 HTTP 表头(header)信息给浏览器,如果在送出 HTTP 表头信息给浏览器之前已经有其它内容被输出的话,系统将会出现错误讯息。
如果该使用者的状态管理尚未被激活的话,下面这行程序便会激活该使用者的状态管理:
session_start();
接下来,注册一个名为count的变量:
session_register('count');
一旦你注册了一个变量,PHP 便会在从使用者进入网站一直到离开网站的整个浏览过程中自动替你维护这个变量的值,你可以随时取用这些注册过的变量。刚注册好的变量并没有指定任何值给它,不过一旦我们增加 count 变量的值,它的值便会是 1 了:
$count++;
把这些程序代码组合起来,我们的程序代码就会做下面这些事情了:激活使用者状态纪录功能(如果对该使用者而言尚未激活的话),指定一个独一无二的状态代码(session id)给该使用者,注册一个名为 count 的变量,并且在每次使用者浏览到该页面的时候,将变量 $count 的值加一,这个值就可以用来记录该使用者浏览过该页面的次数了。
如果要将使用者这次的浏览历程中观看了该页面多少次,我们只需要将变量$count 的值列印出来就行了:
echo "<P>您已经浏览这个页面$count 次了。</p>";
完整的页面浏览计数器程序代码看起来就像这样:
<?session_start();
session_register('count');
$count++;
echo "<P>您已经浏览这个页面 $count 次了。</p>";
?>
如果你不断重新加载这个页面,你会发现画面上显示的浏览次数会不断的增加。除了注册单纯的变量以外,我们也可以注册一个数组(array)到使用者状态纪录中。假设我们有下面这个名为 $faves 的数组:
$faves = array ('古典音乐','旅游','唱歌','Linux');
注册数组的做法和注册其它单纯变量是完全一样的:
session_register('faves');
注册完成数组以后,在往后的程序代码里面要参照到该数组的做法也没有任何不同,只要单纯地叫用 $faves 这个变量就行了。假设你的使用者在网站中某个页面窗体里头选择了一些他所喜欢的东西,而且你将这些项目通过 $faves 数组注册到该使用者的状态纪录里面,那么在网站中其它页面你可以很容易地把这些项目显示在画面上:
<?
session_start();
echo "我的访客喜欢的东西是:<ul>";
while (list($v) = each ($faves)) {
echo "<li>$v</li>"; }
echo "</ul>";
?>
就这么轻轻松松的,你就可以把访客喜欢的东西显示在网页上了。
使用者状态纪录所注册的变量是无法用查询字符串(query string)来盖过的,比方说,使用者无法直接在浏览器的地址列输入下面的 URL:
http:///www.yourdomain.com/yourscript.php?count=56 来企图盖过原本注册在使用者状态纪录中的 $count 变量的值。这是一个非常重要的安全观念:只有你自己能够在你的程序里面注册或者删除使用者状态纪录中的变量,其它使用者无法通过 URL 后面的查询字符串企图混淆这些变量的值。
要删除原本注册过的使用者状态变量,你可以使用下面的语法:
session_unregister('count');
要将整个使用者状态纪录变量全部删除并且停止纪录,请使用下面的语法:
session_destroy();
结语:
适当地善用使用者状态纪录功能的好处多多:它可以让我们不须将使用者状态资料储存在数据库中,减少数据库服务器的负荷。它也可以让我们不需要自己撰写长长的程序代码来通过 cookie 纪录这些使用者状态变量(而且,这样一来我们也不用在网站的隐私权声明里头花上很长的篇幅来解释为什么当使用者登入网站的时候,我们要储存五十个 cookie 到他们的硬盘里面去了)。这项功能让我们只需要一个 cookie 来储存一个变量(session id)就行了,其它所有的信息都通过一个精巧无比的机制来帮我们纪录,让我们的工作变得再简单不过了!
最新技术文章: