Problème avec les requêtes préparées dans MYSQLI - Message précisé...

Petit nouveau ! | 4 Messages

07 sept. 2007, 19:59

J'essaie de faire exécuter une requête préparée avec mysqli. J'utilise PHP 5.2.0 et MySQL 5.0.27 (Wamp 1.6.6)

Après quelques tests, les requêtes préparées à partir des instructions MySQL telles que (INSERT, DELETE et UPDATE) fonctionnent très bien.

Le seul cas problème que j'ai remarqué, c'est l'instruction SELECT qui ne semble pas réagir de la bonne façon:
- SELECT * FROM table1 - Ne fonctionne pas
- SELECT C1, C2 FROM table1 - Ne fonctionne pas

Lorsque j'exécute le code suivant, la première partie retourne le bon résultat et non la deuxième...
Des idées???

CODE SOURCE
-----------------
$db = new mysqli($hote, $util, $mpas, $base); 
if (!$db) {
   echo "Connexion impossible à la base de données";
   exit();
}

//FONCTIONNE BIEN
echo 'Requête non préparée<br />';
$sql = "select * from ch9books"; 
$rqp = $db->query($sql); 
echo 'Rangées = '.$rqp->num_rows.'<br />';


//NE FONCTIONNE PAS
echo '<br />Requête préparée<br />';
$sql = "select * from ch9books"; 
$rqp = $db->prepare($sql);
$rqp->execute();
echo 'Rangées = '.$rqp->num_rows.'<br />';

// Fermeture de la connexion 
$rqp->close();
RÉSULTATS
-------------
Requête non préparée
Rangées = 6

Requête préparée
Rangées = 0
Pensez-vous que ça pourrait être un bogue de MySQL ?

Merci de répondre...

LMINFO
Modifié en dernier par lminfo le 08 sept. 2007, 19:34, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 sept. 2007, 20:52

Modération :
lminfo, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 4 Messages

12 sept. 2007, 21:10

J'ai trouvé ma solution à l'aide des gens de PHP.NET. Suivez le lien suivant...
http://ca3.php.net/manual/fr/function.m ... m-rows.php

Le système des requêtes paramétrées (préparées) fonctionne en mode non bufférisé par défaut. Donc une fonction comme mysqli_stmt_num_rows() ne retournera pas le bon résultat tant que les données n'auront pas été lues au complet.

Pour pourvoir obtenir le nombre de lignes avant la lecture, il faut appeler la méthode mysqli_stmt_store_result() qui stockera le résultat en mémoire. Ensuite, on pourra utiliser mysqli_stmt_num_rows() .

Voici alors la façon de faire...
...
echo '<br />Requête préparée<br />'; 
$sql = "select * from ch9books";  
$rqp = $db->prepare($sql); 
$rqp->execute(); 
$rqp->store_result(); // Récupère tous les résultats
echo 'Rangées = '.$rqp->num_rows.'<br />'; 
...
On pourra également fonctionner comme ceci en utilisant un compteur interne...
...
echo '<br />Requête préparée<br />'; 
$sql = "select * from ch9books";  
$rqp = $db->prepare($sql); 
$rqp->execute(); 
$rqp->bind_result ($isbn, $auteur,  $titre, $prix);
$cpt = 0; // COmpteur interne
echo '<table border="1" cellpadding="5">';
while ($rqp->fetch()) { // Récupère les résultats 1 à 1
   $cpt++;
   echo '<tr>';
   echo '<td>'.»$isbn.'</td>';
   echo '<td>'.$auteur.'</td>';
   echo '<td>'.$titre.'</td>';
   echo '<td>'.$prix.'</td>';
   echo '</tr>';
}
echo '</table>';

echo '<br />Rangées = '.$cpt.'<br />'; 
...
Alors, attention en consultant les livres PHP sur le sujet (i.e. PHP 5 Avancé - 2e édition - Daspet & de Geyer, ---, PHP 5 & MySQL 5 - Welling & Thomson ), la plupart ne font pas mention de ce comportement lorsqu'ils abordent la fonction mysqli_stmt_num_rows().