毕竟简单的框架不能满足要求,至少不够成熟,不敢轻易用于商业应用,所以还是要学一下成熟的框架,还是按照之前的选择,学习xAjax。
xAjax的官方网站上有一个10分钟的入门教程,国内也有很多人对这篇文章进行了翻译。跟着这篇文章一步一步走,很容易完成第一个xAjax实例——不过所有的内容都在同一个文件中,而且不知道该怎样分离具体的内容,不符合逻辑、业务分离的规则。只好学习提供的其他例子,并照猫画虎,用xAjax又做一次自定义查询。
一、准备工作
把之前的表单和数据库连接查询的代码准备好,还是要用的。另外,xAjax与服务器的交互是通过Javascript调用PHP的函数来实现的,所以你得事先制定好函数。
因为是做自定义查询,我的函数还是这样来定:
function query($host, $username,$password,$database,$sql)
参数分别为主机名、连接用户名、连接密码、选用的数据库、要查询的SQL语句。
想好三个PHP文件名,分别代表表单内容(显示client)、业务处理内容(模型server)、公用部分(common)。
二、开始工作
1、准备一个通用的PHP文件,两边都要调用的,即表单所在的文件要调用,服务器端处理数据的文件也要调用。按照上面的意思,大家都明白,这个文件也可以不要,分别copy到两个文件就好了。不过最好是把公用的东西分开,大家都知道。
按照xAjax官方示例的习惯,这个文件一般叫"应用名".common.php;本人则偷懒,直接叫common.php,内容如下:
<?php
require_once ("../xajax.inc.php"); //引用xajax,注意要写对路径
$xajax = new xajax("query.php"); //初始化对象,参数是处理服务器业务的PHP文件名,在这是query.php。
$xajax->registerFunction("query"); //注册要使用的函数名
$xajax->registerFunction("test");
?>
2、业务处理内容query.php
把具体的业务处理代码放在函数里面,注意不用自己取值,直接使用参数就好,另外返回的结果必须是xajaxResponse对象。定义函数之后,加上两个语句。
require("common.php"); //最后调用通用的common文件
$xajax->processRequests(); //处理Request
具体内容如下:
<?php
// multiply.php, multiply.common.php, multiply.server.php
// demonstrate a very basic xajax implementation
// using xajax version 0.2
// http://xajaxproject.org
function execsql($host, $username,$password,$database,$sql)
{
$res = '';
$res .= '<table width="80%" border="1" cellpadding="0" cellspacing="1">';
$link = mysql_pconnect($host, $username, $password)
or die("Could not connect: " . mysql_error()); //连接MYSQL
mysql_select_db($database)
or die("Could not select database: " . mysql_error()); //选择数据库
$query = $sql;
$result = mysql_query($query)
or die("Query failed: " . mysql_error()); //执行用户提交的SQL语句
//表头输出字段名
$res .= '<tr>';
$numfields = mysql_num_fields($result);
for ($i=0; $i < $numfields; $i++) // Header
{ $res .= '<th>'.mysql_field_name($result, $i).'</th>'; }
$res .= "</tr>/n";
//输出结果
while ($row = mysql_fetch_row($result)) {
$res .= '<tr>';
$cnt = count($row);
for ($i=0; $i<$cnt; $i++){
if ($row[$i] != NULL){
$res .= '<td>'.$row[$i].'</td>';
}else{
$res .= '<td> </td>';
} //end of if
} // end of for
$res .= '</tr>';
} //end of while
$res .= '</table>';
mysql_free_result($result);//释放结果
mysql_close($link);
return $res;
//return "ok";
} //end of function
function test2()
{
return "ok";
}
function query($host, $username,$password,$database,$sql)
{
$res2 = execsql($host, $username,$password,$database,$sql); //不用从POST或GET中取参数了
$objResponse = new xajaxResponse();
$objResponse->setCharEncoding("GB2312"); //切换编码
$objResponse->addAssign("res", "innerHTML", $res2); //这就是数据返回的方式了,直接修改form文件里res对象的属性。
return $objResponse;
}
function test($str)
{
$objResponse = new xajaxResponse();
$objResponse->addAssign("sql2", "value", $str);
//echo "ok";
return $objResponse;
}
require("common.php"); //最后调用引用的common文件
$xajax->processRequests(); //处理Request
?>
3、客户端处理form.php
客户端在文件最开始就引用common文件,在head标志间调用$xajax->printJavascript('../'),其中参数是xajax_js目录的路径,千万别弄错了;另外,服务器端的函数只要注册了就可以直接调用,不过千万得加上xajax_,例如xajax_query(),这一点曾扰我很久,郁闷。
内容如下了:
<?php
require("common.php"); //开始就引用common文件
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>PHP&XAJA处理自定义查询</title>
<?php $xajax->printJavascript('../'); ?> //head标志间调用$xajax->printJavascript('../'),千万别弄错参数
<script language="javascript">
function query(){
var host,username,password,database,sql
host = document.form1.host.value
username = document.form1.username.value
password = document.form1.password.value
database = document.form1.database.value
sql = document.form1.sql.value
xajax_query(host,username,password,database,sql);//这里调用函数
return false;
}
</script>
</head>
<body>
<table width="80%" border="1" cellpadding="0" cellspacing="1" bordercolor="#000000" >
<caption align="left">
数据库设置
</caption>
<tr>
<td><form id="form1" name="form1" >
<p align="left">主 机:
<label>
<input name="host" type="text" value="localhost" />
</label>
</p>
<p align="left">用 户 名:
<label>
<input name="username" type="text" value="root" />
</label>
</p>
<p align="left">密 码:
<label>
<input name="password" type="password" value="zp" />
</label>
</p>
<p align="left">数 据 库:
<label>
<input name="database" type="text" value="sites" />
</label>
</p>
<p align="left">SQL语句:
<label>
<input name="sql" type="text" value="show tables" size="50" />
</label>
</p>
<center>
<input type="hidden" name="action" value="unsubmitted" />
<input type="button" name="Submit" value="执行" οnclick="query()" />
<label></label>
<label></label>
</center>
</form></td>
</tr>
</table>
<span id="res"></span> //业务内容处理文件中曾用到这个对象,还记得吗?
</body>
</html>