存档

‘PHP从入门到精通’ 分类的存档

ajax-cross-domain

2010年5月19日

现在是Web 2.0时代,AJAX使用得非常多。但是使用纯粹的AJAX,经常会遇到跨域的问题。

其实归结起来,解决跨域问题,也不外乎几种方式:

1、代理方式

2、on-Demand方式

3、iframe方式

4、用户本地转储方式 (local)

5、其实还是在服务端A用iframe解决了与服务器B通信的问题

6、PHP + HTML(含JS)

其实这几种方式,原理基本上都是一样的,绕开AJAX对于跨域的限制。下面就对这几种处理方式大概谈一下。

1、web代理方式

即用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面,由该页面代替用户页面完成交互,从而返回合适的结果。此方案可以解决现阶段所能够想到的多数跨域访问问题,但要求A网站提供Web代理的支持,因此A网站与B网站之间必须是紧密协作的,且每次交互过程,A网站的服务器负担增加,且无法代用户保存session状态。

2、on-Demand 方式

MYMSN的门户就用的这种方式,不过 MYMSN中不涉及跨域访问问题。在页面内动态生成新的<script>,将其src属性指向别的网站的网址,这个网址返回的内容必须是合法的Javascript脚本,常用的是JSON消息。此方案存在的缺陷是, script的src属性完成该调用时采取的方式时get方式,如果请求时传递的字符串过大时,可能会无法正常运行。不过此方案非常适合聚合类门户使用。

<html>
<head>
<script language="javascript" type="text/javascript">
function loadContent()
{
var s=document.createElement(‘SCRIPT’);
s.src=’http://www.anotherdomain.com/TestCrossJS.aspx?f=setDivContent’;
document.body.appendChild(s);
}

function setDivContent(v)
{
var dv = document.getElementById("dv");
dv.innerHTML = v;
}
</script>
</head>
<body>
<div id="dv"></div>

<input type="button" value="Click Me" onclick="loadContent()">
</body>
</html>

其中的www.anotherdomain.com/TestCrossJS.aspx是这样的,

<script language="C#" runat="server">
void Page_Load(object sender, EventArgs e)
{
  string f = Request.QueryString["f"];
  Response.Clear();
  Response.ContentType = "application/x-javascript";
  Response.Write(String.Format(@"
                   {0}(‘{1}’);",
                   f,
                   DateTime.Now));
  Response.End();
}
</script>

点击“Click Me”按钮,生成一个新的script tag,下载对应的 Javascript 脚本,结束时回调其中的setDivContent(),从而更新网页上一个div的内容。 

3、iframe方式

查看过醒来在javaeye上的一篇关于跨域访问的帖子,他提到自己已经用iframe的方式解决了跨域访问问题。数据提交跟获取,采用 iframe这种方式的确可以了,但由于父窗口与子窗口之间不能交互(跨域访问的情况下,这种交互被拒绝),因此无法完成对父窗口效果的影响。

在页面内嵌或动态生成指向别的网站的IFRAME,然后这2个网页间可以通过改变对方的anchor hash fragment来传输消息。改变一个网页的anchor hash fragment并不会使浏览器重新装载网页,所以一个网页的状态得以保持,而网页本身则可以通过一个计时器(timer)来察觉自己anchor hash的变化,从而相应改变自己的状态。

1. http://domain1/TestCross.html:

<html>
<head>
<script language="javascript" type="text/javascript">
var url = "http://domain2/TestCross.html"
var oldHash = null;
var timer = null;

function getHash()
{
var hash = window.location.hash;
if ((hash.length >= 1) && (hash.charAt(0) == ‘#’))
{
hash = hash.substring(1);
}

return hash;
}
function sendRequest()
{
var d = document;
var t = d.getElementById(‘request’);
var f = d.getElementById(‘alienFrame’);
f.src = url + "#" + t.value + "<br/>" + new Date();
}

function setDivHtml(v)
{
var d = document;
var dv = d.getElementById(‘response’);
dv.innerHTML = v;
}

function idle()
{
var newHash = getHash();

if (newHash != oldHash)
{
setDivHtml(newHash);
oldHash = newHash;
}

timer = window.setTimeout(idle, 100);
}

function window.onload()
{
timer = window.setTimeout(idle, 100);
}
</script>
</head>
<body>

请求:<input type="text" id="request"> <input type="button" value="发送" onclick="sendRequest()" /><br/>
回复:<div id="response"></div>

<iframe id="alienFrame" src="http://domain2/TestCross.html"></iframe>

</body>
</html>

2. http://domain2/TestCross.html:

<html>
<head>
<script language="javascript" type="text/javascript">
var url = "http://domain1/TestCross.html"
var oldHash = null;
var timer = null;

function getHash()
{
var hash = window.location.hash;
if ((hash.length >= 1) && (hash.charAt(0) == ‘#’))
{
hash = hash.substring(1);
}

return hash;
}
function sendRequest()
{
var d = document;
var t = d.getElementById(‘request’);
var f = parent;
//alert(f.document); //试着去掉这个注释,你会得到“Access is denied”
f.location.href = url + "#" + t.value + "<br/>" + new Date();
}

function setDivHtml(v)
{
var d = document;
var dv = d.getElementById(‘response’);
dv.innerHTML = v;
}

function idle()
{
var newHash = getHash();

if (newHash != oldHash)
{
setDivHtml(newHash);
oldHash = newHash;
}

timer = window.setTimeout(idle, 100);
}

function window.onload()
{
timer = window.setTimeout(idle, 100);
}
</script>
</head>
<body>

请求:<input type="text" id="request"> <input type="button" value="发送" onclick="sendRequest()" /><br/>
回复:<div id="response"></div>

</body>
</html>

两个网页基本相同,第一个网页内嵌一个IFRAME,在点击“发送”按钮后,会将文本框里的内容通过hash fragment传给IFRAME。点击IFRAME里的“发送”按钮后,它会将文本框里的内容通过hash fragment传给父窗口。因为是只改动了hash fragment,浏览器不会重新load网页内容,这里使用了一个计时器来检测URL变化,如果变化了,就更新其中一个div的内容 。

4、用户本地转储方式 (local)

IE本身依附于windows平台的特性为我们提供了一种基于iframe,利用内存来“绕行”的方案,即两个window之间可以在客户端通过 windows剪贴板的方式进行数据传输,只需要在接受数据的一方设置Interval进行轮询,获得结果后清除Interval即可。FF的平台独立性决定了它不支持剪贴板这种方式,而以往版本的FF中存在的插件漏洞又被fixed了,所以FF无法通过内存来完成暗渡陈仓。而由于文件操作FF 也没有提供支持(无法通过Cookie跨域完成数据传递),致使这种技巧性的方式只能在IE中使用。

5、其实还是在服务端A用iframe解决了与服务器B通信的问题

要解决的问题:发生在用户提交网页 URL (还包括 Tag, Notes 等)给 Bookmark 服务器时。

关于 URL 的提交至少可以有三种方式:

1.       登陆 Bookmark 服务器的提交页面,将要收藏的 URL 通过该页面提交给服务器。

2.       安装浏览器插件,通过插件将 URL 提交给服务器。

3.       从 Bookmark 服务器动态加载 javascript 小工具到当前页面,通过它来完成提交工作。

    第一种方式开发起来最简单,但对用户来讲比较麻烦,每次都需要先登陆 Bookmark 服务器才能完成提交;第二种方式我并不熟悉插件开发,而且用户也不喜欢太多的插件堆满自己的浏览器;第三种方式开发难度小,又避免了每次登陆服务器的麻烦,所以最终采用它。第三种方式中动态加载的 javascript 小工具除了需要生成 UI 供用户填写信息( URL , tag , notes 等),当用户点击提交的时候,还要完成与服务器通信的功能。

     跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容。由于安全原因,跨域访问是被各大浏览器所默认禁止的。写过跨域访问 ajax 的朋友相信都遇到过被告知“没有权限”的情况。通过 XMLHttp 来发送数据给 Bookmark 服务器的尝试失败了。于是,看到网上的一些资料,我又开始尝试用 javascript 小工具在用户网页动态创建一个隐藏的 iframe, iframe 的 src 指向服务器的一个 servlet ,试图通过调用 iframe 中提供的 javascript 来完成与服务器的通信。但不幸的是,用户网页中的 javascript 代码访问 iframe 也被浏览器归为跨域访问(特指 iframe 的 src 指向其它网站的情形),尝试再次失败。

最终,在一篇文章中看到,与 iframe 不同,如果 A 网站从 B 网站加载 javascript , A 网站可以自由的访问该 javascript 的内容,并不会被浏览器认为是跨域访问。模仿刚才 iframe 的思路,当用户点击提交时,可以动态创建一个 javascript 对象,该对象的 src 指向 Bookmark 服务器的一个 servlet ,注意: URL 、 Tag 、 Notes 、 User 、Password 等信息被作为 src URL 参数传给服务器。请看下面的代码:

var url = "http://localhost:8080/Deeryard/BookmarkServlet?" +

           "url=" + url_source + "&" + "title=" + title + "&" +

"tag=" + tag + "&" + "notes=" + notes + "&" + "user=" + user + "&" + "password=" + password;

url = encodeURI(url);

//Submit to server with a trick

var js_obj = document.createElement( "script" );

js_obj.type = "text/javascript" ;

js_obj.setAttribute( "src" , url);

//Get response from server by appending it to document

document.body.appendChild(js_obj);

上面例子中, js_obj.setArrribute() 将信息作为 src 的 URL 参数提交给了 Bookmark servlet 。那么用户又如何取得服务器的响应信息呢?答案就是最末一行代码, servlet 的输出必须是 javascript 代码,它可以调用用户网页上的其他 javascript 函数,以及操作 dom 对象。下面的 servlet 代码生成了一个 javascript 函数调用:

out.write("onServerResponse(INADEQUATE_INFORMATION);");

document.body.appendChild(js_obj) 执行后 onServerResponse( INADEQUATE_INFORMATION) 就会得到执行,使客户网页响应服务器结果。这样一个完整的通信过程就完成了。

6、PHP + HTML(含JS)

服务器A上已经装好了Tomcat, 我们写一个test.html(含JS),再写一个PHP文件(由其来完成跨域通信要求)。

更多地,请参考:https://www6.software.ibm.com/developerworks/cn/education/xml/x-ajaxtrans/index.html

http://www.xyhhxx.com/news/net/20061013121041.htm

 

以上几种方式,其实方式都差不多,只是实现方式不同而已。诸君可根据具体情况选择其一做为具体的解决办法。

 

怎么样?简单吧?简单就回复一下。。。。

HTML, Javascript, PHP从入门到精通

意外的惊喜

2010年4月30日

今天下午,在斑马线等待一位朋友时,突然看到一TX手里面拿着一本书,感觉好眼熟,于是问了一下该同学,兄弟,请问你拿的是什么书?那兄弟也挺配合的, 就直接把手里面的书给我看,我一看,难怪那么眼熟,原来这就是我写的那本书!

我看那书后好像贴着标签,有点像是借的,我就问那兄弟,你这本书是买的还是借的?该同学回答,这是借的。那你是从哪里借的呢?是从我们学校图书馆借的。你们学校是…?成都理工大学。哦,原来这样,好,没事,多谢兄弟!

正好我的朋友也从对面走了,我也该走了。

真是没有想到居然在这个时候看到有人拿着我的书,并且还是从学校图书馆借的,难得!真没有想到我的书居然进了成都理工大学的馆藏!

多谢你们!

今天是我的喜庆日子,还真没有想到我自己居然发现这样的喜庆!

PHP从入门到精通, PHP教程

谈PHP中的多态

2009年9月9日

多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息将可以产生不同的结果,这种现象称为多态性。

多态性允许每个对象以适合自身的方式去响应共同的消息。多态性增强了软件的灵活性和重用性。

在面向对象的软件开发中,多态性是最为重要的部分之一。面向对象编程并不只是将相关的方法与数据简单的结合起来,而是采用面向对象编程中的各种要素将现实生活中的各种情况清晰的描述出来。这一小节将对面向对象编程中的多态性作详细的讲解。

10.2.1  什么是多态

多态(Polymorphism)按字面上意思理解就是“多种形状”。可以理解为多种表现形式,也即“一个对外接口,多个内部实现方法”。在面向对象的理论中,多态性的一般定义为:同一个操作作用于不同的类的实例,将产生不同的执行结果。也即不同类的对象收到相同的消息时,将得到不同的结果。

在实际的应用开发中,采用面向对象中的多态主要在于可以将不同的子类对象都当作一个父类来处理,并且可以屏蔽不同子类对象之间所存在的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

10.2.2  多态的应用设计

在实际的应用开发中,通常为了使项目能够在以后的时间里的轻松实现扩展与升级,需要通过继承实现可复用模块进行轻松升级。在进行可复用模块设计时,就需要尽可能的减少使用流程控制语句。此时就可以采用多态实现该类设计。

【示例10.4】例举了通常采用流程控制语句实现不同类的处理。其代码如下所示。

<?php
    class painter{                                    //定义油漆工类
        public function paintbrush(){                 //定义油漆工动作
            echo "油漆工正在刷漆!\n";
        }
    }
    class typist{                                    //定义打字员类
        public function typed(){                     //定义打字员工作
            echo "打字员正在打字!\n";
        }
    }
    function printworking($obj){                    //定义处理类
        if($obj instanceof painter){                //若对象是油漆工类,则显示油漆工动作
            $obj->paintbrush();
        }elseif($obj instanceof typist){            //若对象是打字员类,则显示打字员动作
            $obj->typed();
        }else{                                    //若非以上类,则显示出错信息
            echo "Error: 对象错误!";
        }
    }
    printworking(new painter());                    //显示员工工作
    printworking(new typist());                     //显示员工工作
?>

分析:在上述程序中,首先定义两个员工类:油漆工类和打字员类。然后定义一个处理函数,在该函数中,判断员工是否为已经定义的员工,打印出员工的工作状态。其结果如下所示。

油漆工正在刷漆 

打字员正在打字

从以上程序可轻松看出,若想显示其几种员工的工作状态,需要首先定义该员工类,并在该员工类中定义员工的工作,然后在printworking()函数中增加elseif语句以检查对象是哪一员工类的实例。这在实际的应用中,是非常不可取的。若此时采用多态,则可以轻松解决此问题。

可以首先创建一个员工父类,所有的员工类将继承自该员工父类,并且继承父类的所有方法与属性。然后在员工类中创建“是一”关系,判断是否为合法的员工。

【示例10.5】例举了采用多态的方式改写上例。其代码如下所示。

<?php
	class employee{							//定义员工父类
		protected function working(){				//定义员工工作,需要在子类的实现
			echo "本方法需要在子类中重载!";
		}
	}
	class painter extends employee{					//定义油漆工类
		public function working(){				//实现继承的工作方法
			echo "油漆工正在刷漆!\n";
		}
	}
	class typist extends employee{					//定义打字员类
		public function working(){
			echo "打字员正在打字!\n";
		}
	}
	class manager extends employee{					//定义经理类
		public function working(){
			echo "经理正在开会!";
		}
	}
	function printworking($obj){					//定义处理方法
		if($obj instanceof employee){				//若是员工对象,则显示其工作状态
			$obj->working();
		}else{							//否则显示错误信息
			echo "Error: 对象错误!";
		}
	}
	printworking(new painter());					//显示油漆工的工作
	printworking(new typist());					//显示打字员的工作
	printworking(new manager());					//显示经理的工作
?>

分析:在上述程序中,首先定义一个员工基类,并定义一个员工工作状态的方法。然后定义将继承自员工基类的三个员工类:油漆工类、打字员类和经理类。然后定义显示员工工作状态的方法。并在该方法中创建一个“是一”关系,用于判断是否为合法的员工。其结果如下所示。

油漆工正在刷漆!

打字员正在打字!

经理正在开会!

从上例可发现,无论增加多少个员工类,只需要实现自员工父类继承的该员工类和方法。而无须修改显示员工工作状态的方法printworking()。

PHP从入门到精通, PHP教程 ,

《PHP从入门到精通》样章-14章

2009年9月8日

第14章 PHP与AJAX

AJAX技术是近年流行起来的技术。它是现有的多种技术的综合应用,包括JavaScript技术、XML技术、DOM技术和XMLHttpRequest控件等多种技术。AJAX技术是现在流行的Web2.0的一个重要标志。本章将对以下内容讲解:

  • AJAX原理。

  • AJAX的核心技术。

  • AJAX的相关应用。

通过对本章的学习,读者将能够理解什么是AJAX,其工作原理是什么,并且能够在实际的应用中使用AJAX

14.1 AJAX概述

AJAX技术是当前Web技术中一门炙手可热的新兴技术。实质上,它并非一门新技术,而是几种新技术的强大组合。它能够为用户提供更为自然的浏览体验。这一节将对AJAX进行详细地介绍。

14.1.1 什么是AJAX

传统B/S模式的应用程序的弊端是对用户反应不灵敏,用户总是处于“提交=>等待=>响应”的过程中,也就是说“用户的动作总是在和服务器思考时间同步”。而AJAX提供了与服务器异步通信的能力,从根本上让用户从“请求=>等待=>响应”的循环中解脱出来。

AJAXAsynchronous JavaScript and XML(以及DHTML等)的缩写,翻译成中文为异步JavaScriptXML。这个短语是Adaptive PathJesse James Garrett发明的,按照Jesse的解释,这不是个首字母缩写词,AJAX技术包含:

  • 基于CSS标准的表示。

  • 使用Document Object Model进行动态显示和交互。

  • 使用XMLHttpRequest与服务器进行异步通信。

  • 使用JavaScript绑定一切。

AJAX是现有多种技术的综合应用。它是通过浏览器页面与服务器后台处理的异步处理来减少网络传输,进而减少用户的等待时间和服务器负担的一种综合技术。它由HTMLJavaScript技术、DHTMLDOM组成,这一方法可以将传统笨拙的Web界面转化成交互性的AJAX应用程序。

14.1.2 工作原理

AJAX的核心是XMLHttpRequestXMLHttpRequest提供了与服务器异步通信的能力,从而让用户在请求的时候不受到阻塞。其工作流程如下所述。

首先由用户在客户端浏览器页面触发某个事件,如onclick事件,当然,这个事件只能是被JavaScript脚本语言捕获到的事件。然后JavaScript脚本相应的创建一个XMLHttpRequest请求,并通过XMLHttpRequest异步的把请求发送到服务器端,同时等待服务器端的响应。服务器端程序在接受客户端所提交的请求后,进行处理并把结果返回。返回的结果被XMLHttpRequest捕获到并返回给JavaScript,再由JavaScript调用相应的DOM进行显示层的控制。如图14-1所示。

14-1 AJAX工作原理图

要让AJAX能够成功运行,需要用户的客户端与服务端两种技术互相配合。客户端采用JavaScript引擎向服务器端发送请求,服务端根据客户端提交的请求返回指定内容。

用户客户端的XMLHttpRequest对象使JavaScript以异步方式访问服务器成为可能。这样当JavaScript函数在后台向服务器提交请求时,用户可以在客户端页面继续其他的工作。

14.1.3 优点与缺点

AJAX技术作为近年来流行的技术,有其技术优点,也有其缺点。优点主要有以下几个方面。

  • AJAX可以提高系统性能,优化用户界面,增强用户浏览体验。

  • AJAX允许在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户的动作,并避免了在网络上发送那些没有改变过的信息。

  • AJAX应用可以仅向服务器发送并取回必需的数据,服务器与客户端之间交换的数据大大减少。

  • AJAX不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

  • AJAX允许将一些服务端的操作移至客户端,减轻了服务器的负担。

其缺点主要有以下几个方面。

  • AJAX可以在不刷新页面的情况下更新页面数据,这可能破坏浏览器【后退】按钮的正常行为。

  • AJAX在客户端执行,因此在开发时需考虑到AJAX的兼容性。

  • AJAX对串流媒体的支持没有FLASHJava Applet好。

  • 由于AJAX的代码存放在页面的HTML语言中,因此项目代码可能因此泄漏。

  • 使用AJAX动态更新页面使得用户难于将某个特定的状态保存到收藏夹中。

  • AJAX的无刷新重载使得页面的变化没有刷新重载整个页面那么明显,所以容易给用户带来困扰。

  • JavaScriptAJAX引擎,不得不考虑JavaScript的兼容性和DeBug等问题。

  • 现有的好多手持设备(例如PDA、手机等)不能很好地支持AJAX

14.2 使用AJAX

AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。它由用户的客户端通过JavaScriptXMLHttpRequest对象向服务器发起请求。再由服务器端根据用户的请求进行处理,完成以后向客户端抛出处理结果,用户浏览器再将服务器处理结果,通过DOM结构呈现在HTML页面上。本节将根据AJAX的请求过程一步步进行讲解。

14.2.1 创建XMLHttpRequest对象

AJAX是通过XMLHttpRequest对象向服务器发起请求的。该对象最初是由MicrosoftInternet ExplorerActiveX对象引入,被称为XMLHTTP。而后Mozilla﹑Netscape﹑Safari和其他浏览器也提供了XMLHttpRequest类,只不过它们创建XMLHttpRequest类的方法不同。

对于MicrosoftInterner Explorer浏览器,其版本不同,创建XMLHttpRequest对象的方法也不一样。通常有以下几种方式。

xmlhttp_request = new ActiveXObject(“Msxml2.XMLHTTP.3.0″); //IE3.0IE4.05.0

xmlhttp_request = new ActiveXObject(“Msxml2.XMLHTTP”); //IE6.0

xmlhttp_request = new ActiveXObject(“Microsoft.XMLHTTP”); //IE7.0及以上

其中,上述第一行是在IE6.0之前的版本创建该对象时所使用的方式。第二行为IE6.0版本创建该对象时所使用的方法。第三行为IE6.0版本以上的浏览器创建对象时所使用方法。为了能够更好的兼容不同版本的Internet Explorer浏览器,在实际应用中常常需要根据浏览器版本创建XMLHttpRequest类。

对于MozillaNetscape﹑Safari等浏览器,创建XMLHttpRequest类的方法如下所示。

xmlhttp_request = new XMLHttpRequest();

如果服务器的响应没有XML mime-type header,某些版本的Mozilla浏览器可能无法正常工作。为了解决这个问题,如果服务器响应的header不是text/xml,可以调用如下所示的其他方法修改该header

xmlhttp_request = new XMLHttpRequest();

xmlhttp_request.overrideMimeType(‘text/xml’);

在实际的应用中,AJAX编写在静态的HTML页面中的Script标签以内,也可以编写在独立的JavaScript文件中,在需要使用AJAX的页面加载该JavaScript文件即可。

第14章样章文档下载

PHP从入门到精通, PHP教程 ,

《PHP从入门到精通》目录

2009年9月6日

应网友要求,特在本博展示《PHP从入门到精通》一书的目录与样章。有需要的朋友可了解一下。

目录
第一篇  概述篇
第1章  PHP概述
1.1  PHP简介
1.1.1  什么是PHP
1.1.2  PHP的特点
1.1.3  PHP的应用范围
1.2  WEB服务器概述
1.2.1  什么是Web服务器
1.2.2  Web服务器原理简介
1.2.3  常用的Web服务器
1.3  HTML简介
1.3.1  什么是HTML
1.3.2  HTML标记类型
1.3.3  HTML元素与标签
1.4  小结
第2章  PHP环境的安装与配置
2.1  PHP环境安装
2.1.1  安装Apache服务器
2.1.2  安装PHP
2.1.3  PHP配置文件php.ini简介
2.1.4  查看配置信息
2.2  整合套件
2.2.1  xampp简介
2.2.2  WAMP
2.2.3  Vertrigo Server
2.2.4  其它套件
2.3  开发工具
2.3.1  EditPlus
2.3.2  NotePad++
2.3.3  Eclipse+PDT
2.3.4  ZendStudio for Eclipse
2.3.5  其它开发工具
2.4  第一个PHP程序——Hello,World!
2.5  小结
第二篇  语法篇
第3章  PHP基础
3.1  数据类型
3.1.1  标量数据类型
3.1.2  复合数据类型
3.1.3  特殊数据类型
3.1.4  数据类型的获取
3.2  数据类型的转换
3.2.1  转换为布尔型
3.2.2  转换为整型
3.2.3  转换为浮点型
3.2.4  转换为字符串
3.2.5  转换为数组
3.2.6  转换为对象和资源
3.3  常量与变量
3.3.1  常量
3.3.2  系统常量
3.3.3  变量
3.3.4  变量的作用域
3.3.5  可变变量
3.4  运算符
3.4.1  赋值运算符
3.4.2  算术运算符
3.4.3  字符串运算符
3.4.4  比较运算符
3.4.5  逻辑运算符
3.4.6  位运算符
3.4.7  其它运算符
3.4.8  运算符的优先级
3.5  表达式
3.5.1  表达式的分类
3.5.2  赋值表达式
3.5.3  算术运算表达式
3.5.4  三目运算表达式
3.5.5  其它表达式
3.6  本章实例
3.7  小结
第4章  PHP流程控制
4.1  流程控制概述
4.2  条件控制语句
4.2.1  if控制语句
4.2.2  switch分支语句
4.3  循环控制语句
4.3.1  while循环语句
4.3.2  do…while循环语句
4.3.3  for循环语句
4.4  跳转语句
4.4.1  break跳转语句
4.4.2  continue跳转语句
4.4.3  return跳转语句
4.5  文件包含
4.5.1  使用inlcude和include_once包含文件
4.5.2  使用require和require_once包含文件
4.6  本章实例
4.7  小结
第5章  PHP函数及操作
5.1  函数的定义与调用
5.1.1  函数的调用
5.1.2  函数的定义
5.1.3  函数间传递参数
5.2  引用
5.2.1  什么是引用
5.2.2  对函数、变量的引用
5.2.3  引用的释放
5.3  PHP常用函数
5.3.1  日期时间函数
5.3.2  数学函数
5.3.3  其它常用函数
5.4  本章实例
5.5  小结
第6章  PHP数组及其操作
6.1  概述
6.1.1  一维数组
6.1.2  多维数组
6.2  数组的常用操作
6.2.1  数组的创建
6.2.2  数组的调用与删除
6.2.3  数组的更新
6.2.4  数组的遍历
6.3  数组的查找
6.3.1  顺序查找
6.3.2  二分法查找
6.3.3  使用array_search查找
6.4  数组的排序
6.4.1  递增排序
6.4.2  递减排序
6.4.3  数组排序
6.5  数组的拆分与合并
6.5.1  数组的拆分
6.5.2  数组的合并
6.6  全局数组
6.6.1  $_SERVER[]全局数组
6.6.2  $_ENV[]全局数组
6.6.3  $_GET[]和$_POST[]全局数组
6.6.4  $_FILES[]全局数组
6.6.5  $_COOKIE[]和$_SESSION[]全局数组
6.6.6  $_REQUEST[]全局数组
6.7  本章实例
6.8  小结
第7章  字符操作与正则表达式
7.1  理解字符类型
7.2  字符的显示与格式化
7.2.1  字符的显示
7.2.2  字符的格式化
7.3  常用操作
7.3.1  字符串重复操作—str_repeat
7.3.2  字符串查找操作–strstr
7.3.3  字符串替换操作—str_replace
7.3.4  字符串分解操作—str_split
7.3.5  字符串分解成单词—str_word_count
7.3.6  字符串的长度—strlen
7.3.7  获取子字符串–substr
7.4  正则表达式
7.4.1  正则表达式简介
7.4.2  常见的正则表达式元字符
7.5  正则表达式的常用操作
7.5.1  进行正则表达式的匹配preg_match
7.5.2  进行全局正则表达式的匹配preg_match_all
7.5.3  获得与模式匹配的数组单元preg_grep
7.5.4  转义正则表达式字符preg_quote
7.5.5  执行正则表达式的搜索与替换preg_replace
7.5.6  通过回调函数执行正则表达式的搜索与替换preg_replace_callback
7.5.7  用正则表达式进行字符串分割preg_split
7.6  本章实例
7.7  小结
第8章  PHP错误、异常处理与调试
8.1  PHP错误类型
8.1.1  语法错误
8.1.2  语义错误
8.1.3  逻辑错误
8.1.4  注释错误
8.1.5  运行时错误
8.2  错误处理
8.2.1  错误级别
8.2.2  php.ini对错误处理的设置
8.2.3  错误处理
8.3  PHP异常
8.3.1  异常处理原理
8.3.2  异常处理
8.3.3  扩展的异常处理类
8.3.4  异常的传递与重掷
8.4  PHP程序的调试
8.4.1  打开错误报告
8.4.2  使用ECHO进行调试
8.4.3  使用DIE进行调试
8.5  使用ZendStudio进行调试
8.5.1  使用Eclipse开发PHP的优点
8.5.2  Eclipse和ZendStudio的安装
8.5.3  Zend Debugger的安装
8.5.4  使用ZendStudio进行调试
8.6  本章实例
8.5  小结
第9章  面向对象的PHP
9.1  概述
9.1.1  什么是面向对象
9.1.2  面向对象的特征
9.2  类和对象
9.2.1  类的结构及声明
9.2.2  属性和方法的定义
9.2.3  使用构造函数
9.2.4  使用析构函数
9.2.5  类的实例化
9.2.6  类的继承
9.3  类的常量
9.4  访问方法和属性
9.4.1  访问修饰符
9.4.2  静态属性
9.4.3  静态方法
9.4.4  魔术方法
9.5  本章实例
9.6  小结
第10章  继承、多态与接口
10.1  继承
10.1.1  什么是继承
10.1.2  PHP中实现继承的方法
10.1.3  重载
10.1.4  用final关键字对继承和重载进行限制
10.2  多态
10.2.1  什么是多态
10.2.2  多态的应用设计
10.3  接口
10.3.1  接口的概念
10.3.2  接口的实现
10.3.3  接口的继承
10.4  小结
第三篇  应用篇
第11章  文件系统与操作
11.1  目录操作
11.1.1  打开目录
11.1.2  关闭目录
11.1.3  读取目录
11.1.4  建立目录
11.1.5  删除目录
11.1.6  改变目录
11.2  文件操作
11.2.1  打开文件
11.2.2  关闭文件
11.2.3  读取文件
11.2.4  写入文件
11.2.5  删除文件
11.2.6  复制文件
11.2.7  移动文件和重命名文件
11.3  文件的上传与下载
11.3.1  开启上传功能
11.3.2  POST方法上传
11.3.3  同时上传多个文件
11.3.4  文件的下载
11.4  本章实例
11.5  小结
第12章  PHP交互
12.1  表单数据的提交方式
12.1.1  GET方法
12.1.2  POST方法
12.1.3  表单提交方式的区别
12.2  获取表单数据
12.2.1  获取文本域的数据
12.2.2  获取单选按钮的数据
12.2.3  获取复选框的数据
12.2.4  获取下拉框或列表框的数据
12.3  常用表单数据的验证
12.3.1  用户名的验证
12.3.2  密码验证
12.3.3  日期验证
12.3.4  E-mail验证
12.4  URL编码与解码
12.4.1  编码urlencode函数
12.4.2  解码urldecode
12.5  本章实例
12.6  小结
第13章  Cookie与Session
13.1  概述
13.1.1  Cookie
13.1.2  Session
13.2  Cookie操作
13.2.1  设置Cookie
13.2.2  访问Cookie
13.2.3  删除Cookie
13.2.4  Cookie全局数组
13.3  Cookie应用
13.3.1  登录页面
13.3.2  验证页面
13.3.3  欢迎页面
13.4  Session操作
13.4.1  开始使用Session
13.4.2  Session检测与注销
13.4.3  Session全局数组
13.5  Session应用
13.5.1  登录页面
13.5.2  验证页面
13.5.3  欢迎页面
13.5.4  注销页面
13.6  本章实例
13.7  小结
第14章  PHP与AJAX
14.1  AJAX概述
14.1.1  什么是AJAX
14.1.2  工作原理
14.1.3  优点与缺点
14.2  使用AJAX
14.2.1  创建XMLHttpRequest对象
14.2.2  向服务器发送请求
14.2.3  处理服务器响应
14.3  使用POST方式的AJAX
14.3.1  POST方式
14.3.2  POST实例
14.4  第一个AJAX程序—-Hello, Ajax!
14.4.1  浏览器页面发送请求与处理响应
14.4.2  服务器响应
14.5  本章实例
14.5.1  读取服务器文本文件
14.5.2  三级联动下拉框
14.6  小结
第15章  PHP图像处理
15.1  图像库简介
15.1.1  打开GD库
15.1.2  GD库支持的图像格式
15.2  基本的图像处理
15.2.1  创建图像
15.2.2  设置颜色
15.2.3  生成图像与销毁图像
15.2.4  绘制点线
15.2.5  绘制并填充几何图形
15.2.6  输出文字
15.3  图像处理实例
15.3.1  生成验证码图片
15.3.2  生成缩略图
15.4  本章实例
15.5  小结
第16章  PHP邮件处理
16.1  PHP邮件发送配置
16.1.1  SMTP功能的配置
16.1.2  安装SMTP服务器
16.2  使用mail函数发送邮件
16.2.1  mail函数简介
16.2.2  发送HTML格式的邮件
16.2.3  发送带附件的邮件
16.3  本章实例
16.4  小结
第四篇  数据库篇
第17章  MYSQL数据库的安装与操作
17.1  SQL语言概述
17.2  MySQL的安装与配置
17.2.1  下载
17.2.2  安装和配置
17.3      MySQL的启动与停止
17.3.1  启动
17.3.2  停止
17.4  管理数据库
17.4.1  MySQL的登录与退出
17.4.2  创建数据库
17.4.3  删除数据库
17.4.4  选择数据库
17.4.5  备份与恢复
17.5  操作数据表
17.5.1  创建表
17.5.2  修改表
17.5.3  删除表
17.6  数据类型与视图
17.6.1  MYSQL数据类型
17.6.2  视图
17.7  操作数据
17.7.1  查询语句
17.7.2  插入语句
17.7.3  更新语句
17.7.4  删除语句
17.8  使用phpmyadmin管理mysql数据库
17.8.1  phpmyadmin概述
17.8.2  安装与配置
17.8.3  数据库操作
17.8.4  数据表操作
17.8.5  数据增删改
17.8.6  数据查询
17.8.7  数据的导入导出
17.9  小结
第18章  PHP操作数据库
18.1  PHP操作MySQL数据库
18.1.1  连接MySQL数据库
18.1.2  断开与MySQL的连接
18.1.3  选择和使用MySQL数据库
18.1.4  执行MySQL指令
18.1.5  分析结果集
18.2  管理MYSQL数据库中的数据
18.2.1  添加数据
18.2.2  更新数据
18.2.3  删除数据
18.3  获取数据库信息
18.3.1  获取数据库的信息
18.3.2  获取数据表的信息
18.3.3  获取数据表中列的信息
18.4  PHP操作SQL Server数据库
18.4.1  连接和关闭SQL Server数据库
18.4.2  执行SQL语句
18.4.3  获取结果集
18.5  PHP操作Access数据库
18.5.1  连接和关闭Access
18.5.2  执行SQL语句
18.5.3  获取结果集
18.6  本章实例
18.7  小结
第19章  PHP与XML
19.1  XML简介
19.2  使用SimpleXML进行操作
19.2.1  创建SimpleXML对象
19.2.2  读取对象中的XML数据
19.2.3  XML数据的修改
19.2.4  XML数据的存储
19.3  动态创建XML文档
19.4  小结
第五篇  扩展篇
第20章  MVC模式与PHP开发框架
20.1  MVC概述
20.1.1  何谓MVC
20.1.2  MVC的优点
20.1.3  MVC的不足
20.2  PHP框架——Zend Framework
20.2.1  Zend Framework的特性
20.2.2  Zend Framework的目录结构
20.2.3  Zend Framework的安装
20.2.4  引导文件index.php
20.2.5  页面组织
20.2.6  控制器类Controllers
20.2.7  视图文件
20.2.8  布局
20.3  小结
第21章  PHP面向对象高级编程和设计模式
21.1  重载
21.1.1  属性和方法的重载
21.1.2  使用数组语法访问的重载
21.2  设计模式
21.2.1  设计模式简介
21.2.2  单例模式
21.2.3  策略模式
21.2.4  工厂模式
21.2.5  观察者模式
21.2.6  适配器模式
21.3  小结
第22章  PHP缓存与静态化
22.1  为何使用静态机制
22.2  缓存机制及其应用
22.2.1  缓存机制
22.2.2  缓存机制的应用
22.3  静态机制及实现
22.3.1  由模板生成静态页面
22.3.2  由数据库生成静态页面
22.4  小结
第23章  PEAR与PECL
23.1  概述
23.1.1  PEAR简介
23.1.2  PECL简介
23.2  PEAR的安装与使用
23.2.1  PEAR的安装
23.2.2  查看已安装的包
23.2.3  查看PEAR包的详细信息
23.2.4  PEAR包的安装
22.2.5  PEAR包的升级
22.2.6  PEAR包的删除
22.2.7  PEAR包的使用
23.3  PECL扩展库
23.3.1  下载安装PECL扩展库
23.3.2  使用PEAR编译共享PECL扩展库
23.4  小结
第六篇  实例篇
第24章  留言板
24.1  留言板简介
24.2  数据库设计
24.3  项目实施
24.3.1  系统配置文件
24.3.2  数据库连接
24.3.3  添加留言模块
24.3.4  查看留言模块
24.3.5  显示留言详细内容
24.3.6  登录模块
24.3.7  回复留言模块
24.3.8  删除留言模块
24.3.9  审核留言模块
24.5  小结
第25章  投票系统
25.1  投票系统简介
25.2  数据库设计
25.3  项目实施
25.3.1  系统配置文件
25.3.2  数据库操作类
25.4  投票模块
25.4.1  投票页面
25.4.2  投票处理
25.4.3  投票统计
25. 5  登录模块
25.5.1  登录页面
25.5.2  登录处理
25.5.3  退出模块
25.6  投票主题模块
25.6.1  添加主题
25.6.2  修改投票主题
25.6.3  删除投票主题
25. 7  参数配置模块
25.7.1  添加投票选项
25.7.2  修改投票选项
25.7.3  删除投票选项
25.8  小结
第26章  基于Zend Framework的内容管理系统
26.1  内容管理系统简介
26.2  数据库设计
26.3  项目实施
26.3.1  系统配置
26.3.2  引导文件bootstrap.php
26.3.3  系统初始化
26.3.4  系统默认布局
26.3.5  系统异常处理
26.3.6  系统参数配置
26.4  用户模块
26.4.1  系统开关
26.4.2  注册
26.4.3  登录
26.4.4  退出
26.5  文章模块
26.5.1  管理控制器初始化
26.5.2  添加文章
26.5.3  管理文章
26.5.4  修改文章
26.5.5  审核文章
26.5.6  删除文章
26.5.7  显示文章列表
26.5.8  显示文章内容
26.6  文章类别管理
26.6.1  新增类别
26.6.2  修改类别
26.6.3  删除类别
26.7  文章模板管理
26.7.1  新增模板
26.7.2  修改模板
26.7.3  删除模板
26.5  小结

PHP从入门到精通, PHP教程 ,