PHP mysqli wrapper: passing by reference with __call() and call_user_func_array()

Posted by Dave on Stack Overflow See other posts from Stack Overflow or by Dave
Published on 2010-04-02T11:04:24Z Indexed on 2010/04/02 11:13 UTC
Read the original article Hit count: 400

Filed under:
|
|
|

Hi everyone. I'm a long running fan of stackoverflow, first time poster. I'd love to see if someone can help me with this. Let me dig in with a little code, then I'll explain my problem. I have the following wrapper classes:

class mysqli_wrapper
{
    private static $mysqli_obj;
    function __construct() // Recycles the mysqli object
    {
        if (!isset(self::$mysqli_obj))
        {
            self::$mysqli_obj = new mysqli(MYSQL_SERVER, MYSQL_USER, MYSQL_PASS, MYSQL_DBNAME);
        }
    }
    function __call($method, $args)
    {
        return call_user_func_array(array(self::$mysqli_obj, $method), $args);
    }
    function __get($para)
    {
        return self::$mysqli_obj->$para;
    }
    function prepare($query) // Overloaded, returns statement wrapper
    {
        return new mysqli_stmt_wrapper(self::$mysqli_obj, $query);
    }
}

class mysqli_stmt_wrapper
{
    private $stmt_obj;
    function __construct($link, $query)
    {
        $this->stmt_obj = mysqli_prepare($link, $query);
    }
    function __call($method, $args)
    {
        return call_user_func_array(array($this->stmt_obj, $method), $args);
    }
    function __get($para)
    {
        return $this->stmt_obj->$para;
    }
    // Other methods will be added here
}

My problem is that when I call bind_result() on the mysqli_stmt_wrapper class, my variables don't seem to be passed by reference and nothing gets returned. To illustrate, if I run this section of code, I only get NULL's:

$mysqli = new mysqli_wrapper;

$stmt = $mysqli->prepare("SELECT cfg_key, cfg_value FROM config");
$stmt->execute();
$stmt->bind_result($cfg_key, $cfg_value);

while ($stmt->fetch())
{
    var_dump($cfg_key);
    var_dump($cfg_value);
}
$stmt->close();

I also get a nice error from PHP which tells me: PHP Warning: Parameter 1 to mysqli_stmt::bind_result() expected to be a reference, value given in test.php on line 48


I've tried to overload the bind_param() function, but I can't figure out how to get a variable number of arguments by reference. func_get_args() doesn't seem to be able to help either.

If I pass the variables by reference as in $stmt->bind_result(&$cfg_key, &$cfg_value) it should work, but this is deprecated behaviour and throws more errors.

Does anyone have some ideas around this? Thanks so much for your time.

© Stack Overflow or respective owner

Related posts about php

Related posts about mysqli