Comment utiliser la méthode d'une classe dans une fonction (PHP)?

voix
2

Je suis en train d'utiliser la nouvelle extension mysqli PHP. J'ai une fonction (sécurité ()) qui utilise récursive mysql_real_escape_string pour faire des chaînes en toute sécurité. Comment puis-je utiliser ma connexion mysqli dans cette fonction pour appeler la fonction mysqli :: escape_string ()?

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

Là où j'ai mysqli :: escape_string () à l' intérieur de sécurité () comment dois - je appeler cela? En dehors d'une fonction , il serait $ db-> escape_string () mais je ne peux pas trouver un moyen de l' appeler insde. J'ai essayé passer $ db à la fonction, ce qui rend la solution consiste à utiliser la procédure mysqli_escape_string () global $ db etc. mais qui nécessite la ressource de lien mysqli être explicitement passé à, mais je ne peux pas trouver un moyen de avoir accès.

Créé 26/08/2009 à 22:34
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
6

passer votre objet DB pour 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);
  }
}
Créé 26/08/2009 à 22:39
source utilisateur

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

De cette façon vous suffit d'appeler

$db = new mysqliA();
$db->escape_string($data);
Créé 26/08/2009 à 22:46
source utilisateur

voix
0

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

Résultant en:

$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 alors? Eh bien, pour votre cas d' utilisation du modèle de registre (garder à l' esprit que pour plus tard) serait probablement convient le 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 aider à écrire du code mieux et plus réutilisable.

L'espoir que je pourrais aider.

Créé 26/08/2009 à 23:52
source utilisateur

voix
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 là 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 est fonction:

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

si clairement pas de seconde var manquant

Et je ne peux pas construire une classe autour de la fonction et initialiser une nouvelle connexion mysqli (ce qui semble être la hauteur de l'inefficacité en tout cas) becuase je dois faire en toute sécurité () une fonction statique 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);
Créé 27/08/2009 à 22:48
source utilisateur

voix
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

Créé 17/02/2015 à 14:00
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more