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

PHP
php 多线程上下文中安全写文件实现代码
PHP类的使用 实例代码讲解
用php实现让页面只能被百度gogole蜘蛛访问的方法
php 学习笔记
PHP编程过程中需要了解的this,self,parent的区别
php 操作excel文件的方法小结
使用PHP获取网络文件的实现代码
PHP 巧用数组降低程序的时间复杂度
php下将XML转换为数组
php 文件上传代码(限制jpg文件)
php 无极分类(递归)实现代码
PHP 采集获取指定网址的内容
PHP 将图片按创建时间进行分类存储的实现代码
PHP 存储文本换行实现方法
PHP 批量更新网页内容实现代码
用PHP查询搜索引擎排名位置的代码
用php实现的获取网页中的图片并保存到本地的代码
php实现首页链接查询 友情链接检查的代码
处理php自动反斜杠的函数代码
php实现的遍历文件夹下所有文件,编辑删除

PHP和MySQL开发的8个技巧


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 89 ::
收藏到网摘: 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()函数来检查,因为输出的结果集大小未知。