我的xAjax入门教程——PHP学习日记之三

   毕竟简单的框架不能满足要求,至少不够成熟,不敢轻易用于商业应用,所以还是要学一下成熟的框架,还是按照之前的选择,学习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>&nbsp;</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">主&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;机:
        <label>
            <input name="host" type="text" value="localhost" />
          </label>
      </p>
      <p align="left">用&nbsp;&nbsp;户&nbsp;名:
        <label>
            <input name="username" type="text" value="root" />
          </label>
      </p>
      <p align="left">密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;码:
        <label>
            <input name="password" type="password" value="zp" />
          </label>
      </p>
      <p align="left">数&nbsp;&nbsp;据&nbsp;库:
        <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>


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值