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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème avec les requêtes préparées dans MYSQLI - Message précisé...

par lminfo » 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().

par zeus » 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

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

par lminfo » 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