11.2 PHP中常用类
PHP采用面向对象的编程方式,不仅可以提高代码的重用率,而且可以为以后的维护工作带来很大的方便。本节将通过具体实例讲解PHP常用类的实现过程。
实例297

数据库连接类
实例说明
大多数的Web项目都离不开数据库,实现PHP与MySQL数据库的连接是整个项目开发过程中至关重要的一个环节,为了使连接数据库的操作具有可重用性,本实例将采用面向对象的方式实现PHP与MySQL数据库的连接。运行本实例,如果出现如图11.5所示的页面,说明数据库连接成功。
图11.5 数据库连接类
技术要点
本实例建立的数据库连接类代码如下:
<?php
class con
{
private $hostname;
private $username;
private $userpwd;
private $databasename;
public $conn;
public function __construct($x,$y,$m,$n)
{
$this->hostname=$x;
$this->username=$y;
$this->userpwd=$m;
$this->databasename=$n;
}
public function getcon()
{
$this->conn=mysql_connect($this->hostname,$this->username,$this->userpwd);
mysql_select_db($this->databasename,$this->conn);
}
}
?>
该实例定义了3个私有的成员变量$hostname、$username、$userpwd,分别用来存储MySQL数据库服务器地址、用户名及用户密码。定义一个公有的成员变量$conn,用于存储mysql_connect()函数返回的连接句柄。成员函数getcon()实现与数据库的连接及选择数据库服务器中某数据库。
实现过程
(1)建立conn.php文件,实现与MySQL数据库的连接,该文件的关键代码已经在技术要点中给出,这里不再赘述。
(2)对数据库连接类实例化。代码如下:
include("conn.php");
$conndb=new con("localhost","root","root","db_database11");
(3)显示所有注册用户信息。代码如下:
<?php
……
$conndb->getcon();
$sql=mysql_query("select * from tb_testconn",$conndb->conn);
$info=mysql_fetch_array($sql);
if($info==false)
{
echo "暂无注册用户信息!";
}
else
{
do
{
?>
<tr>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[name]?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[pwd]?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[regtime]?></div></td>
</tr>
<?php
}
while( $info=mysql_fetch_array($sql));
}
?>
在执行查询前必须调用类的成员函数getcon(),否则无法实现与数据库的连接及选择某数据库。
举一反三
根据本实例,读者可以:

编写用于连接SQL Server数据库的数据库连接类。

编写用于连接Access数据库的数据库连接类。
实例298

数据信息检索类
实例说明
在任何规模的项目中,数据信息检索所占的比重都是很大的,为了提高代码的重用率,可以利用面向对象的编程方式实现该模块。运行本实例,如图11.6所示,在图中文本框中输入要查询的学生成绩的学生学号,然后单击“查找”按钮,如果存在该学生的成绩信息则在该页面中显示,反之提示没有该学生的信息。
图11.6 数据信息检索类
技术要点
本实例的关键技术是如何对该类进行合理的规划,为了使该类具有较高的可移植性,在设计时将整个SQL语句作为参数传入类体。数据信息检索类代码如下:
class getinfo
{
private $sqlstr;
public function __construct($x)
{
$this->sqlstr=$x;
}
public function get()
{
include_once("conn.php");
$sqlclass=mysql_query($this->sqlstr,$conn);
$infoclass=mysql_fetch_array($sqlclass);
return $infoclass;
}
}
实现过程
(1)建立conn.php文件,实现与数据库的连接。代码如下:
<?php
$conn=mysql_connect("localhost","root","root");
mysql_select_db("db_database11",$conn);
?>
(2)对数据信息检索类进行实例化。代码如下:
$str="select * from tb_score where sno='".$sno."'";
$get=new getinfo($str);
$info=$get->get();
(3)如果存在该学生的信息则在页面中显示,反之提示没有该学生信息。代码如下:
<?php
……
if($info==false)
{
echo "<script>alert('没有查找到该学生信息!');history.back();</script>";
exit;
}
else
{
?>
…… //显示学生成绩
<?php
}
}
?>
举一反三
根据本实例,读者可以:

利用信息检索类实现商品信息的检索。

利用信息检索类实现注册用户信息的检索。
实例299

数据信息录入类
实例说明
随着PHP面向对象技术的日趋完善,在Web开发过程中,很多功能都可以通过面向对象的方式实现。本实例将采用面向对象的方式实现数据信息的录入。运行本实例,首先在如图11.7所示的页面中输入用户信息,单击“注册”按钮后,如果系统中已经存在该用户。则提示该用户已经存在,并要求重新选择用户昵称,反之该用户所有注册信息将被保存到数据库中。注册成功后,可以在如图11.8所示的页面查看已注册用户的信息。
图11.7 添加用户注册信息
图11.8 数据信息录入类
技术要点
本实例的关键技术是如何运用面向对象的方式实现数据信息的录入,数据信息录入类的代码如下:
class reg
{
private $classudernc;
private $classemail;
private $classsex;
private $classregtime;
public function __construct($x,$y,$m,$n)
{
$this->classudernc=$x;
$this->classemail=$y;
$this->classsex=$m;
$this->classregtime=$n;
}
public function savereg()
{
include_once("conn.php");
$sql=mysql_query("select * from tb_chat where usernc='".$this->classudernc."'",$conn);
$info=mysql_fetch_array($sql);
if($info==true)
{
echo "<script>alert('该昵称已经存在,请选择其他昵称!');history.back();</script>";
exit;
}
if(mysql_query("insert into tb_chat(usernc,email,regtime,sex) values ('$this->classudernc','$this-> classemail','$this-> classregtime','$this->classsex')",$conn))
{
echo "<script>alert('恭喜您,注册成功!');history.back();</script>";
}
}
}
在数据信息录入类reg中定义了4个私有的数据成员,用于存储用户的注册信息,构造函数__construct()实现类中数据成员的初始化。将用户注册信息保存到数据库是通过成员函数savereg()实现的,该成员函数首先判断用户输入的昵称是否已经存在,如果存在则提示用户重新选择昵称,反之则将用户注册的信息保存到数据库。
实现过程
(1)建立conn.php文件,用于实现与MySQL数据库的连接。该文件代码如下:
<?php
$conn=mysql_connect("localhost","root","root");
mysql_select_db("db_database11",$conn);
mysql_query("set names gb2312");
?>
上述代码中的mysql_query("set names gb2312")是将MySQL数据库的字符集改变成简体中文进行输出,如果不加该语句,代码可能导致一些版本的MySQL数据库的中文乱码。
(2)利用Dreamweaver等网页制作工具,制作用户注册页面及用户信息显示页面。
(3)建立saveuserinfo.php文件,实现用户注册信息的保存。该页面中的数据信息录入类在技术要点中已经做了介绍,这里不再赘述,但仅有类是不能够完成数据信息录入的,还应对类进行实例化。实现reg类的实例化代码如下:
$saveuserreg=new reg($usernc,$email,$sex,$regtime);
$saveuserreg->savereg();
举一反三
根据本实例,读者可以:

利用数据信息录入类,实现电子商务系统的添加商品信息模块。

利用数据信息录入类实现留言板中保存用户留言模块。
实例300

数据信息更改类
实例说明
在程序的后台管理页面中,经常需要对数据库中的信息进行修改,并且很多信息的管理都涉及该模块,如果每个管理项目都编写用于修改该项信息的代码,这会给开发人员带来很大的不便,并且整个程序的代码重用率也会降低,如果将整个系统的信息更改模块都用一个类来实现,这会使整个程序的开发效率有很大的提高。运行本实例,图11.9为已经录入员工的信息,图11.10为员工信息更改页面。
图11.9 查看员工信息
图11.10 数据信息更改类
技术要点
本实例的关键是通过面向对象的方式实现信息的更改,数据信息更改类代码如下:
class changeinfo
{
private $classname;
private $classage;
private $classaddress;
private $classbm;
private $classsno;
private $classtype;
private $classid;
public function __construct($x,$y,$z,$m,$n,$q,$f)
{
$this->classname=$x;
$this->classage=$y;
$this->classaddress=$z;
$this->classbm=$m;
$this->classsno=$n;
$this->classtype=$q;
$this->classid=$f;
}
public function change()
{
include_once("conn.php");
if(mysql_query("update tb_worker set name='".$this->classname."',age= '".$this->classage."', address= '".$this-> classaddress."', bm='".$this->classbm."',sno='".$this->classsno."',type='".$this->classtype."' where id='".$this->classid."'",$conn))
{
echo "<script>alert('员工信息修改成功!');history.back();</script>";
}
}
}
在该类中定义了7个数据成员,用于保存员工信息,构造函数__construct()实现数据成员的初始化,最后利用成员函数change()实现员工信息的更改。
实现过程
(1)建立conn.php文件,实现与MySQL数据库的连接。
(2)建立saveuser.php文件,实现员工信息的录入。该文件代码如下:
<?php
$name=$_POST[name];
$age=$_POST[age];
$address=$_POST[address];
$bm=$_POST[bm];
$sno=$_POST[sno];
$type=$_POST[type];
include_once("conn.php");
if(mysql_query("insert into tb_worker(name,age,address,bm,sno,type) values ('$name','$age','$address', '$bm','$sno','$type')",$conn))
{
echo "<script>alert('员工信息添加成功!');history.back()</script>";
}
else
{
echo "<script>alert('员工信息添加失败!');history.back()</script>";
}
?>
(3)建立changeuser.php文件,实现用户信息的更改,该文件的信息更改类已经在技术要点中给出。以下代码为该类实例化的过程:
$changeobj=new changeinfo($name,$age,$address,$bm,$sno,$type,$id);
$changeobj->change();
举一反三
根据本实例,读者可以:

利用数据信息更改类,实现论坛中用户注册信息的更改。

利用数据信息更改类,实现电子商务系统中商品信息的更改。
实例301

数据信息删除类
实例说明
无论是应用程序还是Web项目,删除操作在整个程序中占有较大比重,本实例将采用面向对象的方式实现后台数据库信息的删除,从而提高代码的重用率。运行本实例,如图11.11所示,该页面中列出了所有资产的详细信息,单击“删除”超级链接后,该资产所对应的信息将被删除。
图11.11 数据信息删除类
技术要点
本实例的关键技术是信息删除类的实现。具体代码如下:
class delzc
{
private $classid;
private $classtablename;
public function __construct($x,$y)
{
$this->classid=$x;
$this->classtablename=$y;
}
public function del()
{
include_once("conn.php");
if(mysql_query("delete from tb_zc where id='".$this->classid."'",$conn))
{
echo "<script>window.location.href='index.php';</script>";
}
else
{
echo "<script>alert('资产信息删除失败!');history.back();</script>";
}
}
}
在该类中定义了两个成员变量$classid和$classtablename,用于保存资产的id和资产信息所存储的表名,并利用构造函数__construct()对定义的数据成员初始化,最后定义成员函数del(),实现资产信息的删除。
实现过程
(1)建立conn.php文件,实现与MySQL数据库的连接。
(2)建立index.php文件,用于显示所有资产的信息。index.php的关键代码如下:
<?php
……
include_once("conn.php");
$sql=mysql_query("select * from tb_zc order by addtime desc",$conn);
$info=mysql_fetch_array($sql);
if($info==false)
{
echo "暂无资产信息!";
}
else
{
do
{
?>
<tr>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[name];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[bm];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[price];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[addtime];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><a href="delete.php?id=<?php echo $info[id];?>" class="a1">删除</a></div></td>
</tr>
<?php
}
while($info=mysql_fetch_array($sql));
}
?>
(3)建立delete.php文件,实现资产信息的删除,该文件中用于删除资产信息的delzc类已经在技术要点中给出。同时该文件也实现了delzc类的实例化。
$delobj=new delzc($id,$tablename);
$delobj->del();
举一反三
根据本实例,读者可以:

利用面向对象的方式实现博客中注册用户的删除。

利用面向对象的方式实现论坛中用户发表帖子的删除。
实例302

计数器类
实例说明
在商业网站中,为了能够准确地统计网站被访问的次数,经常需要在网站中增加计数器的模块,为了防止用户通过刷新来增加计数值,通常可以用session或cookie来加以限制。运行本实例,如图11.12所示,每当用户访问该页时,计数器的值就会加1。
图11.12 计数器类
技术要点
为了提高代码的重用率,可以通过面向对象的方式实现计数器,这也是本实例的关键技术之所在。本例中实现计数器类的代码如下:
session_start();
class counter
{
private $filename;
public function __construct($x)
{
$this->filename=$x;
}
public function getcoun()
{
$countfile=$this->filename;
$fp=fopen($countfile,"r");
$num=fgets($fp,10);
if($_SESSION["count_id"]=="")
{
$num+=1;
$_SESSION["count_id"]="count_id";
}
$imagenum=intval($num);
for($i=0;$i<8-strlen($imagenum);$i++)
{
echo "<img src=images/count/0.gif>";
}
for($i=0;$i<strlen($imagenum);$i++)
{
echo "<img src=images/count/".substr($imagenum,$i,1).".gif>";
}
$fp1=fopen($countfile,"w");
fputs($fp1,$num);
}
}
由于该计数器的计数值保存在文本文件中,所以定义一个数据成员$filename,用于指定该文本文件的名称,并通过构造函数__construct()为其赋值,成员函数getcoun()的作用是实现计数器的计数。
实现过程
(1)定义类中的数据成员$filename,用于指定存储计数值的文本文件的路径及文件名。
(2)定义构造函数__construct(),用于实现数据成员的初始化。代码如下:
public function __construct($x)
{
$this->filename=$x;
}
(3)定义类的成员函数getcoun(),实现计数器的计数值加1,该部分代码已经在技术要点中给出,这里不再赘述。
(4)实现计数器类的实例化并输出当前的计数值。代码如下:
$coun=new counter("./count.txt");
echo "您是明日科技第";
$coun->getcoun();
echo "位访客!";
举一反三
根据本实例,读者可以:

将计数器类应用到论坛中,实现论坛访问量的统计。

将计数器类应用到电子商务网站中,用于实现商品销售统计。
实例303

翻页类
实例说明
为了在有限的空间内尽可能多的显示信息,可以采用翻页的方式。PHP中实现翻页有多种方式,本实例将利用翻页类来实现货物信息的翻页显示。运行本实例,如图11.13所示,通过单击图中的页码链接,即可实现商品信息的翻页显示。
图11.13 商品信息的翻页显示
技术要点
本实例的关键技术是如何利用面向对象的方式实现货物信息的分页显示。首先应该明确向类中传入参数的个数及意义,在实现本实例时,向该类中传入的两个参数分别为每页中最多显示的货物信息的记录数和当前的页码,并利用类的构造函数对这两个参数进行初始化。代码如下:
public function __construct($x,$y)
{
$this->pagesize=$x;
$this->page=$y;
}
定义类的成员函数roll(),实现货物信息的分页显示。代码如下:
<?php
class rollpage
{
public $pagesize;
public $page;
public $pagecount;
public function __construct($x,$y)
{ $this->pagesize=$x;
$this->page=$y;
}
$this->pagesizepublic
function roll()
{
include_once("conn.php");
$sql=mysql_query("select count(*) as total from tb_goods",$conn);
$info=mysql_fetch_array($sql);
$total=$info[total];
if($total==0)
{
echo "<tr>";
echo "<td height="20" colspan="3" bgcolor="#FFFFFF"><div align="center">对不起,暂无进货信息!</div></td>";
echo "</tr>";
}
else
{
if(empty($this->page)==true || is_numeric($this->page)==false)
{
$this->page=1;
}
else
{
$this->page=intval($this->page);
}
if($total<$this->pagesize)
{
$this->pagecount=1;
}
else
{
if($total%$this->pagesize==0)
{
$this->pagecount=intval($total/$this->pagesize);
}
else
{
$this->pagecount=intval($total/$this->pagesize)+1;
}
}
$sql=mysql_query("select * from tb_goods order by addtime desc limit ".($this->page-1)*$this->pagesize.", $this-> pagesize",$conn);
while($info=mysql_fetch_array($sql))
{
?>
<tr>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[name];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[addtime];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo $info[shuliang];?></div></td>
<td height="25" bgcolor="#FFFFFF"><div align="center"><?php echo number_format($info[price],2);?>元</div></td>
</tr>
<?php
}
}
}
}
……
?>
实现过程
(1)建立数据库连接文件conn.php,实现与MySQL数据库的连接。
(2)定义翻页类rollpage,该类的关键代码已经在技术要点中给出,这里不再赘述。
(3)对翻页类进行实例化。代码如下:
$rpobj =new rollpage(4,$_GET[page]);
$rpobj->roll();
(4)通过单击页码,实现页面之间的切换。代码如下:
<?php
if($rpobj->page>=2)
{
?>
<a href="index.php?page=1" title="首页" class="a1"><font face="webdings"> 9 </font></a>
<a href="index.php?page=<?php echo $rpobj->page-1;?>" title="前一页" class="a1"><font face="webdings"> 7 </font></a>
<?php
}
if($rpobj->pagecount<=4)
{
for($i=1;$i<=$rpobj->pagecount;$i++)
{
?>
<a href="index.php?page=<?php echo $i;?>" class="a1"><?php echo $i;?></a>
<?php
}
}
else
{
for($i=1;$i<=4;$i++)
{
?>
<a href="index.php?page=<?php echo $i;?>" class="a1"><?php echo $i;?></a>
<?php
}
?>
<a href="index.php?page=<?php
if($rpobj->pagecount>=$rpobj->page+1)
echo $rpobj->page+1;
else
echo 1;
?>" title="后一页" class="a1"><font face="webdings"> 8 </font></a>
<a href="index.php?page=<?php echo $this->pagecount;?>" title="尾页" class="a1"><font face="webdings"> : </font></a>
<?php
}
?>
举一反三
根据本实例,读者可以:

将翻页类应用到论坛中,实现回帖的分页显示。

利用分页类实现学生信息的分页显示。
实例304

购物车类
实例说明
随着网络的发展,网上购物已经逐步走进人们的生活,例如,当当网、第二书店等都是网民们熟悉的电子商务类网站。运营一个电子商务类网站的关键之一是购物系统拥有一个较安全稳定的购物车模块。本实例将采用面向对象的方式实现购物车类。
运行本实例,分别如图11.14和图11.15所示。用户首先可以在图11.15所示的商品列表中选择自己要购买的商品,并放入购物车中。当用户选购完商品后,可以在图11.14所示的购物车中更改购买商品的数量、移去指定的商品以及清空购物车等操作。
图11.14 购物车
图11.15 商品列表
技术要点
实现本实例的关键是如何将对购物车的操作通过面向对象的方式实现,在本实例中对购物车的操作主要有将商品添加到购物车、更改购物车中商品的数量、清空购物车以及在购物车中移去指定的商品。在实现购物车时,可以将上述各个功能定义为购物车类的方法。
(1)定义类的addcar()方法,实现将商品添加到购物车。
public function addcar($x){
$id=$x;
$arraygwc=explode("@",$_SESSION["prolist"]);
for($i=0;$i<count($arraygwc);$i++)
{
if($arraygwc[$i]==$id)
{
echo "<script>alert('该商品已经在购物车中!');history.back();</script>";
exit;
}
}
$_SESSION["prolist"].="$id@";
$_SESSION["num"].="1@";
echo "<script>window.location.href='index.php';</script>";
}
将该方法权限定义为public的原因是类的对象可以直接对其进行调用。实现将商品添加到购物车的原理是:首先将存放商品id的字符串$_SESSION["prolist"]用字符“@”进行分割,并利用函数explode()将分割的商品id存放到数组$arraygwc中,然后通过for循环语句遍历该数组中的所有元素,如果存在与传入的id相同的值,则系统将提示该商品已经存在,否则将该商品的id连接到$_SESSION["prolist"]之后,并用字符“@”进行分割。
(2)定义公共方法changenum(),实现商品数量的更改。
public function changenum(){
$arrayid=explode("@",$_SESSION["prolist"]);
$arraynum=explode("@",$_SESSION["num"]);
while(list($name,$value)=each($_POST))
{
if(!is_numeric($value)||$value=="")
{
echo "<script>alert('请输入正确的商品数量!');history.back();</script>";
exit;
}
for($i=0;$i<count($arrayid);$i++)
{
if($arrayid[$i]==$name)
{
$arraynum[$i]=$value;
}
}
}
$_SESSION["num"]=implode("@",$arraynum);
echo "<script>window.location.href='index.php';</script>";
}
利用该方法实现商品数量的更改的原理是:首先利用函数explode()将存放商品id和数量的字符串保存到数组$arrayid和$arraynum中,然后提取出要更改的商品数量的元素,并更改成指定的值,最后利用函数implode()将数组重新合并成字符串,并再次保存到$_SESSION["num"]中。
(3)定义方法setnull(),实现清空购物车。
public function setnull(){
$_SESSION["prolist"]="";
$_SESSION["num"]="";
echo "<script>window.location.href='index.php';</script>";
}
利用该方法清空购物车的原理是:将存储商品id和商品数量的session变量都赋予空字符串。
(4)定义方法removeitem(),用来从购物车中移去指定的商品。
public function removeitem($x){
$arrayid=explode("@",$_SESSION["prolist"]);
$arraynum=explode("@",$_SESSION["num"]);
for($i=0;$i<count($arrayid);$i++)
{
if($arrayid[$i]==$x)
{
unset($arrayid[$i]);
unset($arraynum[$i]);
}
}
$_SESSION["prolist"]=implode("@",$arrayid);
$_SESSION["num"]=implode("@",$arraynum);
echo "<script>window.location.href='index.php';</script>";
}
利用该方法移去指定商品的原理是:首先利用函数explode()将商品id和商品数量保存到两个数组中,并通过for循环语句遍历存放id的数组的所有元素,如果发现与传入的id值相同的元素,则利用unset()函数将该id和该id对应的数量删除,最后将这两个数组重新合并。
实现过程
(1)建立数据库连接文件conn.php,实现与MySQL数据库的连接。
(2)当用户登录该系统时,为该用户分配两个session变量,分别用于保存商品的id和数量。代码如下:
<?php
session_start();
if(!isset($_SESSION["prolist"]))
{
session_register("prolist");
$_SESSION["prolist"]="";
}
if(!isset($_SESSION["num"]))
{
session_register("num");
$_SESSION["num"]="";
}
?>
(3)通过for循环语句显示购物车中的商品信息。代码如下:
<?php
$arrayid=explode("@",$_SESSION["prolist"]);
$arraynum=explode("@",$_SESSION["num"]);
$s=0;
for($i=0;$i<count($arrayid);$i++)
{
include_once("conn.php");
if($arrayid[$i]!="")
{
$sql1=mysql_query("select * from tb_car where id='".$arrayid[$i]."'");
$info1=mysql_fetch_array($sql1);
?>
<tr>
<td height="20" bgcolor="#FFFFFF"><div align="center"><?php echo $info1[name];?></div></td>
<td height="20" bgcolor="#FFFFFF"><div align="center"><input type="text" name="<?php echo $info1[id];?>" size= "10" class="inputcss" value="<?php echo $arraynum[$i];?>"></div></td>
<td height="20" bgcolor="#FFFFFF"><div align="center"><?php echo $info1[price];?>元</div></td>
<td height="20" bgcolor="#FFFFFF"><div align="center"><?php echo $info1[price] *$arraynum[$i]; $s+=$info1 [price]*$arraynum[$i];?>元</div></td>
<td height="20" bgcolor="#FFFFFF"><div align="center"><a href="removeitem.php?id=<?php echo $arrayid[$i];?> " class="a1">删除</a></div></td>
</tr>
<?php
}
}
?>
(4)建立购物车类实现对购物车的操作,该部分的关键代码已经在技术要点中给出,这里不再赘述。
(5)对购物车类进行实例化,详细代码请参见本书附带光盘。