Tous les exemples que je vois à l'aide de mysqli_fetch_Object Use mysql_query () code>, je ne peux pas l'obtenir pour travailler avec des déclarations préparées. Est-ce que quelqu'un sait ce qui ne va pas avec cet extrait de code, comme Fetch_Object retourne null.
preparing select 1 from dual
prepare statement created
num rows is 0
result_metadata exists
fetch object returns NULL
3 Réponses :
Je ne crois pas que l'interface fonctionne comme ça.
Aller par la documentation et des exemples ( http: //www.php. net / manuel / fr / mysqli.prepare.php ) Il semble que $ STMT-> exécuter () ne renvoie pas de résultatsset, mais un booléen indiquant le succès / échec ( http://www.php.net/manual/fr/mysqli-stmt.execute.php ) . Pour obtenir le résultat, vous devez lier les variables sur les résultatsset (après l'appel d'exécution) en utilisant $ stmt-> bind_result ( http://www.php.net/manual/fr/mysqli-stmt.bind-result.php ). P>
Après que vous ayez fait tout cela, vous pouvez effectuer des appels répétés à $ STMT-> récupérer () () pour remplir les variables liées avec les valeurs de colonne de la ligne actuelle. Je ne vois aucune mention de $ STMT-> FETCH_OBJECJECT () et je ne vois pas non plus comment cette interface pourrait fonctionner avec un schéma de liaison variable comme décrit. P>
C'est donc l'histoire du résultat "normal" Depuis des stations préparées de MySQLI. P>
Dans votre code, il y a quelque chose que je suppose que c'est une erreur, ou du moins je ne suis pas sûr que vous aviez l'intention de le faire. Vous ligne: P>
$result = $stmt->result_metadata();
Je veux utiliser fetch_Object, donc je n'ai pas à définir une classe et à lier explicitement les variables des membres. Je vais essayer de créer ma propre fetch_Object pour des déclarations préparées.
Ceci est le code que j'utilise pour créer un objet à partir d'une déclaration préparée. de
Il pourrait peut-être être utilisé dans une sous-classe de MySQLI?
$query = "SELECT * FROM category WHERE id = ?"; $stmt = $this->_db->prepare($query); $value = 1; $stmt->bind_param("i", $value); $stmt->execute(); // bind results to named array $meta = $stmt->result_metadata(); $fields = $meta->fetch_fields(); foreach($fields as $field) { $result[$field->name] = ""; $resultArray[$field->name] = &$result[$field->name]; } call_user_func_array(array($stmt, 'bind_result'), $resultArray); // create object of results and array of objects while($stmt->fetch()) { $resultObject = new stdClass(); foreach ($resultArray as $key => $value) { $resultObject->$key = $value; } $rows[] = $resultObject; } $stmt->close();
Extension de pilote natif MySQL ( MYSQLND ), a le Get_Result Méthode:
$stmt->execute(); $obj = $stmt->get_result()->fetch_object();
C'est une belle solution; Vous permet de récupérer des résultats de style avec $ obj-> db_field_name; code> etc., exactement ce que je cherchais, merci.
AVERTISSEMENT: cela ne fonctionne que si vous utilisez le pilote mysqlnd code>
Sûrement numériques devraient être> 0 si vous attendez un objet non nul pour être retourné?