手机
配件3G移动电源WinPhone安极网
笔记本
台式机一体电脑商用电脑
平板电脑
超极本
数码
数码相机单反相机单电相机摄像机女性相机国产平板GPS潮生活
电视机
3D高清投影机播放器电子书
洗衣机
冰箱空调小家电厨卫
显示器
音频内存硬盘移动存储
DIY
CPU键鼠装机音频
主板
显卡机电
服务器
网络设备IT新闻
办公OA
信息化方案库商用喷墨
下载
开发信息化工具软件手机软件
游戏
软件汽车图片时尚
Windows
脑残科技苹果频道
全国分站:北京上海广州深港南京福建沈阳西安郑州成都重庆济南杭州武汉长沙

五个常见 PHP 数据库问题

2006-10-11 06:00 来源:ibm 作者:蒋涛 责任编辑:方舟·yesky 评论()
  问题 3:使用多个数据库

  偶尔,我们会看到一个应用程序中,每个表都在一个单独的数据库中。在非常大的数据库中这样做是合理的,但是对于一般的应用程序,则不需要这种级别的分割。此外,不能跨数据库执行关系查询,这会影响使用关系数据库的整体思想,更不用说跨多个数据库管理表会更困难了。 那么,多个数据库应该是什么样的呢?首先,您需要一些数据。清单 7 展示了分成 4 个文件的这样的数据。

  清单 7. 数据库文件

Files.sql:
CREATE TABLE files (
 id MEDIUMINT,
 user_id MEDIUMINT,
 name TEXT,
 path TEXT
);

Load_files.sql:
INSERT INTO files VALUES ( 1, 1, 'test1.jpg', 'files/test1.jpg' );
INSERT INTO files VALUES ( 2, 1, 'test2.jpg', 'files/test2.jpg' );

Users.sql:
DROP TABLE IF EXISTS users;
CREATE TABLE users (
 id MEDIUMINT,
 login TEXT,
 password TEXT
);

Load_users.sql:
INSERT INTO users VALUES ( 1, 'jack', 'pass' );
INSERT INTO users VALUES ( 2, 'jon', 'pass' );

  在这些文件的多数据库版本中,您应该将 SQL 语句加载到一个数据库中,然后将 users SQL 语句加载到另一个数据库中。用于在数据库中查询与某个特定用户相关联的文件的 PHP 代码如下所示。

  清单 8. Getfiles.php

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

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

 $res = $db->query( "SELECT id FROM users WHERE login=?",array( $name ) );
 $uid = null;
 while( $res->fetchInto( $row ) ) { $uid = $row[0]; }

 return $uid;
}

function get_files( $name )
{
 $uid = get_user( $name );

 $rows = array();

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

 $res = $db->query( "SELECT * FROM files WHERE user_id=?",array( $uid ) );
 while( $res->fetchInto( $row ) ) { $rows[] = $row; }
 return $rows;
}

$files = get_files( 'jack' );

var_dump( $files );
?>

  get_user 函数连接到包含用户表的数据库并检索给定用户的 ID。get_files 函数连接到文件表并检索与给定用户相关联的文件行。

  做所有这些事情的一个更好办法是将数据加载到一个数据库中,然后执行查询,比如下面的查询。

  清单 9. Getfiles_good.php

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

function get_files( $name )
{
 $rows = array();

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

 $res = $db->query("SELECT files.* FROM users, files WHERE
users.login=? AND users.id=files.user_id",
array( $name ) );
 while( $res->fetchInto( $row ) ) { $rows[] = $row; }

 return $rows;
}

$files = get_files( 'jack' );

var_dump( $files );
?>

  该代码不仅更短,而且也更容易理解和高效。我们不是执行两个查询,而是执行一个查询。

  尽管该问题听起来有些牵强,但是在实践中我们通常总结出所有的表应该在同一个数据库中,除非有非常迫不得已的理由。

分享到:

焦点