Como usar o método de uma classe dentro de uma função (PHP)?

votos
2

Eu estou tentando usar a nova extensão PHP mysqli. Eu tenho uma função (seguro ()), que utiliza de forma recursiva mysql_real_escape_string para fazer cordas de segurança. Como posso usar minha conexão mysqli dentro dessa função para chamar a função mysqli :: escape_string ()?

Exemplo:

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

Onde eu mysqli :: escape_string () dentro segura () como posso chamar isso? Fora de uma função que seria de R $ db-> escape_string (), mas não consigo encontrar uma maneira de chamá-lo de insde. Eu tentei passar $ db para a função, fazendo $ db mundial etc. A alternativa é usar o mysqli_escape_string processual (), mas que requer o recurso link de mysqli para ser passado explicitamente a ele, mas não consigo encontrar uma maneira de acessar esse.

Publicado 26/08/2009 em 22:34
fonte usuário
Em outras línguas...                            


5 respostas

votos
6

passar o seu objeto DB para a função.

 function safe ($data, $db) {
  if(!is_array($data)) {
     if(!get_magic_quotes_gpc()) {
       $data = $db->escape_string($data);
    }
  } else {
    return array_map('safe',$data);
  }
}
Respondeu 26/08/2009 em 22:39
fonte usuário

votos
1

Gostaria de estender a 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);
        }
    }
}

Dessa forma, você só tem que chamar

$db = new mysqliA();
$db->escape_string($data);
Respondeu 26/08/2009 em 22:46
fonte usuário

votos
0

Criar uma função pública em seu arquivo de classe db

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

    }

e você pode usá-lo como este

function safe()

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

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

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



     }

o uso da função depende de como você está indo para usá-lo

Respondeu 17/02/2015 em 14:00
fonte usuário

votos
0

se eu estender a classe eu recebo:

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

A linha 22, sendo que a função é

Se eu passar o objeto mysqli eu recebo:

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

Minha chamada de função é:

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

tão claramente há segunda var desaparecida

E eu não posso construir uma classe em torno da função e inicializar uma nova conexão mysqli (que parece ser a altura de ineficiência de qualquer modo) becuase eu tenho que fazer seguro () uma função estática para torná-lo um callback válido para array_map () e nenhuma sintaxe parece funcionar para esta linha:

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

Tentei

$data = $this->db->escape_string($data);
$data = self::db::escape_string($data);
$data = self::db->escape_string($data);
Respondeu 27/08/2009 em 22:48
fonte usuário

votos
0

Eu não quero encorajá-lo a usar globals, mas se você quiser o acesso $dbda função de seguro, você teria que colocar global $db;no início da função.

Resultando em:

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

Por favor note que globals são considerados mal e não deve ser utilizado.

O que você deve usar então? Bem, para o seu caso de uso do padrão de registro (manter isso em mente para mais tarde) provavelmente se encaixaria melhor. Mas para você começar com programação orientada a objetos, você deve tentar o seguinte, por enquanto:

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

Exorto-vos a ler mais sobre programação orientada a objetos, uma vez que irá ajudá-lo a escrever melhor e mais reutilizáveis ​​código.

Espero que eu poderia ajudar.

Respondeu 26/08/2009 em 23:52
fonte usuário

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