2009-08-26 8 views
2

J'essaie d'utiliser la nouvelle extension PHP mysqli. J'ai une fonction (safe()) qui utilise récursivement mysql_real_escape_string pour sécuriser les chaînes. Comment puis-je utiliser ma connexion mysqli à l'intérieur de cette fonction pour appeler la fonction mysqli :: escape_string()?Comment utiliser la méthode d'une classe dans une fonction (PHP)?

Exemple:

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

Où je mysqli :: escape_string() intérieur sûr() comment puis-je appeler? En dehors d'une fonction ce serait $ db-> escape_string() mais je ne trouve pas le moyen de l'appeler insde. J'ai essayé de passer $ db à la fonction, en faisant $ db global etc. L'alternative est d'utiliser la procédure mysqli_escape_string() mais cela nécessite que la ressource mysqli link lui soit explicitement transmise, mais je ne trouve pas de moyen de accéder à cela.

+0

Vous allez marquer la bonne réponse? – SeanJA

Répondre

6

passez votre objet DB dans la fonction.

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

J'étendre la classe 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); 
     } 
    } 
} 

cette façon vous suffit d'appeler

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

Je ne veux pas vous encourager à utiliser globals, mais si vous voulait accéder $db à partir de la fonction de sécurité que vous auriez à mettre global $db; au début de la fonction.

Entraînant:

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

S'il vous plaît noter que globals sont considérés comme mal et ne doivent pas être utilisés.

Que devriez-vous utiliser ensuite? Eh bien, pour votre cas d'utilisation le registry pattern (gardez cela à l'esprit pour plus tard) serait probablement mieux. Mais pour vous aider à démarrer avec la programmation orientée objet, vous devriez essayer ce qui suit pour l'instant:

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

Je vous invite à lire plus sur la programmation orientée objet, car il vous aidera à mieux écrire et code plus réutilisable.

J'espère que je pourrais aider.

0

si je tends la classe que je reçois:

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 

ligne 22 étant où la fonction est

Si je passe l'objet mysqli je reçois:

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 

Mon appel de fonction est :

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

donc clairement aucune seconde manquante var

Et je ne peux pas construire une classe autour de la fonction et initialiser une nouvelle connexion mysqli (qui semble être la hauteur de l'inefficacité en tout cas) parce que je dois faire un safe() statique fonction pour en faire un rappel valable pour array_map() et pas de syntaxe semble fonctionner pour cette ligne:

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

ont essayé

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

Erreur fatale parce que vous avez copié aveuglément le code, si vous regardez la ligne 22, il dit $ db-> au lieu de $ this-> – SeanJA

+0

Il devrait être $ db-> parce que je passe un objet, ne pas l'utiliser dans le contexte de la classe elle-même –

+0

Je voulais dire quand vous étendez la classe – SeanJA

0

Créer une fonction publique dans votre fichier de classe db

function escape($string) 
    { 
     return $this->connection->real_escape_string($string); 

    } 

et vous pouvez l'utiliser comme ceci

function safe() 

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

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

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



    } 

l'utilisation de la fonction dépend de la façon dont vous allez l'utiliser

Questions connexes