4

我有这段代码可以连接到数据库

class dbConn{
public $dbname='database';
private $dbhost='localhost';
private $dbusername='username';
private $dbpassword='password';


protected static $db;
private function __construct() {

try {

self::$db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbusername, $dbpassword );
self::$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {

echo "Connection Error: " . $e->getMessage();
}

}


public static function getConnection() {


if (!self::$db) {

new dbConn();
}


return self::$db;
}

}




class Mysql{

    function showTables(){
                $db = dbConn::getConnection();

                $query=$db->query("show tables");

                $fetchArray = $query->fetchAll(PDO::FETCH_ASSOC);
                foreach($fetchArray as $index=>$val) {
                            echo $val;
                          }
    }
}

$obj=new Mysql;
$obj->showTables();

我面临的问题是,如果我直接在 pdo 语句中使用数据库登录详细信息,如下所示:

self::$db = new PDO( 'mysql:host=localhost;dbname=databasename', 'root', 'pass');

我没有任何问题。但是如果我像上面所说的那样使用变量并将值存储到其中。

Notice: Undefined variable: dbhost 

Notice: Undefined variable: dbname 

Notice: Undefined variable: dbusername 

Notice: Undefined variable: dbpassword

出现以下错误,并且在其他类中也无法连接到数据库。

谁能告诉我这有什么问题?

4

2 回答 2

3

$this访问类属性时需要使用-$this是当前对象。

例子:

try {
  self::$db = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->dbname, $this->dbusername, $this->dbpassword );
  self::$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
  echo "Connection Error: " . $e->getMessage();
}

当您调用时,$dbhost您正在寻找当前范围内的变量,在这种情况下是构造函数。$dbhost在这种情况下$this->dbhost是两个不同的东西。

于 2013-03-14T17:08:09.523 回答
2

尝试更改为

self::$db = new PDO('mysql:host='.$this->dbhost.';dbname='.$this->dbname, $dbusername, $this->dbpassword );
于 2013-03-14T17:08:43.077 回答