快速业务通道

五个常见 PHP数据库问题

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
间的一到多结构,这与数组具有相同的效果。我在应用程序中看到的一个问题是,工程师试图将数据库当作编程语言来使用,即通过使用具有逗号分隔的标识符的文本字符串来创建数组。请看下面的模式。

  清单 10. Bad.sql

  DROP TABLE IF EXISTS files;

  CREATE TABLE files (

  id MEDIUMINT,

  name TEXT,

  path TEXT

  );

  DROP TABLE IF EXISTS users;

  CREATE TABLE users (

  id MEDIUMINT,

  login TEXT,

  password TEXT,

  files TEXT

  );

  INSERT INTO files VALUES ( 1, 'test1.jpg', 'media/test1.jpg' );

  INSERT INTO files VALUES ( 2, 'test1.jpg', 'media/test1.jpg' );

  INSERT INTO users VALUES ( 1, 'jack', 'pass', '1,2' );

  系统中的一个用户可以具有多个文件。在编程语言中,应该使用数组来表示与一个用户相关联的文件。在本例中,程序员选择创建一个 files 字段,其中包含一个由逗号分隔的文件 id 列表。要得到一个特定用户的所有文件的列表,程序员必须首先从用户表中读取行,然后解析文件的文本,并为每个文件运行一个单独的 SELECT 语句。该代码如下所示。

  清单 11. Get.php

  <?php

  require_once("DB.php");

  function get_files( $name )

  {

  $dsn = 'mysql://root:password@localhost/bad_norel';

  $db =& DB::Connect( $dsn, array() );

  if (PEAR::isError($db)) { die($db->getMessage()); }

  $res = $db->query( "SELECT files FROM users WHERE login=?",

  array( $name ) );

  $files = null;

  while( $res->fetchInto( $row ) ) { $files = $row[0]; }

  $rows = array();

  foreach( split( ',',$files ) as $file )

  {

  $res = $db->query( "SELECT * FROM files WHERE id=?",

  array( $file ) );

  while( $res->fetchInto( $row ) ) { $rows[] = $row; }

  }

  return $rows;

  }

  $files = get_files( 'jack' );

  var_dump( $files );

  ?>

  该技术很慢,难以维护,且没有很好地利用数据库。惟一的解决方案是重新架构模式,以将其转换回到传统的关系形式,如下所示。

  清单 12. Good.sql

  DROP TABLE IF EXISTS files;

  CREATE TABLE files (

  id MEDIUMINT,

  user_id MEDIUMINT,

  name TEXT,

  path TEXT

  );

  DROP TABLE IF EXISTS users;

  CREATE TABLE users (

  id MEDIUMINT,

  login TEXT,

  password TEXT

  );

  INSERT INTO users VALUES ( 1, 'jack', 'pass' );

  INSERT INTO files VALUES ( 1, 1, 'test1.jpg', 'media/test1.jpg' );

  INSERT INTO files VALUES ( 2, 1, 'test1.jpg', 'media/test1.jpg' );

  这里,每个文件都通过 user_id 函数与文件表中的用户相关。这可能与任何将多个文件看成数组的人的思想相反。当然,数组不引用其包含的对象 —— 事实上,反之亦然。但是在关系数据库中,工作原理就是这样的,并且查询也因此要快速且简单得多。清单 13 展示了相应的 PHP 代码。

  清单 13. Get_good.php

  <?php

  require_once("DB.php");

  function get_files( $name )

  {

  $dsn = 'mysql://root:passwor

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号