﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-bbming-随笔分类-PHP技术</title><link>http://www.cnitblog.com/bbming/category/4387.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 03 Oct 2011 03:42:33 GMT</lastBuildDate><pubDate>Mon, 03 Oct 2011 03:42:33 GMT</pubDate><ttl>60</ttl><item><title>PHP初学者头疼问题总结</title><link>http://www.cnitblog.com/bbming/archive/2006/12/06/20149.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Wed, 06 Dec 2006 12:43:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/06/20149.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20149.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/06/20149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20149.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20149.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Tahoma,宋体">【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的，所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到 <br />当然也可以修改自动全局变量为开(php.ini改为register_globals = On)；考虑到兼容性，还是强迫自己熟悉新的写法比较好。 <br />【2】Win32下apache2 用get方法传递中文参数会出错 <br />test.php?a=你好&amp;b=你也好 <br />传递参数是会导致一个内部错误 <br />解决办法:"test.php?a=".urlencode(你好)."&amp;b=".urlencode(你也好) <br />............. <br /><br />【3】win32下的session不能正常工作 <br />php.ini默认的session.save_path = /tmp <br />这显然是linux下的配置，win32下php无法读写session文件导致session无法使用 <br />把它改成一个绝对路径就可以了，例如session.save_path = c:windows emp <br />【4】显示错误信息 <br />当php.ini的display_errors = On并且error_reporting = E_ALL时，将显示所有的错误和提示，调试的时候最好打开以便纠错，如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示，解决办法是探测或者屏蔽 <br />例如显示$foo，可以if(isset($foo)) echo $foo 或者echo @$foo <br />【5】Win32下mail()不能发送电子邮件 <br />在linux下配置好的sendmail可以发送，在win32下需要调用smtp服务器来发送电子邮件 <br />修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到) <br />php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器 <br />【6】初装的mysql如果没有设置密码，应该使用 <br />update mysql.user set password="yourpassword" where user="root" <br />修改密码 <br />【7】header already sent <br />这个错误通常会在你使用HEADER的时候出现，他可能是几种原因：1，你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。！ <br />【8】更改php.ini后没有变化 <br />重新启动web server，比如IIS，Apache等等，然后才会应用最新的设置 <br />【9】php在2003上面安装（ISAPI的安装方法恳请高手指教） <br />PHP4的php4isapi.dll好像和2003有些冲突，只能用CGI模式安装 <br />步骤一，先<a href="http://www.php.net/" target="_blank"><font color="#3a4b69">www.php.net</font></a> 下在一个安装程序，我是装的是：php-4.2.3-installer.exe，你也可以去找最新的版本，在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了，并能够访问。安装好以后，在默认网站--&gt;应用程序配置 <br />步骤二：点击 web服务扩展 --&gt;新建web服务扩展. <br />步骤三： 扩展名--&gt;php,然后添加 <br />步骤四：找到php.exe的路径添加上去。 <br />步骤五： 确定就可以了！ <br />步骤六： 选择php的服务扩展，然后点击允许。 <br />【10】 <br />有时候sql语句不起作用，对数据库操作失败 <br />最简便的调试方法，echo那句sql，看看变量的值能得到不 <br />【11】include和require的区别 <br />两者没有太大的区别，如果要包含的文件不存在，include提示notice，然后继续执行下面的语句，require提示致命错误并且退出 <br />据我测试，win32平台下它们都是先包含后执行，所以被包含文件里最好不要再有include或require语句，这样会造成目录混乱。或许*nux下情况不同，暂时还没测试 <br />如果一个文件不想被包含多次可以使用include_once或require_once## 读取，写入文档数据 <br />function r($file_name) { <br />$filenum=@fopen($file_name,"r"); <br />@flock($filenum,LOCK_SH); <br />$file_data=@fread($filenum,filesize($file_name)); <br />@fclose($filenum); <br />return $file_data; <br />} <br />function w($file_name,$data,$method="w"){ <br />$filenum=@fopen($file_name,$method); <br />flock($filenum,LOCK_EX); <br />$file_data=fwrite($filenum,$data); <br />fclose($filenum); <br />return $file_data; <br />} <br /><br />【12】isset()和empty()的区别 <br />两者都是测试变量用的 <br />但是isset()是测试变量是否被赋值，而empty()是测试一个已经被赋值的变量是否为空 <br />如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示 <br />如果一个变量被赋空值，$foo=""或者$foo=0或者 $foo=false,那么empty($foo)返回真，isset($foo)也返回真，就是说赋空值不会注销一个变量。 <br />要注销一个变量，可以用 unset($foo)或者$foo=NULL <br />【13】mysql查询语句包含有关键字 <br />php查询mysql的时候，有时候mysql表名或者列名会有关键字 <br />这时候查询会有错误。例如表名是order,查询时候会出错 <br />简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别 <br />例如select * from `order` <br />【14】通过HTTP协议一次上传多个文件的方法 <br />有两个思路，是同一个方法的两种实现。具体程序还需自己去设计 <br />1,在form中设置多个文件输入框，用数组命名他们的名字，如下： <br />&lt;form action="" method=post&gt; <br />&lt;input type=file name=usefile[]&gt; <br />&lt;input type=file name=usefile[]&gt; <br />&lt;input type=file name=usefile[]&gt; <br />&lt;/form&gt; <br />这样，在服务器端做以下测试 <br />echo "&lt;pre&gt;"; <br />print_r($_FILES); <br />echo "&lt;/pre&gt;"; <br /><br />1,在form中设置多个文件输入框，但名字不同，如下： <br />&lt;form action="" method=post&gt; <br />&lt;input type=file name=usefile_a&gt; <br />&lt;input type=file name=usefile_b&gt; <br />&lt;input type=file name=usefile_c&gt; <br />&lt;/form&gt; <br />在服务器端做同样测试： <br />echo "&lt;pre&gt;"; <br />print_r($_FILES); <br />echo "&lt;/pre&gt;";</font>
		</p>
<img src ="http://www.cnitblog.com/bbming/aggbug/20149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-06 20:43 <a href="http://www.cnitblog.com/bbming/archive/2006/12/06/20149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>06-12-6 PHP 中的一些经验积累</title><link>http://www.cnitblog.com/bbming/archive/2006/12/06/20148.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Wed, 06 Dec 2006 12:35:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/06/20148.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20148.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/06/20148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20148.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20148.html</trackback:ping><description><![CDATA[
		<center>
				<h1>PHP 中的一些经验积累</h1>
		</center>
		<table cellspacing="0" cellpadding="1" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle">
										<hr size="1" />
								</td>
						</tr>
						<tr>
								<td>作者:snowai 来源:PHPX.com</td>
						</tr>
						<tr>
								<td> </td>
						</tr>
						<tr>
								<td style="FONT-SIZE: 14px; LINE-HEIGHT: 160%; WORD-WRAP: break-word">
										<p>最近刚刚完成手中的项目，比较闲。来这儿转转，把积累的一些技巧分享给大家！ <br />1、关于PHP重定向 <br />方法一：header("Location: index.php"); <br />方法二：echo "&lt;script&gt;window.location =\"$PHP_SELF\";&lt;/script&gt;"; <br />方法三：echo "&lt;META HTTP-EQUIV="Refresh" CONTENT="0; URL=index.php"&gt;"; <br /><br />2、获取访问者浏览器 <br /></p>
										<p class="php">function browse_infor() <br />{ <br />$browser="";$browserver=""; <br />$Browsers =array("Lynx","MOSAIC","AOL","Opera","JAVA","MacWeb","WebExplorer","OmniWeb"); <br />$Agent = $GLOBALS["HTTP_USER_AGENT"]; <br />for ($i=0; $i&lt;=7; $i++) <br />{ <br />if (strpos($Agent,$Browsers[$i])) <br />{ <br />$browser = $Browsers[$i]; <br />$browserver =""; <br />} <br />} <br />if (ereg("Mozilla",$Agent) &amp;&amp; !ereg("MSIE",$Agent)) <br />{ <br />$temp =explode("(", $Agent); $Part=$temp[0]; <br />$temp =explode("/", $Part); $browserver=$temp[1]; <br />$temp =explode(" ",$browserver); $browserver=$temp[0]; <br />$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver); <br />$browserver = " $browserver"; <br />$browser = "Netscape Navigator"; <br />} <br />if (ereg("Mozilla",$Agent) &amp;&amp; ereg("Opera",$Agent)) <br />{ <br />$temp =explode("(", $Agent); $Part=$temp[1]; <br />$temp =explode(")", $Part); $browserver=$temp[1]; <br />$temp =explode(" ",$browserver);$browserver=$temp[2]; <br />$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver); <br />$browserver = " $browserver"; <br />$browser = "Opera"; <br />} <br />if (ereg("Mozilla",$Agent) &amp;&amp; ereg("MSIE",$Agent)) <br />{ <br />$temp = explode("(", $Agent); $Part=$temp[1]; <br />$temp = explode(";",$Part); $Part=$temp[1]; <br />$temp = explode(" ",$Part);$browserver=$temp[2]; <br />$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver); <br />$browserver = " $browserver"; <br />$browser = "Internet Explorer"; <br />} <br />if ($browser!="") <br />{ <br />$browseinfo = "$browser$browserver"; <br />} <br />else <br />{ <br />$browseinfo = "Unknown"; <br />} <br />return $browseinfo; <br />} <br />//调用方法$browser=browseinfo() ;直接返回结果 </p>
										<br />
										<br />3、获取访问者操作系统 <br /><p class="php">function osinfo() { <br />$os=""; <br />$Agent = $GLOBALS["HTTP_USER_AGENT"]; <br />if (eregi('win',$Agent) &amp;&amp; strpos($Agent, '95')) { <br />$os="Windows 95"; <br />} <br />elseif (eregi('win 9x',$Agent) &amp;&amp; strpos($Agent, '4.90')) { <br />$os="Windows ME"; <br />} <br />elseif (eregi('win',$Agent) &amp;&amp; ereg('98',$Agent)) { <br />$os="Windows 98"; <br />} <br />elseif (eregi('win',$Agent) &amp;&amp; eregi('nt 5\.0',$Agent)) { <br />$os="Windows 2000"; <br />} <br />elseif (eregi('win',$Agent) &amp;&amp; eregi('nt',$Agent)) { <br />$os="Windows NT"; <br />} <br />elseif (eregi('win',$Agent) &amp;&amp; eregi('nt 5\.1',$Agent)) { <br />$os="Windows XP"; <br />} <br />elseif (eregi('win',$Agent) &amp;&amp; ereg('32',$Agent)) { <br />$os="Windows 32"; <br />} <br />elseif (eregi('linux',$Agent)) { <br />$os="Linux"; <br />} <br />elseif (eregi('unix',$Agent)) { <br />$os="Unix"; <br />} <br />elseif (eregi('sun',$Agent) &amp;&amp; eregi('os',$Agent)) { <br />$os="SunOS"; <br />} <br />elseif (eregi('ibm',$Agent) &amp;&amp; eregi('os',$Agent)) { <br />$os="IBM OS/2"; <br />} <br />elseif (eregi('Mac',$Agent) &amp;&amp; eregi('PC',$Agent)) { <br />$os="Macintosh"; <br />} <br />elseif (eregi('PowerPC',$Agent)) { <br />$os="PowerPC"; <br />} <br />elseif (eregi('AIX',$Agent)) { <br />$os="AIX"; <br />} <br />elseif (eregi('HPUX',$Agent)) { <br />$os="HPUX"; <br />} <br />elseif (eregi('NetBSD',$Agent)) { <br />$os="NetBSD"; <br />} <br />elseif (eregi('BSD',$Agent)) { <br />$os="BSD"; <br />} <br />elseif (ereg('OSF1',$Agent)) { <br />$os="OSF1"; <br />} <br />elseif (ereg('IRIX',$Agent)) { <br />$os="IRIX"; <br />} <br />elseif (eregi('FreeBSD',$Agent)) { <br />$os="FreeBSD"; <br />} <br />if ($os=='') $os = "Unknown"; <br />return $os; <br />} <br />//调用方法$os=os_infor() ; </p><br /><br />4、文件格式类 <br /><p class="php">$mime_types = array( <br />'gif' =&gt; 'image/gif', <br />'jpg' =&gt; 'image/jpeg', <br />'jpeg' =&gt; 'image/jpeg', <br />'jpe' =&gt; 'image/jpeg', <br />'bmp' =&gt; 'image/bmp', <br />'png' =&gt; 'image/png', <br />'tif' =&gt; 'image/tiff', <br />'tiff' =&gt; 'image/tiff', <br />'pict' =&gt; 'image/x-pict', <br />'pic' =&gt; 'image/x-pict', <br />'pct' =&gt; 'image/x-pict', <br />'tif' =&gt; 'image/tiff', <br />'tiff' =&gt; 'image/tiff', <br />'psd' =&gt; 'image/x-photoshop', <br /><br />'swf' =&gt; 'application/x-shockwave-flash', <br />'js' =&gt; 'application/x-javascript', <br />'pdf' =&gt; 'application/pdf', <br />'ps' =&gt; 'application/postscript', <br />'eps' =&gt; 'application/postscript', <br />'ai' =&gt; 'application/postscript', <br />'wmf' =&gt; 'application/x-msmetafile', <br /><br />'css' =&gt; 'text/css', <br />'htm' =&gt; 'text/html', <br />'html' =&gt; 'text/html', <br />'txt' =&gt; 'text/plain', <br />'xml' =&gt; 'text/xml', <br />'wml' =&gt; 'text/wml', <br />'wbmp' =&gt; 'image/vnd.wap.wbmp', <br /><br />'mid' =&gt; 'audio/midi', <br />'wav' =&gt; 'audio/wav', <br />'mp3' =&gt; 'audio/mpeg', <br />'mp2' =&gt; 'audio/mpeg', <br /><br />'avi' =&gt; 'video/x-msvideo', <br />'mpeg' =&gt; 'video/mpeg', <br />'mpg' =&gt; 'video/mpeg', <br />'qt' =&gt; 'video/quicktime', <br />'mov' =&gt; 'video/quicktime', <br /><br />'lha' =&gt; 'application/x-lha', <br />'lzh' =&gt; 'application/x-lha', <br />'z' =&gt; 'application/x-compress', <br />'gtar' =&gt; 'application/x-gtar', <br />'gz' =&gt; 'application/x-gzip', <br />'gzip' =&gt; 'application/x-gzip', <br />'tgz' =&gt; 'application/x-gzip', <br />'tar' =&gt; 'application/x-tar', <br />'bz2' =&gt; 'application/bzip2', <br />'zip' =&gt; 'application/zip', <br />'arj' =&gt; 'application/x-arj', <br />'rar' =&gt; 'application/x-rar-compressed', <br /><br />'hqx' =&gt; 'application/mac-binhex40', <br />'sit' =&gt; 'application/x-stuffit', <br />'bin' =&gt; 'application/x-macbinary', <br /><br />'uu' =&gt; 'text/x-uuencode', <br />'uue' =&gt; 'text/x-uuencode', <br /><br />'latex'=&gt; 'application/x-latex', <br />'ltx' =&gt; 'application/x-latex', <br />'tcl' =&gt; 'application/x-tcl', <br /><br />'pgp' =&gt; 'application/pgp', <br />'asc' =&gt; 'application/pgp', <br />'exe' =&gt; 'application/x-msdownload', <br />'doc' =&gt; 'application/msword', <br />'rtf' =&gt; 'application/rtf', <br />'xls' =&gt; 'application/vnd.ms-excel', <br />'ppt' =&gt; 'application/vnd.ms-powerpoint', <br />'mdb' =&gt; 'application/x-msaccess', <br />'wri' =&gt; 'application/x-mswrite', <br />); </p><br />5、php生成excel文档 
<p class="php"><br />&lt;? <br />header("Content-type:application/vnd.ms-excel"); <br />header("Content-Disposition:filename=test.xls"); <br />echo "test1\t"; <br />echo "test2\t\n"; <br />echo "test1\t"; <br />echo "test2\t\n"; <br />echo "test1\t"; <br />echo "test2\t\n"; <br />echo "test1\t"; <br />echo "test2\t\n"; <br />echo "test1\t"; <br />echo "test2\t\n"; <br />echo "test1\t"; <br />echo "test2\t\n"; <br />?&gt; <br />//改动相应文件头就可以输出.doc .xls等文件格式了 </p><br />6、时间比较问题 <br />举一个简单例子说明:比如一个论坛对当天发表的贴子用new图片标记一下。 <br />方法一： <br />//$db-&gt;rows[$i][date]中为数据库中datetime字段值. <br />$today=time(); <br />$theDay=date("Y-m-d H:i:s",$today-24*3600); <br />$newTag=$db-&gt;rows[$i][date]&gt;=$theDay?"<img src="http://www.phpe.net/image/newinfor.gif" />":""; <br />方法二： <br />$newTag=$db-&gt;rows[$i][date]&gt;=date("Y-m-d 00:00:00")?"<img src="http://www.phpe.net/image/newinfor.gif" />":""; </td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/bbming/aggbug/20148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-06 20:35 <a href="http://www.cnitblog.com/bbming/archive/2006/12/06/20148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MVC模式的PHP实现</title><link>http://www.cnitblog.com/bbming/archive/2006/12/06/20147.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Wed, 06 Dec 2006 12:13:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/06/20147.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20147.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/06/20147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20147.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20147.html</trackback:ping><description><![CDATA[
		<center>
				<h1>MVC模式的PHP实现</h1>
		</center>
		<table cellspacing="0" cellpadding="1" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle">
										<hr size="1" />
								</td>
						</tr>
						<tr>
								<td>作者:Harry Fuecks 翻译：Easy Chen </td>
						</tr>
						<tr>
								<td> </td>
						</tr>
						<tr>
								<td style="FONT-SIZE: 14px; LINE-HEIGHT: 160%; WORD-WRAP: break-word">
										<blockquote>MVC模式在网站架构中十分常见。它允许我们建立一个三层结构的应用程式，从代码中分离出有用的层，帮助设计师和开发者协同工作以及提高我们维护和扩展既有程式的能力。</blockquote>
										<br />
										<b>视图（View）</b>
										<br />
										<br />“视图”主要指我们送到Web浏览器的最终结果——比如我们的脚本生成的HTML。当说到视图时，很多人想到的是模版，但是把模板方案叫做视图的正确性是值得怀疑的。<br /><br />对视图来说，最重要的事情可能是它应该是“自我意识（self aware）”的，视图被渲染（render）时，视图的元素能意识到自己在更大框架中的角色。<br /><br />以XML为例，可以说XML在被解析时，DOM API有着这样的认知——一个DOM树里的节点知道它在哪里和它包含了什么。 （当一个XML文档中的节点用SAX解析时只有当解析到该节点时它才有意义。）<br /><br />绝大多数模板方案使用简单的过程语言和这样的模板标签：<br /><br /><pre class="php">&lt;p&gt;{some_text}&lt;/p&gt; 
&lt;p&gt;{some_more_text}&lt;/p&gt;</pre><br /><br />它们在文档中没有意义，它们代表的意义只是PHP将用其他的东西来替换它。<br /><br />如果你同意这种对视图的松散描述，你也就会同意绝大多数模板方案并没有有效的分离视图和模型。模板标签将被替换成什么存放在模型中。<br /><br />在你实现视图时问自己几个问题：“全体视图的替换容易吗？”“实现一个新视图要多久？” “能很容易的替换视图的描述语言吗？（比如在同一个视图中用SOAP文档替换HTML文档）”<br /><br /><br /><b>模型（Model）</b><br /><br />模型代表了程序逻辑。（在企业级程序中经常称为业务层（business layer））<br /><br />总的来说，模型的任务是把原有数据转换成包含某些意义的数据，这些数据将被视图所显示。通常，模型将封装数据查询，可能通过一些抽象数据类（数据访问层）来实现查询。举例说，你希望计算英国年度降雨量（只是为了给你自己找个好点的度假地），模型将接收十年中每天的降雨量，计算出平均值，再传递给视图。<br /><br /><br /><b>控制器（controller）</b><br /><br />简单的说控制器是Web应用中进入的HTTP请求最先调用的一部分。它检查收到的请求，比如一些GET变量，做出合适的反馈。在写出你的第一个控制器之前，你很难开始编写其他的PHP代码。最常见的用法是index.php中像switch语句的结构：<br /><br /><pre class="php">&lt;?php 
switch ($_GET['viewpage']) { 
    case "news": 
        $page=new NewsRenderer; 
    break; 
    case "links": 
        $page=new LinksRenderer; 
    break; 
    default: 
        $page=new HomePageRenderer; 
    break; 
} 
$page-&gt;display(); 
?&gt;</pre><br /><br />这段代码混用了面向过程和对象的代码，但是对于小的站点来说，这通常是最好的选择。虽然上边的代码还可以优化。<br /><br />控制器实际上是用来触发模型的数据和视图元素之间的绑定的控件。<br /><br /><br /><b>例子</b><br /><br />这里是一个使用MVC模式的简单例子。<br />首先我们需要一个数据库访问类，它是一个普通类。<br /><br /><pre class="php">&lt;?php 
/** 
*  A simple class for querying MySQL 
*/ 
class DataAccess { 
    /** 
    * Private 
    * $db stores a database resource 
    */ 
    var $db; 
    /** 
    * Private 
    * $query stores a query resource 
    */ 
    var $query; // Query resource 

    //! A constructor. 
    /** 
    * Constucts a new DataAccess object 
    * @param $host string hostname for dbserver 
    * @param $user string dbserver user 
    * @param $pass string dbserver user password 
    * @param $db string database name 
    */ 
    function DataAccess ($host,$user,$pass,$db) { 
        $this-&gt;db=mysql_pconnect($host,$user,$pass); 
        mysql_select_db($db,$this-&gt;db); 
    } 

    //! An accessor 
    /** 
    * Fetches a query resources and stores it in a local member 
    * @param $sql string the database query to run 
    * @return void 
    */ 
    function fetch($sql) { 
        $this-&gt;query=mysql_unbuffered_query($sql,$this-&gt;db); // Perform query here 
    } 

    //! An accessor 
    /** 
    * Returns an associative array of a query row 
    * @return mixed 
    */ 
    function getRow () { 
        if ( $row=mysql_fetch_array($this-&gt;query,MYSQL_ASSOC) ) 
            return $row; 
        else 
            return false; 
    } 
} 
?&gt;</pre><br /><br />在它上边放上模型。<br /><br /><pre class="php">&lt;?php 
/** 
*  Fetches "products" from the database 
*/ 
class ProductModel { 
    /** 
    * Private 
    * $dao an instance of the DataAccess class 
    */ 
    var $dao; 

    //! A constructor. 
    /** 
    * Constucts a new ProductModel object 
    * @param $dbobject an instance of the DataAccess class 
    */ 
    function ProductModel (&amp;$dao) { 
        $this-&gt;dao=&amp; $dao; 
    } 

    //! A manipulator 
    /** 
    * Tells the $dboject to store this query as a resource 
    * @param $start the row to start from 
    * @param $rows the number of rows to fetch 
    * @return void 
    */ 
    function listProducts($start=1,$rows=50) { 
        $this-&gt;dao-&gt;fetch("SELECT * FROM products LIMIT ".$start.", ".$rows); 
    } 

    //! A manipulator 
    /** 
    * Tells the $dboject to store this query as a resource 
    * @param $id a primary key for a row 
    * @return void 
    */ 
    function listProduct($id) { 
        $this-&gt;dao-&gt;fetch("SELECT * FROM products WHERE PRODUCTID='".$id."'"); 
    } 

    //! A manipulator 
    /** 
    * Fetches a product as an associative array from the $dbobject 
    * @return mixed 
    */ 
    function getProduct() { 
        if ( $product=$this-&gt;dao-&gt;getRow() ) 
            return $product; 
        else 
            return false; 
    } 
} 
?&gt;</pre><br /><br />有一点要注意的是，在模型和数据访问类之间，它们的交互从不会多于一行——没有多行被传送，那样会很快使程式慢下来。同样的程式对于使用模式的类，它只需要在内存中保留一行（Row）——其他的交给已保存的查询资源（query resource）——换句话说，我们让MYSQL替我们保持结果。<br /><br />接下来是视图——我去掉了HTML以节省空间，你可以查看这篇文章的完整代码。<br /><br /><pre class="php">&lt;?php 
/** 
*  Binds product data to HTML rendering 
*/ 
class ProductView { 
    /** 
    * Private 
    * $model an instance of the ProductModel class 
    */ 
    var $model; 

    /** 
    * Private 
    * $output rendered HTML is stored here for display 
    */ 
    var $output; 

    //! A constructor. 
    /** 
    * Constucts a new ProductView object 
    * @param $model an instance of the ProductModel class 
    */ 
    function ProductView (&amp;$model) { 
        $this-&gt;model=&amp; $model; 
    } 

    //! A manipulator 
    /** 
    * Builds the top of an HTML page 
    * @return void 
    */ 
    function header () { 

    } 

    //! A manipulator 
    /** 
    * Builds the bottom of an HTML page 
    * @return void 
    */ 
    function footer () { 

    } 

    //! A manipulator 
    /** 
    * Displays a single product 
    * @return void 
    */ 
    function productItem($id=1) { 
        $this-&gt;model-&gt;listProduct($id); 
        while ( $product=$this-&gt;model-&gt;getProduct() ) { 
             // Bind data to HTML 
        } 
    } 

    //! A manipulator 
    /** 
    * Builds a product table 
    * @return void 
    */ 
    function productTable($rownum=1) { 
        $rowsperpage='20'; 
        $this-&gt;model-&gt;listProducts($rownum,$rowsperpage); 
        while ( $product=$this-&gt;model-&gt;getProduct() ) { 
             // Bind data to HTML 
        } 
    } 

    //! An accessor 
    /** 
    * Returns the rendered HTML 
    * @return string 
    */ 
    function display () { 
        return $this-&gt;output; 
    } 
} 
?&gt;</pre><br /><br />最后是控制器，我们将把视图实现为一个子类。<br /><br /><pre class="php">&lt;?php 
/** 
*  Controls the application 
*/ 
class ProductController extends ProductView { 

    //! A constructor. 
    /** 
    * Constucts a new ProductController object 
    * @param $model an instance of the ProductModel class 
    * @param $getvars the incoming HTTP GET method variables 
    */ 
    function ProductController (&amp;$model,$getvars=null) { 
        ProductView::ProductView($model); 
        $this-&gt;header(); 
        switch ( $getvars['view'] ) { 
            case "product": 
                $this-&gt;productItem($getvars['id']); 
                break; 
            default: 
                if ( empty ($getvars['rownum']) ) { 
                    $this-&gt;productTable(); 
                } else { 
                    $this-&gt;productTable($getvars['rownum']); 
                } 
                break; 
        } 
        $this-&gt;footer(); 
    } 
} 
?&gt;</pre><br /><br /><a href="/uploads/images/article_400x500_0561.gif" target="_blank"><img alt="Click to fullsize" hspace="10" src="/uploads/images/article_400x500_0561.gif" onload="javascript:if(this.width&gt;500) this.width=500" align="center" vspace="10" border="0" /></a><br /><br /><br />注意这不是实现MVC的唯一方式——比如你可以用控制器实现模型同时整合视图。这只是演示模式的一种方法。<br /><br />我们的index.php 文件看起来像这样：<br /><br /><pre class="php">&lt;?php 
require_once('lib/DataAccess.php'); 
require_once('lib/ProductModel.php'); 
require_once('lib/ProductView.php'); 
require_once('lib/ProductController.php'); 

$dao=&amp; new DataAccess ('localhost','user','pass','dbname'); 
$productModel=&amp; new ProductModel($dao); 
$productController=&amp; new ProductController($productModel,$_GET); 
echo $productController-&gt;display(); 
?&gt;</pre><br /><br />漂亮而简单。<br /><br />我们有一些使用控制器的技巧，在PHP中你可以这样做：<br /><br /><pre class="php">$this-&gt;{$_GET['method']}($_GET['param']); </pre><br /><br />一个建议是你最好定义程序URL的名字空间形式（namespace），那样它会比较规范比如：<br /><br /><pre class="php">"index.php?class=ProductView&amp;method=productItem&amp;id=4"</pre><br /><br />通过它我们可以这样处理我们的控制器：<br /><br /><pre class="php">$view=new $_GET['class']; 
$view-&gt;{$_GET['method']($_GET['id']);</pre><br /><br />有时候，建立控制器是件很困难的事情，比如当你在开发速度和适应性之间权衡时。一个获得灵感的好去处是Apache group 的Java Struts，它的控制器完全是由XML文档定义的。 <br /><br /><a href="/uploads/attach/article_phpMVC_0647.zip" target="_blank"><b>相关附件：</b>本文完整实例</a><br /><br /><b>本文英文原版地址：</b><a href="http://www.phppatterns.com/index.php/article/articleview/11/">http://www.phppatterns.com/index.php/article/articleview/11/</a></td>
						</tr>
				</tbody>
		</table>
		<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
		</script>
		<script type="text/javascript"><![CDATA[
_uacct = "UA-156767-2";
urchinTracker();
]]&gt;</script>
		<script language="JavaScript" src="/js/pphlogger.js" type="text/javascript">
		</script>
		<script language="JavaScript" src="/site_online.php?hide=1&amp;file=article_show.php" type="text/javascript">
		</script>
<img src ="http://www.cnitblog.com/bbming/aggbug/20147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-06 20:13 <a href="http://www.cnitblog.com/bbming/archive/2006/12/06/20147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>