五个常见PHP数据库问题(四)

文章作者 100test 发表时间 2007:03:26 17:58:55
来源 100Test.Com百考试题网


清单 9. Getfiles_good.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 ).
?>

该代码不仅更短,而且也更容易理解和高效。我们不是执行两个查询,而是执行一个查询。
尽管该问题听起来有些牵强,但是在实践中我们通常总结出所有的表应该在同一个数据库中,除非有非常迫不得已的理由。
问题 4:不使用关系
关系数据库不同于编程语言,它们不具有数组类型。相反,它们使用表之间的关系来创建对象之间的一到多结构,这与数组具有相同的效果。我在应用程序中看到的一个问题是,工程师试图将数据库当作编程语言来使用,即通过使用具有逗号分隔的标识符的文本字符串来创建数组。请看下面的模式。

清单 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
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 ).
?>

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


相关文章


利用单元测试对PHP代码进行检查
RH033RedHatLinux基础课程
五个常见PHP数据库问题(六)
五个常见PHP数据库问题(五)
五个常见PHP数据库问题(四)
五个常见PHP数据库问题(三)
五个常见PHP数据库问题(二)
五个常见PHP数据库问题(一)
如何测试和调试Apache服务器
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛