快速业务通道

五个常见 PHP数据库问题

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
ce("DB.php");

  function add_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( "SELECT max(id) FROM users" );

  $id = null;

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

  $id += 1;

  $sth = $db->prepare( "INSERT INTO users VALUES(?,?,?)" );

  $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

  DROP TABLE IF EXISTS users;

  CREATE TABLE users (

  id MEDIUMINT NOT NULL AUTO_INCREMENT,

  login TEXT NOT NULL,

  password TEXT NOT NULL,

  PRIMARY KEY( id )

  );

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

  INSERT INTO users VALUES ( null, 'joan', 'pass' );

  INSERT INTO users VALUES ( null, 'jane', 'pass' );

  我们添加了 NOT NULL 标志来指示字段必须不能为空。我们还添加了 AUTO_INCREMENT 标志来指示字段是自动增量的,添加 PRIMARY KEY 标志来指示那个字段是一个 id。这些更改加快了速度。清单 6 展示了更新后的 PHP 代码,即将用户插入表中。

  清单 6. Add_user_good.php

  <?php

  require_once("DB.php");

  function add_user( $name, $pass )

  {

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

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

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

  $sth = $db->prepare( "INSERT INTO users VALUES(null,?,?)" );

  $db->execute( $sth, array( $name, $pass ) );

  $res = $db->query( "SELECT last_insert_id()" );

  $id = null;

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

  return $id;

  }

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

  var_dump( $id );

  ?>

  现在我不是获得最大的 id 值,而是直接使用 INSERT 语句来插入数据,然后使用 SELECT 语句来检索最后插入的记录的 id。该代码比最初的版本及其相关模式要简单得多,且效率更高。

 

  问题 3:使用多个数据库

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

  那么,多个数据库应该是什么样的呢?首先,您需要一些数据。清单 7 展示了分成 4 个文件的这样的数据。

  清单 7. 数据库文件

  Files.sql:

  CREATE TABLE files (

  id MEDIUMINT,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号