首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类中通过php和mysql使用PDO

问在类中通过php和mysql使用PDO
EN

Stack Overflow用户
提问于 2012-11-11 20:00:09
回答 3查看 703关注 0票数 0

我正在尝试通过类在php中使用PDO。

所以我定义了一个这样的配置文件

代码语言:javascript
复制
<?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"; 

}
?>

然后,我定义了连接数据库的类

代码语言:javascript
复制
<?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;
            }
        }
 }       

?>

现在,我已经定义了另一个类来选择表中的记录

代码语言:javascript
复制
<?
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文件中使用此函数时,如下所示

代码语言:javascript
复制
<?php 
$objCMS=new cms();
$getCMS=$objCMS->get_rec(1);
echo $getCMS[0];
?>

我把它放出来了

代码语言:javascript
复制
Connected.
Fatal error: Call to a member function prepare() on a non-object in /Applications/XAMPP/xamppfiles/htdocs

我正在试着从过去的两天中把这个整理出来,但是没有成功。

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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-11 20:03:25

您需要在cms的构造函数中调用dbClass()

将此代码添加到cms类中

代码语言:javascript
复制
function cms() {
    parent::dbClass();
}

并将get_rec更改为:

代码语言:javascript
复制
$statement = $this->dbh->prepare("select * from TABLENAME :name order by id");

使用$dbh时,需要将其引用为$this->dbh

您需要在中对$this->dbh进行$dbh更改,还需要更新connect_PDO()

票数 0
EN

Stack Overflow用户

发布于 2012-11-11 20:05:28

你的私有是在基类中声明的,但如果没有特定的作用域,我认为它将默认为“$dbh”。因此在子类中不可见。

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

票数 1
EN

Stack Overflow用户

发布于 2012-11-11 20:17:50

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

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

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

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

代码语言:javascript
复制
class CMS
{
    protected $db;
    // other CMS related stuff
}

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

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

PHP Mysqli Extension Warning

  • And
  • 谷歌关于组合与继承的比较,以及何时使用它。
  • 也可以在这里查看这个答案:

阅读这篇文章,并通过示例来理解为什么在为某些类提供与数据库交互的方式时,组合是一种方法。

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

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13330907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档