2011-06-07 96 views
0

我有問題了解我的繼承有什麼問題。我不能調用父母的大部分功能。下面是我卡住的功能。小php面向對象的問題

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()函數的問題。我一直在使用$這個 - > real_escape_string()嘗試,但我只是看到這個錯誤

Fatal error: Using $this when not in object context in D:\wamp\www\Driver\MySQLi_DB.php on line 49

確定可能是可能是lambda表達式的限制,但我已經通過聲明回調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); 

請指出我在做錯的地方,最好的辦法是什麼。感謝

+0

哪裏是real_escape_string()函數? – 2011-06-07 05:14:59

+0

如果可能,你可以發佈MySQLi_DB.php的第49行嗎? – Babiker 2011-06-07 05:17:21

+0

多數民衆贊成在lambda函數 – 2011-06-07 05:20:34

回答

2

不能使用此關鍵字的$成蘭巴功能函數的範圍不會延伸到其方法包含拉姆達

嘗試不同的方法對象:

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字符串。

數組array(self::$_instance, 'real_escape_string')是一個callback array,它用於當你想調用一個對象方法。

PHP手冊狀態

一個實例化的對象的方法,作爲含有在索引0處的對象,並在索引1

和自所述方法名稱的數組傳遞:: $ _實例是例如mysqli的要呼叫

+0

線,你可以請告訴我,我還可以如何使用mysqli的real_escape_string。 – 2011-06-07 05:18:53

+0

@ g-molvi:編輯答案以迴應您的評論 – Eineki 2011-06-07 05:29:30

+0

感謝Eineki,那就是真正的解決方案 – 2011-06-07 05:56:18

3
$lambda = function($value){ 
    return $this->real_escape_string($value); 
}; 

在您的「拉姆達」功能的背景下是不是你的對象,所以這$不可用。

作爲替代方案,你可以使用,例如:

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

甚至嘗試:

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

這是未經測試,但* *應該工作...

+0

你搖滾的馬恩。它是令人驚歎的...你能教我什麼你的這一行是什麼意思(array($ this,'real_escape_string')? – 2011-06-07 05:22:29

+0

回調函數(傳遞給array_map的)可以是:函數,函數名,(對象,函數)的數組或者(靜態類名,靜態函數名)的數組, – 2011-06-07 06:21:13