9
votes

Est-il possible d'utiliser mysqli_fetch_Object avec une déclaration préparée

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


1 commentaires

Sûrement numériques devraient être> 0 si vous attendez un objet non nul pour être retourné?


3 Réponses :


0
votes

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();


1 commentaires

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.



11
votes

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();


0 commentaires

10
votes

Extension de pilote natif MySQL ( MYSQLND ), a le Get_Result Méthode:

$stmt->execute();
$obj = $stmt->get_result()->fetch_object();


2 commentaires

C'est une belle solution; Vous permet de récupérer des résultats de style avec $ obj-> db_field_name; etc., exactement ce que je cherchais, merci.


AVERTISSEMENT: cela ne fonctionne que si vous utilisez le pilote mysqlnd