0

我正在尝试使用类在 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

我试图从过去 2 天解决这个问题,但没有成功。

我是 PDO 的新手,想使用它。

谢谢

4

3 回答 3

1

您在基类中声明了 $dbh,但没有特定范围,我认为它将默认为“私有”。因此在子类中不可见。

你也没有调用构造函数。在您的子类中添加对 'parent::__construct()' 的调用。 http://php.net/manual/en/language.oop5.decon.php

于 2012-11-11T12:05:28.113 回答
1

你在解决这个问题上走错了方向。

如果要授予某些对象访问数据库的权限,则该对象需要访问提供与数据库交互的方法的数据库对象。你说对了。

但是,继承是“IS A”关系。而且您的CMS对象不是数据库类型的对象,并且与数据库对象的功能不一样吗?CMS 对象应该只使用数据库,这称为组合。这种关系也称为“HAS A”关系。

因此,您应该像这样使用组合,而不是在这里使用继承:

class CMS
{
    protected $db;
    // other CMS related stuff
}

$db = new PDO($dsn, $username, $password, $options);
$cms = new User($db);

这样,您的 CMS 可以在不使用继承的情况下使用数据库。

  • 谷歌关于组合与继承以及何时使用它。
  • 还可以在这里查看这个答案: PHP Mysqli Extension Warning
  • 并阅读这篇文章并通过示例来理解为什么在为某些类提供与数据库交互的方式时组合是一种方法。

我知道这不是您问题的答案,但是您在解决问题方面走错了方向。我看到很多人只使用继承,所以要知道除了继承之外还有更多的东西可以让你的对象交互。在这种情况下,使用继承是错误的,因为您的 CMS 对象与数据库无关,它们不是相同的“类型”。CMS 应该只使用数据库。

希望这可以帮助!

于 2012-11-11T12:17:50.247 回答
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->dbhconnect_PDO()

于 2012-11-11T12:03:24.753 回答