我有问题了解我的继承有什么问题。我只是无法调用父级的大部分功能。下面是我被卡住的功能。
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 on 第49行
ok可能是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 :(得分:3)
$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)
这是未经测试但*应该*工作......
答案 1 :(得分:2)
您不能将$ this关键字用于lamba函数,因为函数的范围不会扩展到其方法包含lambda的对象
尝试不同的方法:
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')
是callback array,当您想要调用对象方法时使用它。
php手册说明
实例化对象的方法作为数组传递,该数组包含索引为0的对象和索引为1的方法名
和self :: $ _ instance是要调用的mysqli实例