1

Afactory mysql シンプル クラスがあり、このメソッドで使用できます。

Afactory.class.php:

require_once ( substr( dirname(__FILE__), 0, -5 ).'config.inc' );
class AFactory
{
    private $DBhost;
    private $DBuser;
    private $DBpass;
    private $DBname;
    private $DBport;
    private $queryResult;
    private $linkConnection;
    public function __construct() 
    {
        $this->DBhost=LOCALHOST;
        $this->DBuser=USERNAME;
        $this->DBpass=PASSWORD;
        $this->DBname=DATABASE;
    }
    public function getDBO()
    {
        $linkConnection = mysql_connect ($this->DBhost , $this->DBuser , $this->DBpass);
        mysql_query("set charset set utf8", $linkConnection);
        mysql_query("set names 'utf8'", $linkConnection);           
        return  mysql_select_db($this->DBname) ? TRUE : FALSE;
    }
    public function setQuery($query)
    {
        return mysql_query($query);
    }
    public function loadAssoc()
    {
        $array=NULL;
        while($result = mysql_fetch_assoc($this->queryResult ))
             $array[] = $result;
        return $array;      
    }
}

このファイルを使用すると、クラスとクラスの関数を使用できます

text.php:

$db=new AFactory();
$link=$db->getDBO();
$db->loadAssoc($db->setQuery("SELECT * FROM users")); // this can return array

新しいクラスを作成し、Afactory クラスを使用したい

testclass.php:

include ( substr( dirname(__FILE__), 0, -5 ).'alachiq_settings.php' );
class alachiq extends AFactory{
    public function __construct() {
       parent::__construct();
    } 
    public function fetchArray(){
       echo parent::getDBO(); //this line can return successfull connect to db
       return parent::loadAssoc(parrent::setQuery("SELECT * FROM users")); //fetch sql command

    }
}

Afactoryを拡張してalachiqクラスを作成した後、このメソッドを使用できません:

useTestClass:

include('testclass.php');
print_r(  alachiq::fetchArray() );

私のコードの問題は何ですか?

4

2 に答える 2

7

最初に mysql に関する短いメモ:

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に非推奨です赤いボックスがか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事は、どちらを決定するのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。


error_reporting / display_errors をオンにします...

ここでは単なるタイプミスです (parrentの代わりにparent):

return parent::loadAssoc(parrent::setQuery("SELECT * FROM settings")); //fetch sql command
// -------------------------^

正しい:

return parent::loadAssoc(parent::setQuery("SELECT * FROM settings")); //fetch sql command

また、静的コンテキストで非静的関数を呼び出すことはできません。

print_r(  alachiq::fetchArray() );

これは静的呼び出しでした。クラス インスタンスを使用します。

$instance = new alachiq();
print_r(  $instance->fetchArray() );
于 2013-06-11T11:06:21.217 に答える
1

ここでの主な問題は、静的メソッドとオブジェクト メソッドの使用方法の混乱です。

あなたはそれを次のように呼んでいます:

print_r(alachiq::fetchArray());

これは、静的メソッドとして呼び出すことを意味します。fetchArrayメソッドは として宣言されていませんが、static呼び出しているメソッドが静的メソッドとして機能する場合は、それを回避できます。

ただし、問題は をfetchArray呼び出すときに発生しますparent::getDBOgetDBOは を参照します$this。これは、メソッドが ではない staticことを意味します。

これが呼び出しalachiq::fetchArray()が失敗する理由です。非静的メソッドで静的呼び出しを行おうとしています。

ソリューション:

オブジェクトのインスタンスを作成し、それを呼び出す必要があります。

$myobj = new alachiq();
print_r($myobj->fetchArray());

それは役立つはずです。

于 2013-06-11T11:11:07.623 に答える