Re: Delegating variable-length argument lists

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 02.07.2010 19:34, schrieb Adam Richardson:
> On Fri, Jul 2, 2010 at 11:49 AM, Jakob Günther <MACguell@xxxxxx
> <mailto:MACguell@xxxxxx>> wrote:
>
>
>     I did not find a solution, so i tried passing a array with references.
>
>     $arr = array(&$a, &$b);
>     bind_param("ii", $arr);
>
>     function bind_param($types, $arr){
>            array_unshift($arr, $types);
>            call_user_func_array (array ($stmt, 'bind_param'), $arr);
>     }
>
>     This worked in a test-case in one file. But if i call the
>     bind-param-method
>     from another class it did not work. Do you have any suggestions on
>     this?
>
>
>     Am 02.07.2010 17:25, schrieb Jakob Günther:
>     > Hi,
>     >
>     > i'm writing a custom wrapper for the mysqli_stmt class. I have to
>     > override the method mysqli_stmt::bind_param. This function uses
>     > "variable-length argument lists". In my function i want to
>     delegate its
>     > arguments to the original function.
>     >
>     > My first naiv implementation was that:
>     >
>     > function bind_param($types) {
>     >       $sParams=array();
>     >         $first=true;
>     >         for($i=1; i < func_num_args(); $i++) {
>     >             $sParams[] = func_get_arg($i);
>     >         }
>     >
>     >       array_unshift ($sParams ,$types);
>     >         call_user_func_array (array ($this->mysqli_stmt,
>     'bind_param'),
>     >               $sParams);
>     > }
>     >
>     > But this is not working, because  I need to pass it by reference. Is
>     > there a way to retrieve references to a variable number of
>     arguments?
>     >
>     > Thx, Jakob
>     >
>     >
>
>
>     --
>     PHP General Mailing List (http://www.php.net/)
>     To unsubscribe, visit: http://www.php.net/unsub.php
>
>
> Hi Jakob,
>
> Try looking at this page:
> http://www.php.net/manual/en/mysqli-stmt.bind-param.php
>
> Specifically, search for a comment by 'gregg at mochabomb dot com', in
> which Gregg presents a simple wrapper class and deals with the
> referencing issue the same way you did, by setting array values by
> reference.
>
> I point this out as perhaps seeing the code will give you a clue as to
> why your code had issues in your second test.  If you want help
> figuring out what's causing trouble, try posting some of the other
> code (at least the class and instance vars, connection method, and the
> query method(s)) contained within the class.
>
> Adam
>
> -- 
> Nephtali:  PHP web framework that functions beautifully
> http://nephtaliproject.com
Hi Adam,

thanks for your suggestion. It helped me debugging my issue. The
src-code i send was correct, of cause because it worked in the
test-case, but there was a strange behavior with, what i think, the
scope of my connection-wrapping-class. If you're not interested dont
move on reading, because it works for me now. I'm only interested what
the problem realy was.

There has been three classes involved: Mysqli_Wrapper a wrapper-class
for the mysqli-connection, Prepared_Stmt_Wrapper a wrapper class for the
statement and a PhpUnit TestCase, see all classes below. The Testcase
will fail if the new created connection in the setUp-method is not saved
as a attribute. I would really like to know the reason. My guess is
something connected with the scope of variable, but if yes is there
documentation about that?

Thank you very much, Jakob

Connection-wrapping class:
class Mysqli_Wrapper {
 var $mysqli;
 //...
 function __construct() {
     $this->mysqli = new mysqli( |DB_HOST, DB_USER, DB_PASSWORD, DB_NAME| );
 }

 function prepare($sql) {
    //...
    $stmt = $this->mysqli->prepare($sql);
    //...   
    return new Prepared_Stmt_Wrapper($stmt);
 }
 //...
}

Then a Wrapper for the prepared statement:

class Prepared_Stmt_Wrapper {
    var $mysqli_stmt;
    //...
    public function  __construct($mysqli_stmt) {
        $this->mysqli_stmt = $mysqli_stmt;
    }

    public function bind_param($types, $arr) {
        array_unshift($arr, $types);
        call_user_func_array (array($this->mysqli_stmt,'bind_param'),$arr);
    }

    public function execute() {
        $this->mysqli_stmt->execute();
    }


    public function store_result() {
        $this->mysqli_stmt->store_result();
    }

    public function num_rows() {
        return $this->mysqli_stmt->num_rows();
    }
    //...
}

And now the not-working test-case with the working code commented out.
class Prepared_Statement_Test extends PHPUnit_Framework_TestCase {

    protected $stmt;
    // protected $db;

    protected function setUp() {
        // $this->db = new Mysqli_Wrapper();
        // $this->stmt = $this->db->prepare("Select * from users where
user_id_1=? and user_id_2=?");

        $db = new Mysqli_Wrapper();
        $this->stmt = $db->prepare("Select * from users where
user_id_1=? and user_id_2=?");
    }

    protected function tearDown() {
        // $this->db->close();
    }

    public function testBind_param() {


        $a = -1;
        $b = -1;
        $this->stmt->bind_param('ii', array(&$a, &$b));

        $a = 80000;
        $b = 1;

        $this->stmt->execute();
        $this->stmt->store_result();
        printf("Number of rows: %d.\n",$this->stmt->num_rows());
        $this->assertEquals(1,$this->stmt->num_rows());

    }
    //...
}






[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux