我正在尝试在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;
}
}
}
&GT;
现在我已经定义了另一个类来从表中选择记录
<?
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
我试图在过去2天对此进行排序,但没有成功。
我是PDO的新手,想要使用它。
由于
答案 0 :(得分:1)
您在基类中声明了$ dbh,但没有特定的范围,我认为它将默认为“私有”#。因此在子类中不可见。
此外,您还没有调用构造函数。添加对&#39; parent :: __ construct()&#39;的调用在你的子类中。 http://php.net/manual/en/language.oop5.decon.php
答案 1 :(得分:1)
你在解决这个方面的方向错误。
如果要为数据库提供某些对象访问权限,则该对象需要访问提供与数据库交互的方法的数据库对象。你做对了。
但是,继承是“IS A”的关系。而你的CMS对象不是数据库类型的对象,并且没有与数据库对象相同的功能吗? CMS对象应该只使用数据库,这称为组合。这种关系也称为“HAS A”关系。
因此,不应使用此处的继承,而应使用如下的Composition:
class CMS
{
protected $db;
// other CMS related stuff
}
$db = new PDO($dsn, $username, $password, $options);
$cms = new User($db);
这样,您的CMS可以在不使用继承的情况下使用数据库。
我知道这不是你问题的答案,但是你走错了方向来解决你的问题。我看到很多人只使用继承,所以要意识到还有更多的继承来让你的对象进行交互。在这种情况下,使用继承是错误的,因为您的CMS对象与数据库无关,它们不是相同的“类型”。 CMS应该只使用数据库。
希望这有帮助!
答案 2 :(得分:0)
您需要在dbClass()
cms
将其添加到cms
类
function cms() {
parent::dbClass();
}
并将get_rec
更改为:
$statement = $this->dbh->prepare("select * from TABLENAME :name order by id");
使用$dbh
时,您需要将其引用为$this->dbh
您需要更新$dbh
至$this->dbh