<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>华斐Blog &#187; jQuery</title>
	<atom:link href="http://www.huafei117.com/tag/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.huafei117.com</link>
	<description>华斐网志以及学习心得</description>
	<lastBuildDate>Wed, 28 Dec 2011 02:36:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>[转载]使用 jQuery 和 PHP 构建一个受 Ajax 驱动的 Web 页面</title>
		<link>http://www.huafei117.com/2010/02/28/%e8%bd%ac%e8%bd%bd%e4%bd%bf%e7%94%a8-jquery-%e5%92%8c-php-%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%8f%97-ajax-%e9%a9%b1%e5%8a%a8%e7%9a%84-web-%e9%a1%b5%e9%9d%a2/</link>
		<comments>http://www.huafei117.com/2010/02/28/%e8%bd%ac%e8%bd%bd%e4%bd%bf%e7%94%a8-jquery-%e5%92%8c-php-%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%8f%97-ajax-%e9%a9%b1%e5%8a%a8%e7%9a%84-web-%e9%a1%b5%e9%9d%a2/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 15:15:58 +0000</pubDate>
		<dc:creator>华斐</dc:creator>
				<category><![CDATA[PHP&MYSQL]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.huafei117.com/132.htm</guid>
		<description><![CDATA[一个下午的时间就耗费在这个上了，在PHPCHINA看的专题《使用 jQuery 和 PHP 构建一个受 Ajax 驱动的 Web 页面》，自己抄代码运行了几次终于能成功了，原来这些jQuery、Ajax等新技术也不算很难懂的！ 创建一个简单的应用程序:一个电话本 有了 jQuery 的基本知识之后，我们就可以开始用 PHP 和 MySQL 构建一个简单的电话本应用程序了。这个应用程序包含三个部分: 一个 MySQL 表，用来保存人名和电话号码 具有搜索表单的 index.php 文件 用来查询数据库表的 find.php 页面 我们将依次构建这些元素。 创建数据库表 在 MySQL 内创建数据库表可能是最简单的部分。我们希望此应用程序是一个包含有最少量信息的表 — 比如，一个 ID（表的键）、一个名字字段以及一个电话号码字段。最后这两个字段可以是字母数字，所以将使用 varchar() 函数。我们将创建 ID 字段作为一个 autoincrement primary key。将此表称为目录 并使用如下的 Structured Query Language (SQL) 代码来创建它: 清单 2. 使用 SQL 创建目录表 CREATE TABLE `directory` [...]]]></description>
			<content:encoded><![CDATA[<p>一个下午的时间就耗费在这个上了，在PHPCHINA看的专题《<a href="http://www.phpchina.com/index.php?action-viewnews-itemid-35556" target="_blank">使用 jQuery 和 PHP 构建一个受 Ajax 驱动的 Web 页面</a>》，自己抄代码运行了几次终于能成功了，原来这些jQuery、Ajax等新技术也不算很难懂的！</p>
<p>创建一个简单的应用程序:一个电话本</p>
<p>有了 jQuery 的基本知识之后，我们就可以开始用 PHP 和 MySQL 构建一个简单的电话本应用程序了。这个应用程序包含三个部分:</p>
<ul>
<li>一个 MySQL 表，用来保存人名和电话号码 </li>
<li>具有搜索表单的 index.php 文件 </li>
<li>用来查询数据库表的 find.php 页面 </li>
</ul>
<p>我们将依次构建这些元素。</p>
<p><a name="databasetable"><strong>创建数据库表</strong></a></p>
<p>在 MySQL 内创建数据库表可能是最简单的部分。我们希望此应用程序是一个包含有最少量信息的表 — 比如，一个 ID（表的键）、一个名字字段以及一个电话号码字段。最后这两个字段可以是字母数字，所以将使用 <code>varchar()</code> 函数。我们将创建 ID 字段作为一个 <code>autoincrement primary key</code>。将此表称为<i>目录</i> 并使用如下的 Structured Query Language (SQL) 代码来创建它:</p>
<p> <span id="more-132"></span>
<p><a name="list2"><b>清单 2. 使用 SQL 创建目录表</b></a></p>
<pre>
CREATE TABLE `directory` (
 `id` INT NOT NULL AUTO_INCREMENT ,
 `name` VARCHAR( 64 ) NOT NULL ,
 `phone` VARCHAR( 16 ) NOT NULL ,
 PRIMARY KEY ( `id` )
) TYPE = MYISAM ;</pre>
<p>正如您所见，这里没有什么复杂的。实际上，之后您将有大量机会自己更新这个应用程序。扩展此应用程序的一种方式是添加一个关键字或地址字段，而二者均能让您进一步精炼搜索。不过，现在，我们还是先从简单的开始吧。</p>
<p>创建了该表之后，需要填充它。可以使用 phpMyAdmin 或命令行来输入一个名字和电话号码。也可以使用如下的 SQL 指令集:</p>
<p><a name="list3"><b>清单 3. 使用 SQL 填充此表</b></a></p>
<pre>
insert into `directory` (name,phone) values ('Tom Smith', '512-555-0111');
insert into `directory` (name,phone) values ('Bill Smith', '512-555-0112');
insert into `directory` (name,phone) values ('John Smith', '512-555-0113');
insert into `directory` (name,phone) values ('Jane Smith', '512-555-0114');
insert into `directory` (name,phone) values ('Sara Smith', '512-555-0115');</pre>
<p>输入了这些值之后，如果从命令行的目录操作运行一个 <code>select *</code> 或单击 phpMyAdmin 内的 <b>Browse</b> ，请确保能够获得一个记录列表。</p>
<p><a name="createindexphp"><strong>创建 index.php 文件</strong></a></p>
<p>接下来，为应用程序创建一个简单的主页。此页面是一个 PHP 文件，称为 index.php，但此时它包含最多的仍是 HTML 代码。当完成了 find.php 文件后（下一步），我们还会返回来完成这一代码块。</p>
<p>此刻，所需做的就是创建一个包含表单的骨架 HTML 文件。表单内的每个元素均包含一个惟一的 ID，因为我们想要能够使用 jQuery 标识每一块。</p>
<p><a name="list4"><b>清单 4. 包含表单的 HTML 文件</b></a></p>
<pre>
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome!&lt;/title&gt;
&lt;/head&gt; 

&lt;body&gt;
&lt;h1&gt;Search our Phone Directory&lt;/h1&gt;
    &lt;form id=&quot;searchform&quot; method=&quot;post&quot;&gt;
&lt;div&gt;
        &lt;label for=&quot;search_term&quot;&gt;Search name/phone&lt;/label&gt;
        &lt;input type=&quot;text&quot; name=&quot;search_term&quot; id=&quot;search_term&quot; /&gt;
&lt;input type=&quot;submit&quot; value=&quot;search&quot; id=&quot;search_button&quot; /&gt;
&lt;/div&gt;
    &lt;/form&gt;
    &lt;div id=&quot;search_results&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt; </pre>
<p>上述代码中有两点应该会立即引起您的注意。其一，没有动作与此表单相关联。这没关系：请记住，此表单将不会遵循传统的 “单击、等待、查看” 的同步模式。相反，我们将会添加能够监视 <code>search_term</code> 字段内的用户动作的功能。</p>
<p>应该注意到的第二点是 <code>search_results</code> DOM 元素 — 表单下面的空白元素。这个 DOM 元素将会包含从搜索中获得的所有响应。在对此进行深入研究之前，让我们先来创建 find.php 页面。</p>
<p><a name="createfindphp"><strong>创建 find.php 文件</strong></a></p>
<p>find.php 文件是所有操作发生的地方。在此文件内，应用程序连接到数据库并针对此目录表运行查询。</p>
<p>find.php 文件的第一部分包含连接信息。出于本文的目的考虑，我将该信息嵌入到了此文件。对于大多数开发人员而言，此信息将会处于一个附带的或必需的文件内，或是作为一个更大的框架的一部分。</p>
<p><a name="list5"><b>清单 5. 创建 find.php 文件</b></a></p>
<pre>


&lt;?php
define(HOST, &quot;your.host.here&quot;);
define(USER, &quot;your-user-name&quot;);
define(PW, &quot;your-password&quot;);
define(DB, &quot;your-db-name&quot;);

$connect = mysql_connect(HOST,USER,PW)
or die('Could not connect to mysql server.' );

mysql_select_db(DB, $connect)
or die('Could not select database.');
</pre>
<p>接下来，将会从此 index.php 文件内的表单获得一个搜索词。对该搜索词进行一些简单处理，然后将该值插入到数据库内。我选择使用 <code>strip_tags()</code> 和 <code>substr()</code> 函数来删除搜索词内的所有 HTML 标记并对之进行简化。进行这类预处理不失为一个好的做法 — 不能百分之百相信用户的输入。</p>
<p>实际上，当具有了一个清晰的搜索词后，就可以通过 <code>mysql_escape_string()</code> 运行它，这可进一步消除可能会破坏数据库的其他陷阱（比如，单引号）。</p>
<pre>$term = strip_tags(substr($_POST['search_term'],0, 100));
$term = mysql_escape_string($term); </pre>
<p>现在，构建 SQL 语句。我们希望从此目录表能够检索到匹配搜索词的所有名字和电话号码。使用 <code>LIKE</code> 让搜索词能匹配名字和电话这两个字段，然后使用 <code>mysql_query()</code> 运行此查询。</p>
<p><a name="list6"><b>清单 6. 构建 SQL 语句</b></a></p>
<pre>
$sql = &quot;select name,phone
from directory
where name like '%$term%'
or phone like '%$term%'
order by name asc&quot;;

$result = mysql_query($sql);</pre>
<p>运行了此查询后，可以打印结果。初始化一个 <code>$string</code> 变量来保存结果，然后使用 <code>mysql_num_rows()</code> 检查是否得到了任何结果。如果没有获得针对此搜索词的结果，可以将 <code>$string</code> 设置为等于 “No matches!”。如果的确获得了结果，可打印结果集内的每个名字和电话号码。在过程的末尾，使用 <code>echo</code> 命令打印整个字符串：</p>
<p><a name="list7"><b>清单 7. 使用 <code>echo</code> 命令打印字符串</b></a></p>
<pre>
$string = '';

if (mysql_num_rows($result) &gt; 0){
  while($row = mysql_fetch_object($result)){
    $string .= &quot;&lt;b&gt;&quot;.$row-&gt;name.&quot;&lt;/b&gt; - &quot;;
    $string .= $row-&gt;phone.&quot;&lt;/a&gt;&quot;;
    $string .= &quot;&lt;br/&gt;\n&quot;;
  }

}else{
  $string = &quot;No matches!&quot;;
} 

echo $string;
?&gt;</pre>
<p>当然，这个 PHP 功能本身就十分有用，但是现在，这一点没有突出体现出来。需要能够为此脚本提供一个搜索词。在下一节，我们将实现这一目的。</p>
<p><a name="addjquery"><strong>向 index.php 添加 jQuery</strong></a></p>
<p>至此，我们得到的是一对普通的 PHP 页面和一个简单的 MySQL 表。当添加了 jQuery 后，这个普通的应用程序就会变成一个新颖的、受 Ajax 驱动的应用程序，它将更类似于 Mac OS X 上的 Spotlight 或 Google Desktop Search 这样的桌面搜索应用程序。</p>
<p>现在，打开 index.php 文件并确保添加了对最新下载的 jquery.js 文件的调用。</p>
<pre>&lt;script src=&quot;./jquery.js&quot;&gt;&lt;/script&gt;</pre>
<p>接下来，创建一个简单的函数来阻止搜索表单表现得像典型的表单那样。（使用 <code>preventDefault()</code> 函数实现此目的）。将所有 <b>Submit</b> 按钮和 key-up 事件（即在通过键盘键入字符时发生的事件）重新指向到一个将要创建的新函数，称为 <code>ajax_search()</code>。</p>
<p><a name="list7"><b>清单 8. 创建函数以阻止搜索表单表现得像典型的表单那样</b></a></p>
<pre>
&lt;script type='text/javascript'&gt;
$(document).ready(function(){
$(&quot;#search_results&quot;).slideUp();
    $(&quot;#search_button&quot;).click(function(e){
        e.preventDefault();
        ajax_search();
    });
    $(&quot;#search_term&quot;).keyup(function(e){
        e.preventDefault();
        ajax_search();
    }); 

}); </pre>
<p>您注意到我们是如何使用 <code>slideUp()</code> 函数来暂时隐藏 <code>search_results</code> DOM 元素的吗？以及又是如何使用 <code>$()</code> 函数来按名字引用该 DOM 元素？如果您十分熟悉 CSS，那么 jQuery 方式就十分直观和自然了。比如，假设有一个具有惟一 ID <code>search_results</code> 的 DOM 元素，您就可以使用 <code>$(&quot;#search_results&quot;)</code> 来引用它。就这么简单。</p>
<p>另外还注意到，任何时候，任何人单击了 <b>Search</b> 或在 <code>search_term</code> 字段键入一个字符，一个匿名函数都会阻止默认行为的发生并会将 应用程序流程重新指向到 <code>ajax_search()</code> 函数，该函数我们接下来将会构建。</p>
<p><code>ajax_search()</code> 函数十分简单。我们想要显示 DOM 元素 <code>search_results</code>（之前已经将其隐藏）、获得 <code>search_term</code> 输入字段的值、将该值传递给一个异步运行 find.php 文件的函数（<code>$.post()</code>），然后等待响应。当响应到来后（还记得么，我们已经确保了该 find.php 将会返回某种响应，即便在没有匹配的情况下也是如此），jQuery 用该响应填充 <code>search_results</code> DOM 元素。</p>
<p><a name="list9"><b>清单 9. <code>ajax_search()</code> 函数</b></a></p>
<pre>
function ajax_search(){
  $(&quot;#search_results&quot;).show();
  var search_val=$(&quot;#search_term&quot;).val();
  $.post(&quot;./find.php&quot;, {search_term : search_val}, function(data){
   if (data.length&gt;0){
     $(&quot;#search_results&quot;).html(data);
   }
  })
}
&lt;/script&gt; </pre>
<p>所有系统都就绪后，就可以键入一个请求并查看此搜索引擎的实际工作情况了，每个 key-up 事件都会处理记录。它在单击 <b>Submit</b> 时也能工作。比如，在图 1 中，如果在搜索字段内键入字母 <code>a</code>，应用程序就会返回 Jane 和 Sara Smith 这两条记录，因为这两个名字中都包含此字母。</p>
<p><a name="fig1"><b>图 1. 运行中的受 Ajax 驱动的搜索</b></a></p>
<p><a href="http://www.phpchina.com/batch.download.php?aid=8240"><img border="0" src="http://www.phpchina.com/attachments/2009/12/1_2009122410320015d2u.jpg" /></a></p>
<p><a name="conclusion">结束语</a></p>
<p>当然，针对此应用程序还有很多工作可做。比如，可以添加一个关键字字段，然后允许按关键字搜索。或者，可以让每个人的记录包含针对其所擅长的不同领域的标记或关键字。此后，如果您在项目中遇到问题，就能够通过资源查找来找到能够帮助您的人。此外，还可以添加一个电子邮件字段、一个生日字段 — 无论什么都可以 — 然后扩展搜索参数。</p>
<p>关键的一点是此应用程序的 jQuery 部分并不关心在后端发生的事情。它所知道的就是将一个搜索词传递给一个称为 <i>find.php</i> 的文件。find.php 文件并不知道也不关心它从一个 jQuery 函数接收指令。它所关注的是只要搜索词来自于一个正常的表单提交过程，它就使用该数据来完成查询，然后返回匹配该搜索词的那些记录。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.huafei117.com/2010/02/28/%e8%bd%ac%e8%bd%bd%e4%bd%bf%e7%94%a8-jquery-%e5%92%8c-php-%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%8f%97-ajax-%e9%a9%b1%e5%8a%a8%e7%9a%84-web-%e9%a1%b5%e9%9d%a2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

