Как использовать метод класса внутри функции (PHP)? - PullRequest
2 голосов
/ 27 августа 2009

Я пытаюсь использовать новое расширение PHP mysqli. У меня есть функция (safe ()), которая рекурсивно использует mysql_real_escape_string, чтобы сделать строки безопасными. Как использовать мое соединение mysqli внутри этой функции для вызова функции 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);
  }
}

Где у меня есть mysqli :: escape_string () внутри safe (), как это вызвать? Вне функции это будет $ db-> escape_string (), но я не могу найти способ вызвать ее insde. Я попытался передать $ db в функцию, сделать $ db глобальным и т. Д. Альтернативой является использование процедурной mysqli_escape_string (), но для этого требуется явно передать ресурс ссылки mysqli, но я не могу найти способ доступ к этому.

Ответы [ 5 ]

6 голосов
/ 27 августа 2009

передать объект БД в функцию.

 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 голос
/ 27 августа 2009

Я бы расширил класс 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 голосов
/ 17 февраля 2015

Создайте публичную функцию в вашем файле класса db

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



     }

использование функции зависит от того, как вы собираетесь ее использовать

0 голосов
/ 28 августа 2009

если я продляю класс, я получаю:

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, где функция

Если я передаю объект mysqli, я получаю:

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

так ясно, что нет второго пропущенного var

И я не могу построить класс вокруг функции и инициализировать новое соединение mysqli (которое, во всяком случае, кажется неэффективным), потому что мне нужно сделать safe () статической функцией, чтобы сделать ее действительным обратным вызовом для 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 голосов
/ 27 августа 2009

Я не хочу призывать вас использовать глобальные переменные, но если вы хотите получить доступ к $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);
  }
}

Обратите внимание, что глобалы считаются злом и не должны использоваться.

Что вы должны использовать тогда? Что ж, для вашего случая использования шаблон реестра (помните об этом позже), вероятно, подойдет лучше всего. Но чтобы начать работу с объектно-ориентированным программированием, вам следует попробовать следующее:

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

Я призываю вас прочитать больше об объектно-ориентированном программировании, так как оно поможет вам писать более качественный и многократно используемый код.

Надеюсь, я смогу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...