在课堂上使用PDO和php和mysql

时间:2012-11-11 12:00:09

标签: php mysql database pdo

我正在尝试在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的新手,想要使用它。

由于

3 个答案:

答案 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可以在不使用继承的情况下使用数据库。

  • Google关于合成与继承以及何时使用它。
  • 这里也看看这个答案: PHP Mysqli Extension Warning
  • 阅读本文并通过示例来了解原因 在为某些课提供方法时,构成是一种方法 与数据库交互。

我知道这不是你问题的答案,但是你走错了方向来解决你的问题。我看到很多人只使用继承,所以要意识到还有更多的继承来让你的对象进行交互。在这种情况下,使用继承是错误的,因为您的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

}