views:

25

answers:

3

I have an array and want to apply MySQLi->real_escape_string on every member of the array through array_walk but this is not working:

array_walk($array, '$mysqli->real_escape_string');

It gives this error:

Warning: array_walk() expects parameter 2 to be a valid callback, function '$mysqli->real_escape_string' not found or invalid function name in C:\wamp\www\ts.php on line 69

$mysqli is a valid object and works fine if I do $mysqli->real_escape_string('anything') on anything else.

My Question: Is it not possible to pass object's functions as callback ? Or am I doing something wrong.


IMPORTANT: I know I can create my own callback function and implement $mysqli->real_escape_string in it BUT I want to know is it not possible to use callback as an object's function ?

+2  A: 

As you can read on php callback page, you shall use:

# produces an error
array_walk($array, array($msqli, 'real_escape_string'));
array_map($array, array($msqli, 'real_escape_string'));
Aif
Nope, doesn't work. It says: `Warning: array_walk() expects parameter 2 to be a valid callback, non-static method mysqli::real_escape_string() cannot be called statically`
WhatIsOpenID
That was with quotes and when using EXACTLY how you wrote, it says: `Warning: mysqli::real_escape_string() expects exactly 1 parameter, 2 given`
WhatIsOpenID
With array_map, it seems to work (http://www.php.net/manual/en/function.array-map.php#63279)
Aif
Yes, `array_map` worked. Thanks mate.
WhatIsOpenID
A: 

array_walk will only allow a user defined function to be passed as the callback, not a core PHP function or method. To do this I would try the following:

foreach($array as &$value) {
    $value = $mysqli->real_escape_string($value);
}

Passing the value by reference allows it to be modified within the foreach loop, resulting in each member of the array being escaped.

Jeremy
I know I can do that. I am just asking is there no way to pass non-static methods ?
WhatIsOpenID
The problem is with array_walk as it can only be used with a user defined function or method. Try array_map as Aif suggests, passing the object and method name as an array as Aif also suggests.
Jeremy
A: 

If your calling a method within an object you should pass in an array, first item being the object / context and then second should be the method:

Small example

function callback()
{
   //blah
}

the above is called a function and should be called like so: array_walk($array, 'callback');

class object()
{
    public function callback()
    {
    }
}

the above callback is called a method, its practically the same as a function but because its within a class it has a parent context, so should be called like so:

$object = new object();
array_walk($array, array($object , 'callback'));

MySQLi is an object orientated library so after you have initialized your mysqli object you should call the "method" like so:

array_walk($array, array($msqli, 'real_escape_string'));

Also as mentioned above, array_walk will walk both key and value into the mysql object witch will cause in exact escaping, you should use array_map to walk the values alone:

array_map($array, array($msqli, 'real_escape_string'));

RobertPitt