我有一个数组,想要通过MySQLi->real_escape_string
对数组的每个成员应用array_walk
,但这不起作用:
array_walk($array, '$mysqli->real_escape_string');
它给出了这个错误:
警告:array_walk()期望参数2是有效的回调,函数'$ mysqli-> real_escape_string'未找到或在第69行的C:\ wamp \ www \ ts.tsp中无效的函数名称
$mysqli
是一个有效的对象,如果我对$mysqli->real_escape_string('anything')
进行其他操作,则可以正常工作。
我的问题:是否无法将对象的函数作为回调传递?或者我做错了什么。
重要提示:我知道我可以创建自己的回调函数并在其中实现$ mysqli-> real_escape_string BUT 我想知道是不是可以使用回调作为对象的功能?
答案 0 :(得分:9)
正如您可以在php callback页面上阅读,您将使用:
# produces an error
array_walk($array, array($msqli, 'real_escape_string'));
array_map($array, array($msqli, 'real_escape_string'));
答案 1 :(得分:9)
如果你在一个对象中调用一个方法你应该传入一个数组,第一个项目是对象/上下文,然后第二个应该是方法:
小例子
function callback()
{
//blah
}
以上称为函数,应该像这样调用:array_walk($array, 'callback');
class object()
{
public function callback()
{
}
}
上面的回调被称为一个方法,它实际上与一个函数相同但是因为它在一个类中它有一个父上下文,所以应该这样调用:
$object = new object();
array_walk($array, array($object , 'callback'));
MySQLi是一个面向对象的库,因此在初始化了mysqli对象后,你应该像这样调用“方法”:
array_walk($array, array($msqli, 'real_escape_string'));
同样如上所述,array_walk
会将键和值都移动到mysql对象中,这将导致完全转义,您应该使用array_map
来单独执行值:
array_map($array, array($msqli, 'real_escape_string'));
答案 2 :(得分:0)
array_walk只允许用户定义的函数作为回调传递,而不是核心PHP函数或方法。要做到这一点,我会尝试以下方法:
foreach($array as &$value) {
$value = $mysqli->real_escape_string($value);
}
通过引用传递值允许在foreach循环中修改它,导致数组的每个成员被转义。
答案 3 :(得分:0)
我发现this post在弄清楚如何使array_walk()
在类中的方法中工作时非常有用。将它添加到此线程中以防其他人使用。