现在我不是获得最大的id值
,而是直接使用INSERT语句来插入数据
,然后使用SELECT语句来检索最后插入的记录的id
。该代码比最初的版本及其相关模式要简单得多,且效率更高
。 问题3:使用多个数据库
偶尔,我们会看到一个应用程序中,每个表都在一个单独的数据库中。在非常大的数据库中这样做是合理的,但是对于一般的应用程序,则不需要这种级别的分割。此外,不能跨数据库执行关系查询,这会影响使用关系数据库的整体思想,更不用说跨多个数据库管理表会更困难了。
那么,多个数据库应该是什么样的呢?首先,您需要一些数据。清单7展示了分成4个文件的这样的数据。
Files.sql:
CREATETABLEfiles(
idMEDIUMINT,
user_idMEDIUMINT,
nameTEXT,
pathTEXT
);
Load_files.sql:
INSERTINTOfilesVALUES(1,1,'test1.jpg','files/test1.jpg');
INSERTINTOfilesVALUES(2,1,'test2.jpg','files/test2.jpg');
Users.sql:
DROPTABLEIFEXISTSusers;
CREATETABLEusers(
idMEDIUMINT,
loginTEXT,
passwordTEXT
);
Load_users.sql:
INSERTINTOusersVALUES(1,'jack','pass');
INSERTINTOusersVALUES(2,'jon','pass');
清单7.数据库文件
在这些文件的多数据库版本中,您应该将
SQL语句加载到一个数据库中,然后将users
SQL语句加载到另一个数据库中。用于在数据库中查询与某个特定用户相关联的文件的
PHP代码如下所示。
<?php
require_once("DB.php");
functionget_user($name)
{
$dsn='
mysql://root:password@localhost/bad_multi1';
$db=&DB::Connect($dsn,array());
if(PEAR::isError($db)){die($db->getMessage());}
$res=$db->query("SELECTidFROMusersWHERElogin=?",
array($name));
$uid=null;
while($res->fetchInto($row)){$uid=$row[0];}
return$uid;
}
functionget_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*FROMfilesWHEREuser_id=?",
array($uid));
while($res->fetchInto($row)){$rows[]=$row;}
return$rows;
}
$files=get_files('jack');
var_dump($files);
?>
清单8.Getfiles.php
get_user函数连接到包含用户表的数据库并检索给定用户的ID。get_files函数连接到文件表并检索与给定用户相关联的文件行。
做所有这些事情的一个更好办法是将数据加载到一个数据库中,然后执行查询,比如下面的查询。
<?php
require_once("DB.php");
functionget_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(
"SELECTfiles.*FROMusers,filesWHERE
users.login=?ANDusers.id=files.user_id",
array($name));
while($res->fetchInto($row)){$rows[]=$row;}
return$rows;
}
$files=get_files('jack');
var_dump($files);
?>
清单9.Getfiles_good.php