Prev: filter_var_array: apply multiple filters to one field
Next: CFP for Surge Scalability Conference 2010
From: =?ISO-8859-15?Q?Jakob_G=FCnther?= on 2 Jul 2010 11:25 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
From: =?ISO-8859-15?Q?Jakob_G=FCnther?= on 2 Jul 2010 11:49 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 > >
From: Adam Richardson on 2 Jul 2010 13:36 On Fri, Jul 2, 2010 at 11:49 AM, Jakob Günther <MACguell(a)web.de> 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 P.S. Sorry for the duplicate reply, Jakob, I forgot to reply to the entire list the first time :( -- Nephtali: PHP web framework that functions beautifully http://nephtaliproject.com
From: =?ISO-8859-1?Q?Jakob_G=FCnther?= on 5 Jul 2010 07:35
Am 02.07.2010 19:34, schrieb Adam Richardson: > On Fri, Jul 2, 2010 at 11:49 AM, Jakob G�nther <MACguell(a)web.de > <mailto:MACguell(a)web.de>> 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()); } //... } |