PHP 应用程序配置模式

来源: 作者: 2007-12-03 出处:pcdog.com

mysql  xml  安全  解决方案  数据库  
上一页 1 2 3 4 5 6 下一页 

使用数据库

    最后的替代方式是使用一个数据库保存配置元素的值。那首先要用一个简单的模式来存储配置数据。下面是一个简单的模式。


清单 14. schema.sql

DROP TABLE IF EXISTS settings;
CREATE TABLE settings (
  id MEDIUMINT NOT NULL AUTO_INCREMENT,
  name TEXT,
  value TEXT,
  PRIMARY KEY ( id )
);


    这要求进行一些基于应用程序需求的调整。例如,如果想让配置元素按照每个用户进行存储,就需要添加用户 ID 作为额外的一列。

为了读取及写入数据,我编写了如图 15 所示的更新过的 Configuration 类。


清单 15. db1.php

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

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

$db =& DB::Connect( $dsn, array() );
if (PEAR::isError($db)) { die($db->getMessage()); }

class Configuration
{
  private $configFile = 'config.xml';

  private $items = array();

  function __construct() { $this->parse(); }

  function __get($id) { return $this->items[ $id ]; }

  function __set($id,$v)
  {
    global $db;

    $this->items[ $id ] = $v;

    $sth1 = $db->prepare( 'DELETE FROM settings WHERE name=?' );
    $db->execute( $sth1, $id );
    if (PEAR::isError($db)) { die($db->getMessage()); }

    $sth2 = $db->prepare(
      'INSERT INTO settings ( id, name, value ) VALUES ( 0, ?, ? )' );
    $db->execute( $sth2, array( $id, $v ) );
    if (PEAR::isError($db)) { die($db->getMessage()); }
  }

  function parse()
  {
    global $db;

    $doc = new DOMDocument();
    $doc->load( $this->configFile );

    $cn = $doc->getElementsByTagName( "config" );

    $nodes = $cn->item(0)->getElementsByTagName( "*" );
    foreach( $nodes as $node )
    $this->items[ $node->nodeName ] = $node->nodeValue;

    $res = $db->query( 'SELECT name,value FROM settings' );
    if (PEAR::isError($db)) { die($db->getMessage()); }
    while( $res->fetchInto( $row ) ) {
      $this->items[ $row[0] ] = $row[1];
    }
  }
}

$c = new Configuration();
echo( $c->TemplateDirectory."\n" );
$c->TemplateDirectory = 'new foo';
echo( $c->TemplateDirectory."\n" );
?>


    这实际上是一个混合的文本/数据库解决方案。请仔细观察 parse 方法。该类首先读取文本文件来获取初始值,然后读取数据库,进而将键更新为最新的值。在设置一个值后,键就从数据库中移除掉,并添加一条具有更新过的值的新记录。

    观察 Configuration 类如何通过本文的多个版本来发挥作用是一件有趣的事,该类能从文本文件、XML 及数据库中读取数据,并一直保持相同的接口。我鼓励您在开发中也使用具有相同稳定性的接口。对于对象的客户机来说,这项工作具体是如何运行的是不明确的。关键的是对象与客户机之间的契约。

 


更多内容请看PCdog.com--PHP基础篇  PHP应用篇  win98使用技巧专题
上一页 1 2 3 4 5 6 下一页 
上一篇:通过PHP程序统计蜘蛛是否访问你的网站
下一篇:怎样才能成为PHP高手?学会“懒惰”的编程