2011-06-07 88 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