Mari Masuda
2011-12-16 21:11:14 UTC
Hello,
I am having trouble figuring out how to properly bind the results of a mysqli prepared statement using call_user_func_array.
I have an "AbstractModel" abstract class and within the class is a method called "load" that takes the primary key of the desired item and retrieves and loads the data from the database into the object.
abstract class AbstractModel {
// lots of stuff omitted
// this is just a rough draft so no error checking is implemented
// $db is a subclass of mysqli
// $primaryKeyAsTypedItem is an object that holds a type (int, float, string, etc.) and value
public function load($db, $primaryKeyAsTypedItem) {
$query = "SELECT * FROM " . $this->tableName . " WHERE " . $this->primaryKeyName . "=?";
$ps = $db->prepare($query);
$type_string = $primaryKeyAsTypedItem->getTypeAbbreviation();
$value = $db->escapeSql($primaryKeyAsTypedItem->getValue());
$ps->bind_param($type_string, $value);
$ps->execute();
$ps->store_result();
$metadata = $ps->result_metadata()->fetch_fields();
$params = array();
foreach ($metadata as $object) {
$params[$object->orgname] = null;
}
call_user_func_array(array($ps, 'bind_result'), $params);
$ps->fetch();
// see what is going on
print "<pre>";
var_dump($params);
print "</pre>";
// more stuff omitted
}
}
The problem I am having is that mysqli_stmt::bind_result expects a list of individual variables to which the results are bound, not just an array with the proper number of available indices. I have done a lot of Googling and tried following the advice I found at [1], [2], [3], etc. but I was not successful in getting this to work. I don't know how I can generically "expand" $params so that this will work for different tables with different fields. Any pointers greatly appreciated.
[1] http://forums.devshed.com/php-development-5/mysqli-bind-result-to-return-array-568982.html
[2] http://www.charles-reace.com/blog/2009/04/28/mysqli-avoiding-bind_result-for-every-column/
[3] http://us.php.net/manual/en/mysqli-stmt.bind-result.php#102179
I am having trouble figuring out how to properly bind the results of a mysqli prepared statement using call_user_func_array.
I have an "AbstractModel" abstract class and within the class is a method called "load" that takes the primary key of the desired item and retrieves and loads the data from the database into the object.
abstract class AbstractModel {
// lots of stuff omitted
// this is just a rough draft so no error checking is implemented
// $db is a subclass of mysqli
// $primaryKeyAsTypedItem is an object that holds a type (int, float, string, etc.) and value
public function load($db, $primaryKeyAsTypedItem) {
$query = "SELECT * FROM " . $this->tableName . " WHERE " . $this->primaryKeyName . "=?";
$ps = $db->prepare($query);
$type_string = $primaryKeyAsTypedItem->getTypeAbbreviation();
$value = $db->escapeSql($primaryKeyAsTypedItem->getValue());
$ps->bind_param($type_string, $value);
$ps->execute();
$ps->store_result();
$metadata = $ps->result_metadata()->fetch_fields();
$params = array();
foreach ($metadata as $object) {
$params[$object->orgname] = null;
}
call_user_func_array(array($ps, 'bind_result'), $params);
$ps->fetch();
// see what is going on
print "<pre>";
var_dump($params);
print "</pre>";
// more stuff omitted
}
}
The problem I am having is that mysqli_stmt::bind_result expects a list of individual variables to which the results are bound, not just an array with the proper number of available indices. I have done a lot of Googling and tried following the advice I found at [1], [2], [3], etc. but I was not successful in getting this to work. I don't know how I can generically "expand" $params so that this will work for different tables with different fields. Any pointers greatly appreciated.
[1] http://forums.devshed.com/php-development-5/mysqli-bind-result-to-return-array-568982.html
[2] http://www.charles-reace.com/blog/2009/04/28/mysqli-avoiding-bind_result-for-every-column/
[3] http://us.php.net/manual/en/mysqli-stmt.bind-result.php#102179
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php