Each *value* in the array must be a reference to an existing variable--they cannot be null or direct values. I didn't try this with bind_param(), but I create a function that takes reference arguments and got it to work with call_user_func_array(): function foo(&$x, &$y) { $x *= 2; $y *= 3; } $x = 2; $y = 1; $params = array(&$x, &$y); call_user_func_array('foo', $params); var_dump($p); array(2) { [0]=> &int(4) [1]=> &int(3) } Try changing the loop where you package up the $params array. I'm not exactly sure what that part in your code is supposed to do, but I believe that you have a result set where each column name is the name of a property in the AbstractModel subclass. foreach ($metadata as $object) { $field = $object->orgname; $params[] = &$this->$field; } If that's not the case, you can create a $values array to receive the actual values from the result set and have the $params array hold references to those values. $values = array(); foreach ($metadata as $object) { $field = $object->orgname; $params[$field] = null; $params[] = &$values[$field]; } Peace, David