0

私はこのコードを持っています:

<?php 

class guildData {

    public $email = NULL;
    public $hash_pw = NULL;
    public $user_id = NULL;
    public $clean_username = NULL;
    public $display_username = NULL;

    public function selectGuild($g_id)
    {
            global $db,$db_table_prefix;

            $this->g_id = $g_id;

            $sql = "SELECT
                            name
                            FROM
                            guild
                            WHERE
                            id = '".$g_id."'";

            $result = $db->sql_query($sql);

            $row = $db->sql_fetchrow($result);

            return ($row['name']);
    }
}
?>
<?php echo $guildData->selectGuild(1); ?>

私は単に 500 エラーを受け取り、IDEone はこれも私に与えました:

致命的なエラー: 32 行目の /home/VT00Ds/prog.php の非オブジェクトに対するメンバー関数 selectGuild() の呼び出し

エラーが表示されないのですが、助けてもらえますか?

4

2 に答える 2

4

あなたはそれを誤解している。

  1. グローバル変数を取り除きます。代わりに、クラスにDBアクセスが必要な場合は、コンストラクターに挿入する必要があります。

    class GuildData
    {
        //  ... snip 
    
        protected $connection;
    
        public function __construct( PDO $connection )
        {
            $this->connection = $connection;
        }
    
        //  ... snip 
    }
    
  2. コードにはSQLインジェクションの可能性があります。クエリを連結する代わりに、プリペアドステートメントを使用する必要があります。

    $statement = $this->connection->prepare(
                    'SELECT name FROM guild WHERE id = :id'
                 );
    $statement->bindParam( ':id', $this->g_id, PDO::PARAM_INT );
    if ( $statement->execute() )
    {
        $data = $statement->fetch( PDO::FETCH_ASSOC );
    }
    
  3. オブジェクトを使用する前に、オブジェクトをインスタンス化する必要があります。

    $pdo = new PDO('mysql:host=localhost;dbname=myMagicalDB;charset=UTF-8', 
                   'username', 'password');
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $guild = new GuildData( $pdo );
    $guild->selectGuild(42);
    
  4. DBを扱う部分をドメインロジックから分離することを検討してください。基本的に、Guildクラスがロジックを管理している間、他のクラスにデータのフェッチと保存を処理させます。あなたはこれこの答えが関連していると思うかもしれません。

  5. public変数は使用しないでください。内部データを直接公開することで、オブジェクトのカプセル化を破っています。protected代わりに、またはとして定義する必要がありますprivate

    また、実際にそこに保持しているものをよく見ることもできます。なぜGuildData必要な$hash_pwのか$clean_username

于 2012-08-09T19:13:32.950 に答える
3

をインスタンス化していません$guildData。オブジェクトをインスタンス化せずにこのメソッドを使用する場合、メソッドはstatic.

class guildData {
    public static function selectGuild($g_id) { ... }
}

次に、から呼び出すことができます

echo guildData::selectGuild(1);

それ以外の場合は、オブジェクトをインスタンス化する必要があります

$guildData = new GuildData();

echo $guildData->selectGuild(1);

__construct()また、メンバー変数を設定するには、何らかのメソッドが必要です。

UPDATEまた、あなたのselectGuild()メソッドにエラーがあることに気付きました:

$this->g_id = $g_id;

g_idクラスでメンバー変数として定義されていないの値を設定します。g_idクラス定義でメンバー変数として宣言する必要があります。

class guildData {
    public $email = NULL;
    public $hash_pw = NULL;
    public $user_id = NULL;
    public $clean_username = NULL;
    public $display_username = NULL;

    public $g_id = NULL;

    .
    .
    .

}

最後に、sql_query()私が聞いたことのある PHP メソッドではありません。これらのメソッドを定義するライブラリを使用していない限り、mysql_query(). このような場合は、mysql_*関数の使用を停止する必要があります。それらは廃止されています。代わりにPDO (PHP 5.1 以降でサポート) またはmysqli (PHP 4.1 以降でサポート) を使用してください。どちらを使用すればよいかわからない場合は、この SO 記事 をお読みください

于 2012-08-09T18:56:21.820 に答える