Je suis un fan de stackoverflow depuis longtemps, affiche de première fois. J'aimerais voir si quelqu'un peut m'aider avec ça. Permettez-moi de creuser avec un petit code, puis je vais expliquer mon problème. Je les classes d'emballage suivantes:PHP mysqli wrapper: passage par référence avec __call() et call_user_func_array()
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
}
Mon problème est que quand je l'appelle bind_result()
la classe mysqli_stmt_wrapper
, mes variables ne semblent pas être passé par référence et rien est renvoyée. Pour illustrer, si je lance cette section de code, je ne reçois NULL de:
$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();
Je reçois aussi une erreur agréable de PHP qui me dit: PHP Warning: Parameter 1 to mysqli_stmt::bind_result() expected to be a reference, value given in test.php on line 48
J'ai essayé de surcharger le bind_param()
fonction, mais je ne peux pas comprendre comment obtenir un nombre variable d'arguments par référence. func_get_args()
ne semble pas être en mesure d'aider non plus.
Si je passe les variables par référence comme dans $stmt->bind_result(&$cfg_key, &$cfg_value)
cela devrait fonctionner, mais c'est un comportement obsolète et jette plus d'erreurs.
Est-ce que quelqu'un a des idées à ce sujet? Merci beaucoup pour votre temps.
Pourquoi la nécessité d'une classe d'emballage et non choisir d'étendre directement la classe mysqli? On dirait que tu te fais du mal avec toi-même? 'class my_db extends mysqli {}' – ChrisR
La raison pour laquelle je ne veux pas étendre la classe 'mysqli', c'est parce que je devrais appeler' parent :: __ construct() 'et ensuite je ne pourrais pas recycler l'unique objet 'mysqli'. Ce à quoi je ne pensais pas, cependant, était d'étendre l'objet 'mysqli_stmt' que je reçois de la méthode' prepare'. Merci quand même pour l'entrée. – Dave