我正在尝试通过类在php中使用PDO。
所以我定义了一个这样的配置文件
<?php
global $configVars;
$configVars['online'] = false;
if(($_SERVER['SERVER_NAME'])!='localhost' and ($_SERVER['SERVER_NAME'])!='abc')
{
$configVars['dbhost'] = "localhost";
$configVars['dbuser'] = "dbuser";
$configVars['dbpassword'] = "dbpass";
$configVars['dbname'] = "dbname";
}
?>然后,我定义了连接数据库的类
<?php
class dbClass{
var $dbHost,
$dbUser,
$dbName,
$dbPass,
$dbTable,
$dbLink,
$resResult,
$dbh,
$dbPort;
function dbClass(){
global $configVars;
$this->dbHost = $configVars['dbhost'];
$this->dbUser = $configVars['dbuser'];
$this->dbPass = $configVars['dbpassword'];
$this->dbName = $configVars['dbname'];
$this->connect_PDO();
}
function connect_PDO(){
try {
$dbh = new PDO('mysql:host='.$this->dbHost.';dbname='.$this->dbName.'', $this->dbUser, $this->dbPass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected.";
}
catch(PDOException $e) {
echo "I'm sorry Charlie, I'm afraid i cant do that.";
file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
$dbh = null;
}
}
} ?>
现在,我已经定义了另一个类来选择表中的记录
<?
class cms extends dbClass
{
function get_rec($id=0)
{
($id==0?$addQuery="":$addQuery=" where id =".$id);
$statement = $dbh->prepare("select * from TABLENAME :name order by id");
$statement->execute(array(':name' => $addQuery));
$row = $statement->fetchAll();
return $row ;
}
}
?>现在,当我在PHP文件中使用此函数时,如下所示
<?php
$objCMS=new cms();
$getCMS=$objCMS->get_rec(1);
echo $getCMS[0];
?>我把它放出来了
Connected.
Fatal error: Call to a member function prepare() on a non-object in /Applications/XAMPP/xamppfiles/htdocs我正在试着从过去的两天中把这个整理出来,但是没有成功。
我是PDO新手,我想使用它。
谢谢
发布于 2012-11-11 20:03:25
您需要在cms的构造函数中调用dbClass()
将此代码添加到cms类中
function cms() {
parent::dbClass();
}并将get_rec更改为:
$statement = $this->dbh->prepare("select * from TABLENAME :name order by id");使用$dbh时,需要将其引用为$this->dbh
您需要在中对$this->dbh进行$dbh更改,还需要更新connect_PDO()
发布于 2012-11-11 20:05:28
你的私有是在基类中声明的,但如果没有特定的作用域,我认为它将默认为“$dbh”。因此在子类中不可见。
此外,您也没有调用构造函数。在您的子类中添加对'parent::__construct()‘的调用。http://php.net/manual/en/language.oop5.decon.php
发布于 2012-11-11 20:17:50
你在解决这个问题上走错了方向。
如果要授予某些对象对数据库访问权限,则该对象需要访问提供与数据库交互的方法的数据库对象。你说对了。
但是,继承是“是A”的关系。并且您的CMS对象不是数据库类型的对象,并且不具有与数据库对象相同的功能,对吗?CMS对象应该只使用数据库,这称为组合。这种关系也被称为“有A”关系。
因此,这里不应该使用继承,而应该像这样使用组合:
class CMS
{
protected $db;
// other CMS related stuff
}
$db = new PDO($dsn, $username, $password, $options);
$cms = new User($db);这样你的CMS就可以在不使用继承的情况下使用数据库。
阅读这篇文章,并通过示例来理解为什么在为某些类提供与数据库交互的方式时,组合是一种方法。
我知道这不是你问题的答案,但你已经走错了方向来解决你的问题。我看到很多人只使用继承,所以请注意,除了继承之外,还有更多的东西可以让你的对象交互。在这种情况下,使用继承是错误的,因为您的CMS对象与数据库无关,它们不是相同的“类型”。CMS应该只使用数据库。
希望这能有所帮助!
https://stackoverflow.com/questions/13330907
复制相似问题