网站建设
  简约型网页设计套餐998
  实惠型网站建设套餐2580
  综合型网站制作套餐4980
  网站改版与网站维护
  行业网站建设方案
  大型网站建设解决方案
  企业网站建设流程
  帝网科技网站设计与网站制作
建站FAQ
·网站空间问题解答
·企业邮箱问题解答
 
酷站欣赏
·房产酷站(379)
·综合门户(8 9)
·建筑装饰(603)
·手机通讯(354)
·生活购物(376)
·医疗保健(199)
·文化摄影(602)
·休闲体育(399)
>>更多酷站欣赏
网站优化
·Google(谷歌)优化   ·百度(BaiDu)优化
·雅虎(Yahoo)优化    ·Alexa排名优化   
·Google AdSense   ·DMOZ目录提交  
建站知识
·网站建设知识·网站名词解释·网站运营知识
·网络营销知识·搜索引擎知识·实用技术文摘
网站推广
百度网站推广 google网站推广
搜狐网站推广 网易网站推广
新浪网站推广   雅虎网站推广
  您当前位置: 当前位置:帝网科技 >> web开发 >> PHP专栏 >> 浏览文章
 
 
五个常见 PHP 数据库问题
作者:袁袁整理 来源:帝网科技 日期:2008年09月15日 点击数:


揭露PHP应用程序中出现的五个常见数据库问题——包括数据库模式设计、数据库访问和使用数据库的业务逻辑代码——以及它们的解决方案。

如果只有一种方式使用数据库是正确的……

您可以用很多的方式创建数据库设计、数据库访问和基于数据库的PHP业务逻辑代码,但最终一般以错误告终。本文说明了数据库设计和访问数据库的PHP代码中出现的五个常见问题,以及在遇到这些问题时如何修复它们。

问题1:直接使用MySQL

一个常见问题是较老的PHP代码直接使用mysql_函数来访问数据库。清单1展示了如何直接访问数据库。

清单1.Access/get.php

  <?php
functionget_user_id($name)
{
 $db=mysql_connect('localhost','root','password');
 mysql_select_db('users');

 $res=mysql_query("SELECTidFROMusersWHERElogin='".$name."'");
 while($row=mysql_fetch_array($res)){$id=$row[0];}

 return$id;
}

var_dump(get_user_id('jack'));
?>
注意使用了mysql_connect函数来访问数据库。还要注意查询,其中使用字符串连接来向查询添加$name参数。

该技术有两个很好的替代方案:PEARDB模块和PHPDataObjects(PDO)类。两者都从特定数据库选择提供抽象。因此,您的代码无需太多调整就可以在IBM?DB2?、MySQL、PostgreSQL或者您想要连接到的任何其他数据库上运行。

使用PEARDB模块和PDO抽象层的另一个价值在于您可以在SQL语句中使用?操作符。这样做可使SQL更加易于维护,且可使您的应用程序免受SQL注入攻击。

使用PEARDB的替代代码如下所示。

清单2.Access/get_good.php

  <?php
require_once("DB.php");

functionget_user_id($name)
{
 $dsn='mysql://root:password@localhost/users';
 $db=&DB::Connect($dsn,array());
 if(PEAR::isError($db)){die($db->getMessage());}

 $res=$db->query('SELECTidFROMusersWHERElogin=?',array($name));
 $id=null;
 while($res->fetchInto($row)){$id=$row[0];}

 return$id;
}

var_dump(get_user_id('jack'));
?>
注意,所有直接用到MySQL的地方都消除了,只有$dsn中的数据库连接字符串除外。此外,我们通过?操作符在SQL中使用$name变量。然后,查询的数据通过query()方法末尾的array被发送进来。

问题2:不使用自动增量功能

与大多数现代数据库一样,MySQL能够在每记录的基础上创建自动增量惟一标识符。除此之外,我们仍然会看到这样的代码,即首先运行一个SELECT语句来找到最大的id,然后将该id增1,并找到一个新记录。清单3展示了一个示例坏模式。

清单3.Badid.sql

  DROPTABLEIFEXISTSusers;
CREATETABLEusers(
idMEDIUMINT,
loginTEXT,
passwordTEXT
);

INSERTINTOusersVALUES(1,'jack','pass');
INSERTINTOusersVALUES(2,'joan','pass');
INSERTINTOusersVALUES(1,'jane','pass');
这里的id字段被简单地指定为整数。所以,尽管它应该是惟一的,我们还是可以添加任何值,如CREATE语句后面的几个INSERT语句中所示。清单4展示了将用户添加到这种类型的模式的PHP代码。

清单4.Add_user.php

  <?php
require_once("DB.php");

functionadd_user($name,$pass)
{
 $rows=array();

 $dsn='mysql://root:password@localhost/bad_badid';
 $db=&DB::Connect($dsn,array());
 if(PEAR::isError($db)){die($db->getMessage());}

 $res=$db->query("SELECTmax(id)FROMusers");
 $id=null;
 while($res->fetchInto($row)){$id=$row[0];}

 $id+=1;

 $sth=$db->prepare("INSERTINTOusersVALUES(?,?,?)");
 $db->execute($sth,array($id,$name,$pass));

 return$id;
}

$id=add_user('jerry','pass');

var_dump($id);
?>
add_user.php中的代码首先执行一个查询以找到id的最大值。然后文件以id值加1运行一个INSERT语句。该代码在负载很重的服务器上会在竞态条件中失败。另外,它也效率低下。

那么替代方案是什么呢?使用MySQL中的自动增量特性来自动地为每个插入创建惟一的ID。更新后的模式如下所示。

清单5.Goodid.php

  DROPTABLEIFEXISTSusers;
CREATETABLEusers(
 idMEDIUMINTNOTNULLAUTO_INCREMENT,
 loginTEXTNOTNULL,
 passwordTEXTNOTNULL,
 PRIMARYKEY(id)
);

INSERTINTOusersVALUES(null,'jack','pass');
INSERTINTOusersVALUES(null,'joan','pass');
INSERTINTOusersVALUES(null,'jane','pass');
我们添加了NOTNULL标志来指示字段必须不能为空。我们还添加了AUTO_INCREMENT标志来指示字段是自动增量的,添加PRIMARYKEY标志来指示那个字段是一个id。这些更改加快了速度。清单6展示了更新后的PHP代码,即将用户插入表中。

  相关文章
 
·如何在PHP开启gzip页面压缩实例正文分
·如何正确运用PHP json_encode函数进行
·PHP下载断点续传的代码正文分析错误
·PHP取得客户端IP地址代码正文分析错误
·PHP判断用户IP来路的一个方法正文分析
·PHP+mysql分页代码正文分析错误
·php去除HTML标记正文分析错误
·php轻松快速缓存全站正文分析错误
·php多语言网站解决方案正文分析错误
·php图片验证码函数正文分析错误
·PHP初学者常见问题集(21问答)正文分
·分享PHP技术开发技巧正文分析错误
·cURL库功能简介:抓取网页 POST数据及
·PHP常用函数:过滤HTML字符串正文分析
·php fscanf()函数使用方法详解正文分析
·和php有关的几种常见安全详解正文分析
·php连接mysql出现乱码解决办法正文分析
·PHP非常简单的使用模板制作静态页面正
·非常简单PHP缩略图生成程序源代码正文
·无法载入 mcrypt 扩展,请检查 PHP 配置
 
 

公司环境 | 合作伙伴 | 人才招聘 | 付款方式 | 关于我们

地址:广州市天河区中山大道中120号D805 电话:020-82529556 传真:020-82529556
广州帝网网络科技有限公司 版权所有 粤ICP备08119341号