2009-08-26 6 views
2

私は新しいPHP mysqli拡張を使用しようとしています。文字列を安全にするためにmysql_real_escape_stringを再帰的に使用する関数(safe())があります。 mysqli :: escape_string()関数を呼び出すには、この関数内でmysqli接続を使用するにはどうすればよいですか?関数内でのクラスのメソッドの使い方(PHP)

例:私はmysqliの:: escape_stringを(持っている

$db = new mysqli($host,$user,$password,$database_name); 


function safe ($data) { 
    if(!is_array($data)) { 
    if(!get_magic_quotes_gpc()) { 
     $data = **mysqli::escape_string($data)** 
     return $data; 
    } 
    } else { 
    return array_map('safe',$data); 
    } 
} 

安全の内側()私はそれをどのように呼ぶのですか?関数の外では$ db-> escape_string()ですが、私はそれを呼び出す方法を見つけることができません。私は関数に$ dbを渡してみましたが、$ db globalなどを作成しました。手順はmysqli_escape_string()を使うことですが、mysqliリンクリソースを明示的に渡す必要がありますが、アクセスしてください。

+0

それを使用しようとしているかに依存しますか? – SeanJA

答えて

6

DBオブジェクトを関数に渡します。

function safe ($data, $db) { 
    if(!is_array($data)) { 
    if(!get_magic_quotes_gpc()) { 
     $data = $db->escape_string($data); 
    } 
    } else { 
    return array_map('safe',$data); 
    } 
} 
1

私はmysqliのクラスを拡張します:

class mysqliA extends mysqli{ 
    function escape_string($data){ 
     if(!is_array($data)) { 
      if(!get_magic_quotes_gpc()) { 
       $data = $this->escape_string($data); 
       return $data; 
      } 
     } else { 
      return $this->escape_string($data); 
     } 
    } 
} 

あなたはちょうど私がグローバルを使用することをお勧めしたいのですが、あなたの場合はありません

$db = new mysqliA(); 
$db->escape_string($data); 
0

を呼び出す必要があり、そのようセーフファンクションから$dbにアクセスしたい場合は、ファンクションの冒頭にglobal $db;を置く必要があります。で結果の

$db = new mysqli($host,$user,$password,$database_name); 

function safe ($data) { 

    global $db; 

    if(!is_array($data)) { 
    if(!get_magic_quotes_gpc()) { 
     $data = $db->escape_string($data); 
     return $data; 
    } 
    } else { 
    return array_map('safe',$data); 
    } 
} 

はグローバルが悪とみなされ、使用すべきではないことに注意してください。

次に使用する必要があるのは?さて、あなたのユースケースでは、registry pattern(これを覚えておいてください)は、おそらく最も適しています。しかし、あなたは今のところ、次の試してみてくださいオブジェクト指向プログラミングを始めるために:それはあなたがより良く、より多くの再利用可能なコードを書くのに役立ちますよう

class myClass { 

    protected $db; 

    public function __construct() { 
     $this->db = new mysqli($host,$user,$password,$database_name); 
    } 


    function safe ($data) { 

     if(!is_array($data)) { 
     if(!get_magic_quotes_gpc()) { 
      $data = $this->db->escape_string($data); 
      return $data; 
     } 
     } else { 
     return array_map('safe',$data); 
     } 
    } 
} 

私は、オブジェクト指向プログラミングについての詳細を読むためにあなたを促します。

希望すると助かります。私はクラスを拡張する場合

0

私が手に:私はmysqliのオブジェクトを渡す場合、関数は

をここで

Notice: Undefined variable: db in *file path* on line 22 

Fatal error: Call to a member function escape_string() on a non-object in *file path* on line 22 

ライン22がされて私が取得:

Warning: Missing argument 2 for safe() in *file path* on line 17 

Notice: Undefined variable: db in *file path* on line 22 

Fatal error: Call to a member function escape_string() on a non-object in *file path* on line 22 

私の関数呼び出しがあります:

    $item[$form] = safe($item[$form],$db); 

2番目の変数がはっきりとなくなっていないことを確認してください。

そして、新しいクラスのmysqli接続を構築することはできません(これは、効率的ではないと思われます)それにarray_mapのための有効なコールバック(にする機能)と無構文この行のために働くようだ:

$data = $this->db->escape_string($data); 

$data = $this->db->escape_string($data); 
$data = self::db::escape_string($data); 
$data = self::db->escape_string($data); 
+0

致命的なエラーは、あなたが盲目的にコードをコピーしたためです。22行目を見ると、$ this-> – SeanJA

+0

の代わりに$ db->と表示されます。クラスそのもののコンテキスト –

+0

私はあなたがクラスを拡張するとき – SeanJA

0

を試してみましたが、あなたのデシベルのクラスファイルに

をパブリック関数を作成します
function escape($string) 
    { 
     return $this->connection->real_escape_string($string); 

    } 

、あなたは機能のこの

function safe() 

    { 
      $id=$this->mysqli->escape($this->id); 

      $status=$this->mysqli->escape($this->status); 

      $shortcode=$this->mysqli->escape($this->shortcode); 



    } 

使用のようにそれを使用することができますあなたはあなたが正しい答えをマークするつもりは

関連する問題