Bir işlev (PHP) içinde bir sınıfın yöntemi kullanmak nasıl?

4 Cevap php

Ben yeni PHP mysqli uzantısı kullanmaya çalışıyorum. Ben ardışık dizeleri güvenli hale getirmek için kullandığı mysql_real_escape_string () (güvenli) bir işlevi var. Nasıl mysqli :: escape_string () işlevini çağırmak için bu işlev içinde benim mysqli bağlantısı kullanıyorsunuz?

Örnek:

$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);
  }
}

I mysqli::escape_string() kasa içindeki sahip olduğu () Bunu nasıl diyorsunuz? Bir fonksiyonun dışında o $ db-> escape_string (olurdu) ama ben insde onu aramak için bir yol bulamıyorum. Ben alternatif usul mysqli_escape_string (kullanmaktır vb $ db küresel hale işlevine $ db geçen denedim) ama açıkça kendisine geçirilecek mysqli bağlantı kaynak gerektirir, ama ben bir yol bulamıyorum Bu erişin.

4 Cevap

işlevine sizin DB nesne geçmek.

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

Ben mysqli sınıfı genişletir:

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);
        }
    }
}

bu şekilde sadece aramak zorunda

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

Ben küresellerle kullanmaya teşvik etmek istemiyorum, ancak güvenli işlevi erişimi $db istedim eğer fonksiyonunun başında global $db; koymak zorunda kalacaktı.

: Sonuçlanabilecek

$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);
  }
}

Globallerinin kötü kabul edilir ve kullanılmaması gerektiğini unutmayın.

Sonra ne kullanmalıyım? Peki, kullanım durumda registry pattern (daha sonrası için akılda tutmak) muhtemelen en iyi uyabilecek. Ama sen şimdi şu denemelisiniz nesne yönelimli programlama ile başlamak için:

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);
      }
    }
}

Size daha iyi ve daha yeniden kod yazmak yardımcı olacak gibi nesne yönelimli programlama hakkında daha fazla bilgi için çağırıyorum.

Ben yardımcı olabilir umuyoruz.

Ben sınıfını genişleten eğer olsun:

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

fonksiyonu olduğu olduğu hat 22

Ben mysqli nesneye başarılı olursa alıyorum:

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

Benim işlev çağrısı:

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

çok net bir şekilde hayır ikinci VAR eksik

Ve ben fonksiyon etrafında bir sınıf inşa edemez ve ben (o array_map için geçerli bir geri arama yapmak için güvenli () Statik bir işlevi yapmak zorunda becuase (herhangi bir oranda verimsizlik yükseklik gibi görünüyor) yeni bir mysqli bağlantı initialize) ve hiçbir sözdizimi bu hat için iş gibi görünüyor:

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

Denediniz mi

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