首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展MySQLi类

扩展MySQLi类
EN

Stack Overflow用户
提问于 2009-11-30 23:19:33
回答 5查看 23.2K关注 0票数 2

我希望能够创建扩展MySQLi类的类来执行它的所有SQL查询。

代码语言:javascript
复制
$mysql = new mysqli('localhost', 'root', 'password', 'database') or die('error connecting to the database');

如果不将$mysql对象全球化以在其他方法或类中使用,我不知道如何做到这一点。

代码语言:javascript
复制
class Blog {

public function comment() {
    global $mysql;

    //rest here
}

}

任何帮助都将不胜感激。

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-30 23:21:48

我的建议是创建一个单例DataAccess类,在全局配置文件中实例化该类,并在$query = DataAccess::query("SELECT * FROM blog WHERE id = ".$id)等博客类中调用它。

看看Singleton模式,它是一个很容易理解的设计模式。非常适合这种情况。

您的DataAccess类可以有几个方法,如queryfetchAssocnumRowscheckUniqueValuetransactionStarttransactionCommittransactionRollback等。这些函数也可以设置为由DataAccess类实现的接口。这样,您就可以轻松地为多个数据库管理系统扩展DataAccess类。

上面描述了我的DataAccess模型。

票数 3
EN

Stack Overflow用户

发布于 2010-01-16 04:56:47

我也在做类似的事情。我很高兴这个封装了数据库登录的单例类。

代码语言:javascript
复制
<?php
class db extends mysqli
{
    protected static $instance;
    protected static $options = array();

    private function __construct() {
        $o = self::$options;

        // turn of error reporting
        mysqli_report(MYSQLI_REPORT_OFF);

        // connect to database
        @parent::__construct(isset($o['host'])   ? $o['host']   : 'localhost',
                             isset($o['user'])   ? $o['user']   : 'root',
                             isset($o['pass'])   ? $o['pass']   : '',
                             isset($o['dbname']) ? $o['dbname'] : 'world',
                             isset($o['port'])   ? $o['port']   : 3306,
                             isset($o['sock'])   ? $o['sock']   : false );

        // check if a connection established
        if( mysqli_connect_errno() ) {
            throw new exception(mysqli_connect_error(), mysqli_connect_errno()); 
        }
    }

    public static function getInstance() {
        if( !self::$instance ) {
            self::$instance = new self(); 
        }
        return self::$instance;
    }

    public static function setOptions( array $opt ) {
        self::$options = array_merge(self::$options, $opt);
    }

    public function query($query) {
        if( !$this->real_query($query) ) {
            throw new exception( $this->error, $this->errno );
        }

        $result = new mysqli_result($this);
        return $result;
    }

    public function prepare($query) {
        $stmt = new mysqli_stmt($this, $query);
        return $stmt;
    }    
}

要使用该命令,您可以使用类似以下内容:

代码语言:javascript
复制
<?php
require "db.class.php";

$sql = db::getInstance();

$result = $sql->query("select * from city");

/* Fetch the results of the query */ 
while( $row = $result->fetch_assoc() ){ 
    printf("%s (%s)\n", $row['Name'], $row['Population']); 
} 
?>
票数 12
EN

Stack Overflow用户

发布于 2009-11-30 23:24:41

您可以将PHP的扩展关键字仅用于任何其他类:

代码语言:javascript
复制
class MyCustomSql extends mysqli {

    public function __construct($host, $user, $password, $database) {
        parent::__construct($host, $user, $password, $database);
    }

    public function someOtherMethod() {
    }
}

$sql = new MyCustomSql('localhost', 'root', 'password', 'database') or die('Cannot connect!');

或者最好使用对象聚合而不是继承:

代码语言:javascript
复制
class MySqlManipulator {

    private $db;

    public function __construct($host, $user, $password, $database) {
        $this->db   = new mysqli($host, $user, $password, $database);
    }

    public function someOtherMethod() {
        return $this->db->query("SELECT * FROM blah_blah");
    }
}

$mysqlmanipulator = new MySqlManipulator('localhost', 'root', 'password', 'database') or die('Cannot connect!');
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1820421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档