Я давний поклонник stackoverflow, первый постер. Я хотел бы посмотреть, может ли кто-нибудь помочь мне с этим. Позвольте мне покопаться с небольшим кодом, и я объясню свою проблему. У меня есть следующие классы оболочки:
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
}
Моя проблема в том, что когда я вызываю bind_result()
в классе mysqli_stmt_wrapper
, мои переменные не передаются по ссылке и ничего не возвращается. Для иллюстрации, если я запускаю этот раздел кода, я получаю только NULL:
$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();
Я также получаю приятную ошибку от PHP, которая говорит мне: PHP Warning: Parameter 1 to mysqli_stmt::bind_result() expected to be a reference, value given in test.php on line 48
Я пытался перегрузить функцию bind_param()
, но не могу понять, как получить переменное число аргументов по ссылке. func_get_args()
, похоже, тоже не может помочь.
Если я передам переменные по ссылке, как в $stmt->bind_result(&$cfg_key, &$cfg_value)
, это должно сработать, но это устаревшее поведение и выдает больше ошибок.
У кого-нибудь есть идеи по этому поводу? Большое спасибо за ваше время.