当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP和MySQL开发的8个技巧

PHP
利用discuz实现PHP大文件上传应用实例代码
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
php在字符串中查找另一个字符串
php下HTTP Response中的Chunked编码实现方法
PHP实现定时生成HTML网站首页实例代码
PHP下一个非常全面获取图象信息的函数
PHP strtr() 函数使用说明
php 删除无限级目录与文件代码共享
php AJAX实例根据邮编自动完成地址信息
php miniBB中文乱码问题解决方法
cmd下运行php脚本
PHP 遍历XP文件夹下所有文件
php 移除数组重复元素的一点说明
discuz论坛 用户登录 后台程序代码
Optimizer与Debugger兼容性问题的解决方法
Zend Studio 无法启动的问题解决方法
php 页面执行时间计算代码
php smarty的预保留变量总结
php获取网页内容方法总结
php读取msn上的用户信息类

PHP和MySQL开发的8个技巧


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 208 ::
收藏到网摘: n/a

LAMP架构的网站,我以前注重的多是安装/配置方面的,讲述开发的相对较少,因为自己从事开发也少。本文的原文当然也来自:

PublishedonTheO'ReillyNetwork(http://www.oreillynet.com/)
http://www.oreillynet.com/pub/a/onlamp/2002/04/04/webdb.html

看了以后,颇有启发,以前开发中遇到的一些问题,迎刃而解。所以翻译出来和大家共享。

1.PHP中数组的使用
在操作数据库时,使用关联数组(associatively-indexedarrays)十分有帮助,下面我们看一个基本的数字格式的数组遍历:

$temp[0]="richmond";
$temp[1]="tigers";
$temp[2]="premiers";

for($x=0;$x
{
echo$temp[$x];
echo"";
}
?>

然而另外一种更加节省代码的方式是:

$temp=array("richmond","tigers","premiers");
foreach($tempas$element)
echo"$element";
?>

foreach还能输出文字下标:

$temp=array("club"=>"richmond",
"nickname"=>"tigers",
"aim"=>"premiers");

foreach($tempas$key=>$value)
echo"$key:$value";
?>
PHP手册中描述了大约50个用于处理数组的函数。

2.在PHP字符串中加入变量

这个很简单的:
$temp="hello"
echo"$tempworld";
?>

但是需要说明的是,尽管下面的例子没有错误:
$temp=array("one"=>1,"two"=>2);
//输出::Thefirstelementis1
echo"Thefirstelementis$temp[one].";
?>

但是如果后面那个echo语句没有双引号引起来的话,就要报错,因此建议使用花括号:

$temp=array("one"=>1,"two"=>2);
echo"Thefirstelementis{$temp["one"]}.";
?>


3.采用关联数组存取查询结果
看下面的例子:

$connection=mysql_connect("localhost","albert","shhh");
mysql_select_db("winestore",$connection);

$result=mysql_query("SELECTcust_id,surname,
firstnameFROMcustomer",$connection);

while($row=mysql_fetch_array($result))
{
echo"ID:\t{$row["cust_id"]}\n";
echo"Surname\t{$row["surname"]}\n";
echo"Firstname:\t{$row["firstname"]}\n\n";
}
?>

函数mysql_fetch_array()把查询结果的一行放入数组,可以同时用两种方式引用,例如cust_id可以同时用下面两种方式:$row["cust_id"]或者$row[0]。显然,前者的可读性要比后者好多了。

在多表连查中,如果两个列名字一样,最好用别名分开:

SELECTwinery.nameASwname,
region.nameASrname,
FROMwinery,region
WHEREwinery.region_id=region.region_id;

列名的引用为:$row["wname"]和$row["rname"]。

在指定表名和列名的情况下,只引用列名:

SELECTwinery.region_id
FROMwinery

列名的引用为:$row["region_id"]。

聚集函数的引用就是引用名:

SELECTcount(*)
FROMcustomer;

列名的引用为:$row["count(*)"]。

4.注意常见的PHPbug
常见的PHP纠错问题是:

NopagerenderedbytheWebbrowserwhenmuchmoreisexpected
Apop-updialogstatingthatthe"DocumentContainsNoData"
Apartialpagewhenmoreisexpected

出现这些情况的大多数原因并不在于脚本的逻辑,而是HTML中存在的bug或者脚本生成的HTML的bug。例如缺少类似,之类的关闭Tag,页面就不能刷新。解决这个问题的办法就是,查看HTML的源代码。

对于复杂的,不能查到原因的页面,可以通过W3C的页面校验程序http://validator.w3.org/来分析。

如果没有定义变量,或者变量定义错误也会让程序变得古怪。例如下面的死循环:

for($counter=0;$counter<10;$Counter++)
myFunction();
?>

变量$Counter在增加,而$counter永远小于10。这类错误一般都能通过设置较高的错误报告级别来找到:

error_reporting(E_ALL);

for($counter=0;$counter<10;$Counter++)
myFunction();
?>

5.采用header()函数处理单部件查询

在很多Web数据库应用中,一些功能往往让用户点击一个连接后,继续停留在当前页面,这样的工作我叫它“单部件查询”。

下面是一个叫做calling.php的脚本:

"-//W3C//DTDHTML4.0Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

Clickhere!

当用户点击上面的连接时,就去调用action.php。下面是action.php的源码:

//数据库功能

//重定向
header("Location:$HTTP_REFERER");
exit;
?>

这里有两个常见的错误需要提醒一下:
调用header()函数后要包含一个exit语句让脚本停止,否则后续的脚本可能会在头发送前输出。

header()函数常见的一个错误是:

Warning:Cannotaddheaderinformation-headersalreadysent...

header()函数只能在HTML输出之前被调用,因此你需要检查php前面可能存在的空行,空格等等。

6.reload的问题及其解决
我以前在写PHP程序时,经常碰到页面刷新时,数据库多处理一次的情况。
我们来看addcust.php:

$query="INSERTINTOcustomer
SETsurname=$surname,
firstname=$firstname";
$connection=mysql_connect("localhost","fred","shhh");
mysql_select_db("winestore",$connection);
$result=mysql_query($query,$connection);
?>

"-//W3C//DTDHTML4.0Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

I'veinsertedthecustomerforyou.

?>
假设我们用下面的连接使用这个程序:

http://www.freelamp.com/addcust.php?surname=Smith&firstname=Fred

如果这个请求只提交一次,OK,不会有问题,但是如果多次刷新,你就会有多条记录插入。
这个问题可以通过header()函数解决:下面是新版本的addcust.php:

$query="INSERTINTOcustomer
SETsurname=$surname,
firstname=$firstname";
$connection=mysql_connect("localhost","fred","shhh");
mysql_select_db("winestore",$connection);
$result=mysql_query($query,$connection);
header("Location:cust_receipt.php");
?>
这个脚本把浏览器重定向到一个新的页面:cust_receipt.php:

"-//W3C//DTDHTML4.0Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

I'veinsertedthecustomerforyou.


这样,原来的页面继续刷新也没有副作用了。

7.巧用锁机制来提高应用性能
如果我们要紧急运行一个报表,那么,我们可以对表加写锁,防治别人读写,来提高对这个表的处理速度。

8.用mysql_unbuffered_query()开发快速的脚本
这个函数能用来替换mysql_query()函数,主要的区别就是mysql_unbuffered_query()执行完查询后马上返回,不需要等待或者对数据库加锁。

但是返回的行数不能用mysql_num_rows()函数来检查,因为输出的结果集大小未知。