2011-07-18 5 views
-2

私はこのラインその

$result = mysql_query(self::protect($query)) or _log("Query failed: ".$query); 

作品、このコード(2クラス)

class url 
{ 
     private $profile_id; 
     private $short; 
     public $notice; 
     private $forbidden; 
     function url() { 
       $this->forbidden = array('index.php', 'index.html', 'styles.css', 'style.css'); 
       if ($_POST['profile_id']){ 
//      global $db; 
         $exists = db::fetch_one(db::query("SELECT count(1) FROM ".TABLE." WHERE profile_id = ".intval($_POST['profile_id']).";")); 
         $exists_username = db::fetch_one(db::query("SELECT count(1) FROM ".TABLE." WHERE url_short = '".db::mres($_POST['url_short'])."'")); 
       } 
     } 
} 

class db 
{ 
     function db(){ 
       mysql_connect("localhost", "root", "h1gh§c1a0"); 
       mysql_select_db("gplus") or die(mysql_error()); 
       mysql_set_charset("utf8") or die(mysql_error()); 
     } 

     function query($query){ 
//    print_r($this); 
       $result = mysql_query(self::protect($query)) or _log("Query failed: ".$query); 
       //$this isn't working 
       //$result = mysql_query($this->protect($query)) or _log("Query failed: ".$query); 
       return $result; 

     } 

     function fetch($result){ 
       $result = mysql_fetch_assoc($result); 
       return $result; 
     } 

     function fetch_one($result){ 
       $result = mysql_fetch_row($result); 
       return $result['0']; 
     } 


     function mres($text) { 
       return mysql_real_escape_string($result); 
     } 

     function protect($text) { 

       if (preg_match("/UNION/i", $text)) { 
         _log("Hack attempt: ".$text); 
         die(); 
       } 
//    die($text); 
       return $text; 
     } 
} 

$db = new db(); 
$url = new url(); 

私の問題があるがありますが、私は$this->self::を変更した場合にはエラー

Fatal error: Call to undefined method url::protect() in /data/my/db.php on line 71 

を投げていますどのように可能ですか?私は$this->function();が現在のクラスのメソッドを呼び出すと思った。私は間違って何をしていますか?

+0

'$ this'は、オブジェクトの現在のインスタンスを参照します。静的クラスとして 'db'を使用しているので、インスタンスはありません。 'self'を使っても問題ありません。なぜあなたは '$ this 'の使用を主張していますか? – kba

+0

私はブラウザゲームを作成していましたが、決して静的クラスは使用しませんでした。しかし、私はそれが好きです - >これは$ this->;) – genesis

答えて

2

urlコンストラクタでは、静的に、それゆえ、protect()を静的にも呼ばれますdb::queryを呼んでいると、それゆえ、$thisは使用できません。

あなたはどちらかの静的それをすべてを保つことができるか、urldbのインスタンスを注入することができます

$db = new db(); 
$url = new url($db); 
+0

ですので、$ dbをグローバル化して$ db-> query()を呼び出す必要があります。 ? – genesis

+0

必ずしもそうではありません - このコンテキストで静的クラスとしてdbを使用しない理由はありません。 – weltraumpirat

+0

@webbiedave:注射とグローバル化の違いはありますか? – genesis

1

db::query()を使用して、あなたはクラスのメソッドを呼び出している(静的な方法でDBにアクセスしている、代わりにインスタンスメソッドの)。 $ thisはクラスインスタンスへのポインタを返しますが、selfはクラス自体への参照です。したがって、$ thisを介してアクセスするものはありません。

$db->query()を使用する場合は、$this->protect()も使用できます。

+0

私は関数内で変数をグローバル化してはいけないと聞きました。それは本当/別の方法ですか? – genesis

+0

$ dbは、クラスurlのインスタンス変数として宣言することも、パラメータとして渡すこともできます。しかし、私が上記のように - あなたはなぜdbをクラスインスタンスにするのですか?変数を保持しておらず、複数のデータベースを持つことはほとんどありません。この文脈で静的クラスを使用するのはまったく問題ありません。 – weltraumpirat

+0

私はいつも(d)インスタンスを使用しています。あなたは私と一緒に討論室に来ることができますか? – genesis