php - une - passer de mysql à mysqli




PHP+MYSQLI: Paramètre variable/liaison de résultat avec des instructions préparées (3)

Dans un projet que je suis sur le point de conclure, j'ai écrit et implémenté une solution de mapping objet-relationnel pour PHP. Avant que les sceptiques et les rêveurs crient «comment diable?», Détendez-vous - je n'ai pas trouvé un moyen de faire du travail de liaison statique en retard - je suis juste en train de contourner le problème de la meilleure façon possible.

Quoi qu'il en soit, je n'utilise pas actuellement d'instructions préparées pour l'interrogation, parce que je ne pouvais pas trouver un moyen de passer un nombre variable d'arguments aux bind_params() ou bind_result() .

Pourquoi dois-je soutenir un nombre variable d'arguments, demandez-vous? Parce que la superclasse de mes modèles (pensez à ma solution en tant que wannabe PHP ActiveRecord piraté) est l'endroit où l'interrogation est définie, et donc la méthode find (), par exemple, ne sait pas combien de paramètres il faudrait lier .

Maintenant, j'ai déjà pensé à construire une liste d'arguments et à passer une chaîne à eval (), mais je n'aime pas beaucoup cette solution - je préfère simplement mettre en œuvre mes propres contrôles de sécurité et transmettre des instructions.

Quelqu'un at-il des suggestions (ou des histoires de réussite) sur la façon d'y parvenir? Si vous pouvez m'aider à résoudre ce premier problème, nous pourrons peut-être nous attaquer au jeu de résultats (quelque chose que je soupçonne sera plus difficile, ou au moins plus gourmand en ressources s'il implique une requête initiale pour déterminer la structure du tableau).


En PHP, vous pouvez passer un nombre variable d'arguments à une fonction ou une méthode en utilisant call_user_func_array . Un exemple pour une méthode serait:

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

La fonction sera appelée avec chaque membre du tableau passé comme son propre argument.


Je ne suis pas autorisé à modifier, mais je crois au code

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

La référence devant $ stmt n'est pas nécessaire. Puisque $stmt est l'objet et bindparams est la méthode dans cet objet, la référence n'est pas nécessaire. CA devrait etre:

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

Pour plus d'informations, consultez le manuel PHP sur les fonctions de rappel . "


Vous devez vous assurer que $ array_of_params est un tableau de liens vers des variables , pas des valeurs elles-mêmes. Devrait être:

$array_of_params[0] = &$param_string; //link to variable that stores types

Et alors...

$param_string .= "i";
$user_id_var = $_GET['user_id'];//
$array_of_params[] = &$user_id_var; //link to variable that stores value

Sinon (si c'est un tableau de valeurs), vous obtiendrez:

PHP Attention: Le paramètre 2 à mysqli_stmt :: bind_param () devrait être une référence

Un autre exemple:

$bind_names[] = implode($types); //putting types of parameters in a string
for ($i = 0; $i < count($params); $i++)
{
   $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3...
   $$bind_name = $params[$i]; //create a variable with this name and put value in it
   $bind_names[] = & $$bind_name; //put a link to this variable in array
}

et BOOOOOM:

call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 






mysqli