看了标题你也许要说,留言本,很基本的东东啊!谁不会啊,还要用Smarty,这不找累吗?别急,我要表达的是一种编程的思想和结构,而不是证明我做的东西多有意义,通过它相信对初学者学习Smarty和ajax有些启发。原本用ajax做的,可惜始终调试不成功,只好用手写JS来弄了,不过不要紧,还是有一定价值的。站点结构大家下了源代码自己看,代码不长,应该不会看烦^_^,听我慢慢道来。
现在都PHP5了OO(面向对象)很流行了都,这里也不错过,首先来看下我们用OO来实现数据库操作和连接:
[php]
<?php
/**************************
页面:dbclass.php
作者:辉老大
功能:定义数据库操作类
**************************/
<?php
/**************************
页面:dbclass.php
作者:辉老大
功能:定义数据库操作类
**************************/
class db{
//创建构造函数,作用:数据库连接并选择相应数据库
public function __construct(){
require('config.inc.php');
mysql_connect($dbhost,$dbuser,$dbpassword) or die("error!");
mysql_query("SET NAMES 'GBK'");
mysql_select_db($dbname);
}
//执行SQL语句函数
public function query($sql){
return mysql_query($sql);
}
//取得结果集数组函数
public function loop_query($result){
return mysql_fetch_array($result);
}
//创建析构函数,作用:关闭数据库连接
public function __destruct(){
return mysql_close();
}
}
?>
这个类有什么特点呢?首先介绍下__construct()是构造函数,啥是构造函数?通俗点讲就是类被实例化后就自动执行的函数,__destruct()是啥?是析构函数,它的作用就是在没有任何方法指向这个对象时,便自动销毁对象,里面一般包含一些收尾的操作,比如关闭文件,关闭数据库连接之类的方法,看到这你是不是明白一些了?没错!在类实例化的时候自动执行带有数据库连接方法的构造函数,在实例销毁的时候执行关闭数据库连接的析构函数,对于一些基本数据操作我们只要new一个$db对象,然后$db->query()...是不是很方便,当然,这只是一个简单的例子,你还可以继续扩展。来看看 config.inc.php里面是什么:
很容易对不对,感兴趣就接着看吧^_^,来看下模板文件:
<?php
/*************************
页面:config.inc.php
作者:辉老大
功能:数据库参数变量设定
$dbhost:主机名
$dbuser:连接帐户
$dbpassword:连接密码
$dbname:数据库名
*************************/
$dbhost = "localhost";
$dbuser = "root";
$dbpassword = "7529639";
$dbname = "testdb";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title><{$title}></title>
<style type="text/css">
<!--
.username {
height: 20px;
width: 250px;
}
.comment {
height: 100px;
width: 660px;
}
body,td,tr {
font-size: 9pt;
}
-->
</style>
<script language="javascript" src="/blog_article/inc/ajax.js"></script>
</head>
<body>
<div align="right" id="check"></div>
<div id="result"><{*这里显示留言内容*}>
<{section name=loop loop=$bookinfo}><{*循环显示留言*}>
用户名:<{$bookinfo[loop].username}> 内容:<{$bookinfo[loop].comment}><p>
<{/section}>
</div>
<form method="post" name="book" id="book">
<table width="760" border="1" cellpadding="0" cellspacing="0">
<tr>
<td width="80" height="30" align="center">用户名:</td>
<td height="30"> <input name="username" type="text" id="username"></td>
</tr>
<tr>
<td width="80" height="120" align="center">留言内容:</td>
<td height="120"> <textarea name="comment" id="comment"></textarea></td>
</tr>
</table>
<input type="button" name="button" value="发布" onClick="send('result');">
</form>
</body>
</html>
模板中的内容在<{}>中的一会会被PHP替换掉,这就实现了美工和程序员的分工,不错吧有关Smarty的内容还请参考手册,这里就不便多说。来看下页面是怎么输出模板的吧:
<?php
/*****************************************
Title :Smarty结合Ajax留言板实例
Author:leehui1983(辉老大)
Page Name:index.php
Finish Date :2006-12-17
*****************************************/
require('./libs/Smarty.class.php');//包含smarty类库
require('./inc/dbclass.php');//包含数据库操作类
$db = new db();//生成数据库操作实例
$smarty = new Smarty();//实例化smarty对象
$smarty->template_dir = "./templates";//设置模板目录
$smarty->compile_dir = "./templates_c"; //设置编译目录
$smarty->caching = false; //设置缓存方式
/*****************************************************
左右边界符,默认为{},但实际应用当中容易与JavaScript
相冲突,所以建议设成<{}>或其它。
*****************************************************/
$smarty->left_delimiter = "<{";
$smarty->right_delimiter = "}>";
$smarty->assign('title','smarty结合ajax制作简单留言板');//替换模板内容
//设置初始页面由Smarty显示的留言内容
$rt=$db->query("select * from bookinfo order by id desc");
while($rs=$db->loop_query($rt)){
$array[]=array("username"=>$rs['username'],"comment"=>$rs['comment']);
}
$smarty->assign("bookinfo",$array);
unset ($array);//销毁数组变量
$smarty->display("index.tpl");//编译并显示位于./templates下的index.tpl模板
?>
页面实例的注释还是比较多的,大家参考下Smarty手册这个是So easy的!!呵呵~~~~
接下来到了介绍ajax的时候,这里我们用一个基本的开发框架来实现,关于ajax的知识建议大家看看网上非常流行的电子教程ajax开发简略
var http_request=false;
function send_request(url){//初始化,指定处理函数,发送请求的函数
http_request=false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest){//Mozilla浏览器
http_request=new XMLHttpRequest();
if(http_request.overrideMimeType){//设置MIME类别
http_request.overrideMimeType("text/xml");
}
}
else if(window.ActiveXObject){//IE浏览器
try{
http_request=new ActiveXObject("Msxml2.XMLHttp");
}catch(e){
try{
http_request=new ActiveXobject("Microsoft.XMLHttp");
}catch(e){}
}
}
if(!http_request){//异常,创建对象实例失败
window.alert("创建XMLHttp对象失败!");
return false;
}
http_request.onreadystatechange=processrequest;
//确定发送请求方式,URL,及是否同步执行下段代码
http_request.open("GET",url,true);
http_request.send(null);
}
//处理返回信息的函数
function processrequest(){
if(http_request.readyState==4){//判断对象状态
if(http_request.status==200){//信息已成功返回,开始处理信息
document.getElementById(reobj).innerHTML=http_request.responseText;
}
else{//页面不正常
alert("您所请求的页面不正常!");
}
}
}
function send(obj){
var f=document.book;
var username=f.username.value;
var comment=f.comment.value;
if(username==""||comment==""){
document.getElementById(obj).innerHTML="<font color=red>请填写完整!</font>";
return false;
}
else{
send_request('checkbookinfo.php?username='+username+'&comment='+comment);
reobj=obj;
}
}
这样我们点“发布”按钮,数据就会交由服务器异步处理,通过JS来组织异步更新,在发过留言后你马上就能看见你的留言而不是传统的等待页面跳转,那么数据传到哪里处理呢?看这里:
<?php
/*****************************************
Title :Smarty结合Ajax留言板实例
Author:leehui1983(辉老大)
Page Name:checkbookinfo.php
Finish Date :2006-12-17
*****************************************/
header("Content-type: text/html;charset=GBK");//输出编码,避免中文乱码
include('./inc/dbclass.php');//包含数据库操作类
$db=new db();//生成数据库操作实例
$sql="insert into bookinfo values(0,'".$comment."','".$username."')";
$db->query($sql);
$querysql="select * from bookinfo order by id desc";
$result=$db->query($querysql);
while($rows=$db->loop_query($result)){//打印留言列表,用于实时更新
//$arr.="用户名:{$rows['username']} 内容:{$rows['comment']}<p>";
echo '用户名:'.$rows['username'].' 内容:'.$rows['comment'].'<p>';
}
//echo $arr;
?>
嗯,先插入数据,在将更新后的数据通过JS组织显示,AJAX看来真的不错哦!大体就介绍完了,不知道大家想过没有,加个 iframe可以改成什么?对!无刷新聊天室,发挥你的能力,实现一个看看。这个例子用到了OO,AJAX,SMARTY,东西还是蛮多滴,希望大家喜欢,我已经决定将此文向PHP杂志投稿,大家若是转载,还希望注明版权,谢谢!最后来个效果图~~~~
function send_request(url){//初始化,指定处理函数,发送请求的函数
http_request=false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest){//Mozilla浏览器
http_request=new XMLHttpRequest();
if(http_request.overrideMimeType){//设置MIME类别
http_request.overrideMimeType("text/xml");
}
}
else if(window.ActiveXObject){//IE浏览器
try{
http_request=new ActiveXObject("Msxml2.XMLHttp");
}catch(e){
try{
http_request=new ActiveXobject("Microsoft.XMLHttp");
}catch(e){}
}
}
if(!http_request){//异常,创建对象实例失败
window.alert("创建XMLHttp对象失败!");
return false;
}
http_request.onreadystatechange=processrequest;
//确定发送请求方式,URL,及是否同步执行下段代码
http_request.open("GET",url,true);
http_request.send(null);
}
//处理返回信息的函数
function processrequest(){
if(http_request.readyState==4){//判断对象状态
if(http_request.status==200){//信息已成功返回,开始处理信息
document.getElementById(reobj).innerHTML=http_request.responseText;
}
else{//页面不正常
alert("您所请求的页面不正常!");
}
}
}
function dopage(obj,url){
document.getElementById(obj).innerHTML="正在读取数据...";
send_request(url);
reobj=obj;
}
内容我放在一个div中显示,当翻页动作产生时,利用AJAX更新DIV达到翻页效果这是内容显示页面代码:
header("Content-type: text/html;charset=GBK");//输出编码,避免中文乱码
?>
<html>
<head>
<title>ajax分页演示</title>
<script language="javascript" src="/blog_article/ajaxpg.js"></script>
</head>
<body>
<div id="result">
<?php
$page=isset($_GET['page'])?intval($_GET['page']):1; //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
$num=10; //每页显示10条数据
$db=mysql_connect("localhost","root","7529639"); //创建数据库连接
mysql_select_db("cr_download"); //选择要操作的数据库
/*
首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
总数据库除以每页显示的条数,有余进一。
也就是说10/3=3.3333=4 有余数就要进一。
*/
$result=mysql_query("select * from cr_userinfo");
$total=mysql_num_rows($result); //查询所有的数据
$url='test.php';//获取本页URL
//页码计算
$pagenum=ceil($total/$num); //获得总页数,也是最后一页
$page=min($pagenum,$page);//获得首页
$prepg=$page-1;//上一页
$nextpg=($page==$pagenum ? 0 : $page+1);//下一页
$offset=($page-1)*$num; //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。
//开始分页导航条代码:
$pagenav="显示第 <B>".($total?($offset+1):0)."</B>-<B>".min($offset+10,$total)."</B> 条记录,共 $total 条记录 ";
//如果只有一页则跳出函数:
if($pagenum<=1) return false;
$pagenav.=" <a href=/blog_article/dopage/index.html('result','$url?page=1');>首页</a> ";
if($prepg) $pagenav.=" <a href=/blog_article/dopage/index.html('result','$url?page=$prepg');>前页</a> "; else $pagenav.=" 前页 ";
if($nextpg) $pagenav.=" <a href=/blog_article/dopage/index.html('result','$url?page=$nextpg');>后页</a> "; else $pagenav.=" 后页 ";
$pagenav.=" <a href=/blog_article/dopage/index.html('result','$url?page=$pagenum');>尾页</a> ";
$pagenav.="</select> 页,共 $pagenum 页";
//假如传入的页数参数大于总页数,则显示错误信息
If($page>$pagenum){
Echo "Error : Can Not Found The page ".$page;
Exit;
}
$info=mysql_query("select * from cr_userinfo limit $offset,$num"); //获取相应页数所需要显示的数据
While($it=mysql_fetch_array($info)){
Echo $it['username'];
echo "<br>";
} //显示数据
echo"<br>";
echo $pagenav;//输出分页导航
?>
</div>
</body>
</html>
header("Content-type: text/html;charset=GBK");//输出编码,避免中文乱码
$page=isset($_GET['page'])?intval($_GET['page']):1; //这句就是获取page=18中的page的值,假如不存在page,那么页数就是1。
$num=10; //每页显示10条数据
$db=mysql_connect("localhost","root","7529639"); //创建数据库连接
mysql_select_db("cr_download"); //选择要操作的数据库
/*
首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
总数据库除以每页显示的条数,有余进一。
也就是说10/3=3.3333=4 有余数就要进一。
*/
$result=mysql_query("select * from cr_userinfo");
$total=mysql_num_rows($result); //查询所有的数据
$url='test.php';//获取本页URL
//页码计算
$pagenum=ceil($total/$num); //获得总页数,也是最后一页
$page=min($pagenum,$page);//获得首页
$prepg=$page-1;//上一页
$nextpg=($page==$pagenum ? 0 : $page+1);//下一页
$offset=($page-1)*$num; //获取limit的第一个参数的值,假如第一页则为(1-1)*10=0,第二页为(2-1)*10=10。
//开始分页导航条代码:
$pagenav="显示第 <B>".($total?($offset+1):0)."</B>-<B>".min($offset+10,$total)."</B> 条记录,共 $total 条记录 ";
//如果只有一页则跳出函数:
if($pagenum<=1) return false;
$pagenav.=" <a href=/blog_article/dopage/index.html('result','$url?page=1');>首页</a> ";
if($prepg) $pagenav.=" <a href=/blog_article/dopage/index.html('result','$url?page=$prepg');>前页</a> "; else $pagenav.=" 前页 ";
if($nextpg) $pagenav.=" <a href=/blog_article/dopage/index.html('result','$url?page=$nextpg');>后页</a> "; else $pagenav.=" 后页 ";
$pagenav.=" <a href=/blog_article/dopage/index.html('result','$url?page=$pagenum');>尾页</a> ";
$pagenav.="</select> 页,共 $pagenum 页";
//假如传入的页数参数大于总页数,则显示错误信息
If($page>$pagenum){
Echo "Error : Can Not Found The page ".$page;
Exit;
}
$info=mysql_query("select * from cr_userinfo limit $offset,$num"); //获取相应页数所需要显示的数据
While($it=mysql_fetch_array($info)){
Echo $it['username'];
echo "<br>";
} //显示数据
echo"<br>";
echo $pagenav;//输出分页导航
?>
经过最近一段时间狂热的PHP编程,对WINDOWS平台下PHP的配置可算是深有感触,一开始我用的是一键安装的傻瓜包,但是考虑傻瓜包的安装版本已经落后,在真正手动配置PHP环境时遇到许多问题,在查阅了许多资料和尝试后,终于配置成功。现在,我将我的配置经验和大家分享一下,相信可以解决大家配置PHP环境的迷惑。
首先说一下我用的软件版本。
PHP 5.1.6
APACHE 2.0.59(注意:APACHE 2.2.X版本以上必须安装插件才支持PHP 5)
MYSQL 5.0.24a
好了,现在开始安装,我先装的php5,直接解压文件到C:\php(安装到哪里并不会有影响,凭个人喜号,本文中的所有路径都以我的安装路径,请大家在自己的机器上安装的时候注意修改为自己的路径),接着安装APACHE,我直接把它装到C盘根目录下,在安装过程中,会出现3个文本框,上面两个输入你的本机IP,最下面的输入你的EMAIL,好的。安装完毕。现在编辑..\Apache Group\Apache2\conf\下的httpd.conf文件。用记事本打开该文件,在最后添上这两行代码:
LoadModule php5_module "C:/php/php5apache2.dll"
AddType application/x-httpd-php .php
我在C:\目录下建立了一个www的目录用于存放我的站点文件,在httpd.conf里找到这样一句话:DocumentRoot "C:/Apache2/htdocs"改成了DocumentRoot "C:/www"。这样,就将主目录设置成了C:\www。如果你不想更改主目录位置,可以不更改此项。
修改目录的默认首页:
找到DirectoryIndex 后面写上你想设置为首页的文件名,如:index.html index.php等。
语言优先级,找到下列语句
LanguagePriority zh-CN zh-TW en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv
把中文(zh-CN zh-TW)的部分剪切放到前面(也就是将原来文件中的相应
部分改成如上的。
其他也没什么好改动的。APACH的配置就到这里。接着讲PHP的配置。
把php.ini-dist复制到C:\windows 下改名为 php.ini(装过php的都做过吧)
然后修改了几个地方:
在Data Handling下找到post_max_size = 8M
这是PHP将接受的POST数据最大大小,可更改为20M。
在Paths and Directories下找到extension_dir=
这里设置的是PHP搜索扩展库的位置,将其路径设为extensions文件夹的位置,即改成:
extension_dir= "C:\php\ext"
在File Uploads下找到upload_max_filesize = 2M,允许上传的的最大文件大小
可更改为20M。
Dynamic Extensions
这里是PHP扩展设置部分,列出了PHP所有的可支持扩展,前面都加了分号注
释,表示目前PHP配置不支持扩展,我们可以将分号去掉让PHP支持该扩展
下面列出的是几个常用且较实用的PHP扩展
把下面几句前面的分号去掉
;extension=php_mbstring.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_imap.dll
;extension=php_mysql.dll
到这里php.ini就配置结束。接着很重要的一点将
C:\PHP\libmysql.dll,C:\PHP\ext\php_mysql.dll,C:\PHP\ext\php_mysqli.dll
拷贝到C:\Windows\system32下,这样PHP5才能支持MYSQL。
重起APACHE,在主目录下新建一个记事本文件test在里面输入
<?php
phpinfo();
?>
保存后修改后缀名为PHP。在浏览器输入http://127.0.0.1/test.php是不是看到PHP版本信息,没错,这样PHP的配置就完成了。接下来安装MYSQL。
第一步:双击.exe文件出现的第一个需要选择的对话框是Setup Type 也就是
安装种类,这里我们可以选择Custom,根据自己的需要来安装组件和配置安装路径
点击Next,右键点击对话框出现几个硬盘形状的图标,根据自己的需要选择安装组件,
点击窗口右下的Change按钮更改安装路径的,设置好后,点击Next开始安装安装到最
后会有如下一个对话框在这里的三个选项分别是:
1:如果你没有MYSQL.com帐户,选第一个,创造一个新的免费的MYSQL.com帐户
2:如果你有MYSQL.com帐户,选第二个,填入已经注册好的邮箱名和密码
3:跳过此步骤
我们选第一个
接下来会一次出现三个对话框,在三个对话框中有* 号的部分是必须要填的,
按顺序分别是邮箱名,密码,确认密码;first name ,last name;邮政编码,
国家,省名。国家名选china,省名选other or N/A即可4.1.x和4.0.x系列版
本很大一个区别就是在安装完毕后不是运行 mysql文件夹下面的winmysqladmin.exe来
启动服务器后设置选项,而是有一个设置的过程。
第二步:设置MYSQL
首先你会看到这样的一个窗口,这里有两个选项,分别是详细配置和标准配置,
小型应用选第二项就可以了点击Next后出现下面的对话框,这里是重要的,一定
要在下拉菜单里选择MySQL41,否则不能正常启动,下面的选项是是否应用命令行,
最好选上点击Next后设置数据库密码的对话框,中间偏右和下面的选项分别是是否
允许远程控制和是否允许匿名帐号登入,为了安全,不要选择好了,点击Next后出
现最后的对话框,点击Execute按钮数据库服务器便启动了,依次出现四个对号后
点击Finish结束安装
装上PHPMYADMIN后测试连接,若出现
#1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
在开始菜单找到刚刚安装的MYSQL命令行工具,输入root的密码后键入如下的字样:
mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(‘刚才设置的ROOT密码')
-> WHERE Host = 'localhost' AND User = 'root';
mysql> FLUSH PRIVILEGES;(注意FLUSH后有空格)
然后浏览“http://localhost/phpmyadmin”,OH YEAH! 测试成功!
在谈一下关于MYSQL 4.1以后由于采用UTF8导致的乱码问题解决办法。首先注意一点,在新建数据库的时候字符集一定要选择UTF8,在PHPMYADMIN中新建数据库下,创建按钮的左边,有个下拉列表,默认是“整理”,选择UTF8。你会发现表里数据不在是问号了。
但是网页的输出还是问号,不要急接着在PHP语句中要有所改动:
在mysql_connect(…连接参数);后加上mysql_query("SET NAMES 'GBK'");linux 下GBK改为UTF8
但是如果网页很多,这样不是很麻烦,所以我在编写PHP时将所有数据库的操作写成一个类如:
class db{
….包含一些数据库调用方法….
//创建数据库连接并选择相应数据库
function createcon(){
mysql_connect(…);mysql_query("SET NAMES 'GBK'");
}
}
这样,改动一处就可以了,是不是很方便?呵呵,相信大家看完这篇文章就在也不觉的PHP环境难配置了,好了,写这么多,累死了,祝大家学习愉快!