PHP 和 MySQL 开发的 8 个技巧

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

Published on The O'Reilly Network (http://www.oreillynet.com/)
http://www.oreillynet.com/pub/a/onlamp/2002/04/04/webdb.html

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

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

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

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

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

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

foreach 还能输出文字下标:

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

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

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

这个很简单的:

<?php
$temp = "hello"
echo "$temp world";
?>

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

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

<?php
$temp = array("one" => 1, "two" => 2);
echo "The first element is {$temp["one"]}.";
?>

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

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

$result = mysql_query("SELECT cust_id, surname,
firstname FROM customer", $connection);

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

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

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

SELECT winery.name AS wname,
region.name AS rname,
FROM winery, region
WHERE winery.region_id = region.region_id;

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

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

SELECT winery.region_id
FROM winery

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

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

SELECT count(*)
FROM customer;

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

4. 注意常见的 PHP bug

常见的 PHP 纠错问题是:

No page rendered by the Web browser when much more is expected
A pop-up dialog stating that the "Document Contains No Data"
A partial page when more is expected

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

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

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

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

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

<?php
error_reporting(E_ALL);

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

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

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

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

<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd" >
<html>
<head>
<title>Calling page example</title>
</head>
<body>
<a href="action.php">Click here!</a>
</body>
</html>

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

<?php
// 数据库功能

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

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

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

Warning: Cannot add header information - headers already sent...

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

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

<?php
$query = "INSERT INTO customer
SET surname = $surname,
firstname = $firstname";
$connection = mysql_connect("localhost", "fred", "shhh");
mysql_select_db("winestore", $connection);
$result = mysql_query($query, $connection);
?>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd" >
<html>
<head>
<title>Customer insert</title>
</head>
<body>
I've inserted the customer for you.
</body>
</html>
?>
假设我们用下面的连接使用这个程序:

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

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

<?php
$query = "INSERT INTO customer
SET surname = $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:

<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd" >
<html>
<head>
<title>Customer insert</title>
</head>
<body>
I've inserted the customer for you.
</body>
</html>
这样,原来的页面继续刷新也没有副作用了。

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

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

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

(0)

相关推荐

  • MySQL开发规范与使用技巧总结

    1.命名规范 1.库名.表名.字段名必须使用小写字母,并采用下划线分割. a)MySQL有配置参数lower_case_table_names,不可动态更改,linux系统默认为 0,即库表名以实际情况存储,大小写敏感.如果是1,以小写存储,大小写不敏感.如果是2,以实际情况存储,但以小写比较. b)如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱. c)字段名显示区分大小写,但实际使⽤用不区分,即不可以建立两个名字一样但大小写不一样的字段. d)为了统一规范, 库名

  • PHP 和 MySQL 开发的 8 个技巧

    来源:www.freelamp.com LAMP 架构的网站,我以前注重的多是安装/配置方面的,讲述开发的相对较少,因为自己从事开发也少.本文的原文当然也来自: Published on The O'Reilly Network (http://www.oreillynet.com/) http://www.oreillynet.com/pub/a/onlamp/2002/04/04/webdb.html 看了以后,颇有启发,以前开发中遇到的一些问题,迎刃而解.所以翻译出来和大家共享. 1. P

  • PHP与MySQL开发的8个技巧小结

    1. PHP 中数组的使用 在操作数据库时,使用关联数组(associatively-indexed arrays)十分有帮助,下面我们看一个基本的数字格式的数组遍历: 复制代码 代码如下: <?php $temp[0] = "richmond"; $temp[1] = "tigers"; $temp[2] = "premiers"; for($x=0;$x<count($temp);$x++) { echo $temp[$x]; e

  • mysql中coalesce()的使用技巧小结

    前言 最近无意间发现mysql的coalesce,又正好有时间,就把mysql中coalesce()的使用技巧总结下分享给大家,下面来一起看看详细的介绍: coalesce()解释 返回参数中的第一个非空表达式(从左向右依次类推): 使用示例 a,b,c三个变量. select coalesce(null,2,3); // Return 2 select coalesce(null,null,3); // Return 3 select coalesce(1,2,3); // Return 1

  • php+mysql开发的最简单在线题库(在线做题系统)完整案例

    本文实例讲述了php+mysql开发的最简单在线题库.分享给大家供大家参考,具体如下: 题库,对于教育机构,学校,在线教育,是很有必要的,网上也有不少的第三方在线题库系统,但是本次案例,会让有需要的人了解题库的开发思路,其实很简单,无非就是一个表单验证,数据库验证. 1.先构建表单数据 2.把表单数据通过get或者post方式提交到表单验证页面,和数据库进行匹配 3.返回结果,答案正确或者错误 构建表单: index.php <!DOCTYPE html> <html> <h

  • php+mysql开发中的经验与常识小结

    本文总结了php+mysql开发中的经验与常识.分享给大家供大家参考,具体如下: 一.基础规范 (1)尽量使用 InnoDB 存储引擎 支持事务.行级锁.并发性能更好,CPU 及内存缓存页优化得当,资源利用率更高 (2)必须使用 UTF8 字符集 无需转码,无乱码风险 (3)数据表.数据字段必须加入中文注释 N 年后谁知道这个 r1,r2,r3 字段是干嘛的 (4)尽量不要使用存储过程.视图.触发器.Event 高并发大数据的互联网业务,架构设计思路是"解放数据库 CPU,将计算转移到服务层&q

  • 后端开发使用pycharm的技巧(推荐)

    1.使用说明 首先说明,本文所使用的功能为pycharm专业版所支持,其他版本如社区版,教育版,则不一定支持. 作为一名后端开发,我猜你的桌面上一定打开着一系列的软件,用作开发调试工具,比如navicat数据库连接工具,postman接口调试工具,pycharm代码编写IDE,以及其他一些工具.今天,我就介绍一下pycharm中你可能还不知道的一些功能,让你的IDE.postman.navicat融为一体,从此不再需要频繁切屏. 2.database 这个功能本人觉得可以完全替代navicat,

  • 基于JavaSwing+mysql开发一个学生社团管理系统设计和实现

    前言: 项目是使用Java swing+mysql开发,可实现基础数据维护.用户登录注册.社团信息列表查看.社团信息添加.社团信息修改.社团信息删除以及退出注销等功能.界面设计比较简单易学.适合作为Java课设设计以及学习技术使用. 引言 随着全球信息化的迅猛发展,高效规模不断壮大,协会人数急剧增加,有必要开发一个学生社团管理系统来提高社联对社团的管理效率,学生社团管理系统将逐渐取代传统的人工管理模式.本文采用Java+swing+mysql作为开发技术,以Java为编程语言,开发一个基java

  • MySQL性能优化的一些技巧帮助你的数据库

    你完成了你的品牌新的应用程序,一切工作就像一个魅力.用户来使用你的网络.每个人是幸福的. 然后,突然间,一个大爆发的用户杀死你的MySQL服务器,您的网站已关闭.出了什么问题?你怎么能阻止它吗? 以下是MySQL性能优化的一些技巧,将帮助你,帮助你的数据库. 大处着眼 在早期的发展阶段,你应该知道预期到您的应用程序的用户数.如果你希望很多用户来说,你应该想想大,从一开始,计划进行复制,可扩展性和性能. 但是,如果你优化你的SQL代码,架构和索引策略,也许你不会需要大环境.你必须总是三思而后行的性

  • apache php mysql开发环境安装教程

    apache php mysql开发环境搭建教程,分享给大家,供大家参考 0.资源链接: 360云盘:https://yunpan.cn/c6wpzYwbfmLJY (提取码:0190) 1.首先安装编译器环境 即如下文件: 2.安装apache+php+mysql 即如下文件: 2.1.安装apache 2.1.1安装 只说关键几点 2.1.1.1 2.1.1.2 2.1.1.3 2.1.1.4.在浏览器地址栏输入:localhost ,若出现以下页面,说明您已成功安装apache 2.1.2

随机推荐