1

我是 PHP OOP 的新手。下面是我的第一个类文件。我想为这段代码增加更多的灵活性,添加函数以便我可以运行查询,甚至将结果(fetch_assoc/fetch_array)分配给一个数组(或 var 等)以供以后使用。


我在运行查询时遇到的问题是我无法将两个类放在一起(嵌套?):$db->Query->Select('myTable');OR $db->Query->Select('myTable')->Where($pageID);OR$db->Query->Select('myTable')->Where($pageID)->OrderBy('name');


另外,如果您让我知道我在此代码中是否做错了什么以及改进建议,我将不胜感激,这样我将来可以编写更好的 php 类 =)。

<?php
require( $_SERVER['DOCUMENT_ROOT'] . '/database/database-connection-info.php');
 //This file (database-connection-info.php) contains $config[];

class db {
    private $db;
    private $type = 'read-only';
    //$config['db']['dbh']          = Database Host
    //$config['db']['dbn']          = Database Name
    //$config['db'][$type]['dbu']   = [User type][user name]
    //$config['db'][$type]['dbp']   = [User type][password]


    public function __construct($type = null) {
        global $config;
        $this->config = $config;
        $this->Connect($type);
    }


    public function Connect($type) {
    global $config;
        switch( $type ) {
        case 'admin':
        $this->type = 'admin';
        $this->db = mysql_connect( $this->config['db']['dbh'] , $this->config['db'][$type]['dbu'] , $this->config['db'][$type]['dbp'] );
        return $this->db;

        default:
        $this->type = 'read-only';
        $type = 'read';
        $this->db = mysql_connect( $this->config['db']['dbh'] , $this->config['db'][$type]['dbu'] , $this->config['db'][$type]['dbp'] );
        return $this->db;
        }
    }


    public function Close() {
        mysql_close();
        mysql_close($this->db);
        $this->type = 'Closed';
    }


    public function Type() {
        return "<b>Database connection type</b>: " . $this->type . "<br/>";
    }


    public function Status() {
        if( !@mysql_stat($this->db) )
             { return "<b>Database connection status</b>: There is no database connection open at this time.<br/>"; }
        else { return "<b>Database connection status</b>: " . mysql_stat($this->db) . "<br/>"; }
    }
}

//For testing purposes
$db = new db(admin);
echo $db->Type();
echo $db->Status();
echo $db->Close();
echo $db->Status();
echo $db->Type();
?>
4

1 回答 1

3

两项重大改进:

  • 不要对配置使用全局,而是在构造函数中传递配置。这允许您将 db 对象实例化到其他数据库,而无需破解全局。

  • 停止使用本机 [depreacted]mysql_*库并切换到现代 API,例如PDOMySQLi这是一个很好的 PDO 教程,尤其是在您的情况下,因为您是从本机的mysql_*角度来的。

我也注意到了这一点:

$db = new db(admin);

PHP 将在这里寻找一个常量admin,它会找不到它并假设该字符串admin是预期的。如果你曾经定义过一个常量,admin那么你会在那里观察到奇怪的行为(或者你可能认为是字符串)。更改为字符串:

$db = new db('admin');
于 2012-11-14T10:03:25.783 回答