我希望能够创建扩展MySQLi类的类来执行它的所有SQL查询。
$mysql = new mysqli('localhost', 'root', 'password', 'database') or die('error connecting to the database');如果不将$mysql对象全球化以在其他方法或类中使用,我不知道如何做到这一点。
class Blog {
public function comment() {
global $mysql;
//rest here
}
}任何帮助都将不胜感激。
谢谢。
发布于 2009-11-30 23:21:48
我的建议是创建一个单例DataAccess类,在全局配置文件中实例化该类,并在$query = DataAccess::query("SELECT * FROM blog WHERE id = ".$id)等博客类中调用它。
看看Singleton模式,它是一个很容易理解的设计模式。非常适合这种情况。
您的DataAccess类可以有几个方法,如query、fetchAssoc、numRows、checkUniqueValue、transactionStart、transactionCommit、transactionRollback等。这些函数也可以设置为由DataAccess类实现的接口。这样,您就可以轻松地为多个数据库管理系统扩展DataAccess类。
上面描述了我的DataAccess模型。
发布于 2010-01-16 04:56:47
我也在做类似的事情。我很高兴这个封装了数据库登录的单例类。
<?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;
}
}要使用该命令,您可以使用类似以下内容:
<?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']);
}
?>发布于 2009-11-30 23:24:41
您可以将PHP的扩展关键字仅用于任何其他类:
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!');或者最好使用对象聚合而不是继承:
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!');https://stackoverflow.com/questions/1820421
复制相似问题