0

クラスを使用してphpでPDOを使用しようとしています。

だから私はそのような1つの設定ファイルを定義しました

<?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は基本クラスで宣言されていますが、特定のスコープがないと、デフォルトで「private」になると思います。したがって、サブクラスには表示されません。

また、コンストラクターを呼び出していません。サブクラスの「parent::__construct()」への呼び出しを追加します。 http://php.net/manual/en/language.oop5.decon.php

于 2012-11-11T12:05:28.113 に答える
1

あなたはこれを解決することについて間違った方向に進んでいます。

データベースへのオブジェクトアクセスを許可する場合、そのオブジェクトは、データベースと対話するためのメソッドを提供するデータベースオブジェクトへのアクセスを必要とします。あなたはその権利を得ました。

しかし、継承は「ISA」関係です。また、CMSオブジェクトはデータベースタイプのオブジェクトではなく、データベースオブジェクトと同じ機能を持っていませんか?CMSオブジェクトはデータベースを使用する必要があり、これはコンポジションと呼ばれます。この関係は「HASA」関係とも呼ばれます。

したがって、ここで継承を使用する代わりに、次のようにコンポジションを使用する必要があります。

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

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

このようにして、CMSは継承を使用せずにデータベースを使用できます。

  • 構成と継承、およびそれをいつ使用するかについてのGoogle。
  • こちらの回答もご覧ください: PHPMysqli拡張機能の警告
  • そして、この記事を読み、例を見て、データベースと対話する方法をクラスに提供するときに、構成がなぜ行く方法であるかを理解してください。

これはあなたの質問に対する答えではないことを私は知っていますが、あなたはあなたの問題を解決するために間違った方向に進んでいます。多くの人が継承のみを使用しているので、オブジェクトを相互作用させるには継承以外にも多くのことがあることに注意してください。そしてこの状況では、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->dbh変更を加える必要がありますconnect_PDO()

于 2012-11-11T12:03:24.753 に答える