небольшая объектно-ориентированная проблема php - PullRequest
0 голосов
/ 07 июня 2011

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

class MySQLi_DB  extends mysqli {
    private static $_instance = null;
    private function __construct($db="test",$host="localhost", $user="root", $pass="") 
    {

        parent::__construct($host, $user, $pass, $db);
        if (mysqli_connect_error()) {
            die('Connect Error (' . mysqli_connect_errno() . ') '
                    . mysqli_connect_error());
        }
    }
 static public function getDB()
    {
        if(self::$_instance == null)
        {
            self::$_instance = new MySQLi_DB();
        }
        return self::$_instance;

    }


public function insert($table,$data)
        {
           $sql = $this->getQuery($table,$data);
           print $sql;
        }

        public function getQuery($table, $inserts) 
        {
            $lambda = function($value){
                return $this->real_escape_string($value);
            };

            $values = array_map($lambda,$inserts);
            $keys = array_keys($inserts);

            return 'INSERT INTO `'.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $values).'\')';
        }

У меня проблема с вызовом функции real_escape_string ().я пытался использовать $ this-> real_escape_string (), но я просто должен увидеть эту ошибку

Неустранимая ошибка: использование $ this, когда не в контексте объекта в D: \ wamp \ www \ Driver \ MySQLi_DB.php в строке 49

ok может быть, это может быть ограничением лямбда-функции, но я попробовал это другим способом, объявив обратный вызов для array_map, который также не позволяет мне вызывать real_escape_string.

Я вызываю функцию, как показано ниже.

require_once 'MySQLi_DB.php';
        $db = MySQLi_DB::getDB();

        $insert_data = array("cmsId"=>444,"pageName"=>"New Insert");
        $db->insert("cms",$insert_data);

Пожалуйста, укажите, где я делаю что-то не так и что может быть лучшим способом сделать это.спасибо

Ответы [ 2 ]

3 голосов
/ 07 июня 2011
$lambda = function($value){
    return $this->real_escape_string($value);
};

В вашей функции lambda контекст не является вашим объектом, поэтому $ this недоступен.

В качестве альтернативы вы можете использовать, например:

$values = array_map('mysql_real_escape_string', $inserts)

или даже попробуйте:

$values = array_map( array($this, 'real_escape_string'), $inserts)

это не проверено, но * должно * работать ...

2 голосов
/ 07 июня 2011

Вы не можете использовать ключевое слово $ this в функции lamba, так как область действия функции не распространяется на объект, метод которого содержит лямбду

Попробуйте другой подход:

 public function getQuery($table, $inserts) 
 {
      $values = array_map(array($this, 'real_escape_string'),$inserts);
      $keys = array_keys($inserts);

      return sprintf('INSERT INTO %s (`%s`) VALUES ("%s")',
           $table,
           implode('`,`', $keys),
           implode('","', $values)
      );
    }

Добавление

Если real_escape_string не метод вашего объекта, а стандартный метод msqli, вам следует изменить строку

 $values = array_map(array($this, 'real_escape_string'),$inserts);

 $values = array_map(array(self::$_instance, 'real_escape_string'),$inserts);

для вызова метода real_escape string.

Массив array(self::$_instance, 'real_escape_string') является массивом обратного вызова и используется, когда вы хотите вызвать метод объекта,

В руководстве php указано

Метод экземпляра объекта передается как массив, содержащий объект с индексом 0 и имя метода с индексом 1

и self :: $ _ instance - это экземпляр mysqli, который вы хотите вызвать

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