2013-05-03 5 views
6

Je veux comprendre que Qu'est-ce que mysqli_store_result fait? Lorsque je me suis rendu le PHP Manual de mysqli_store_result, j'ai trouvé le definitonQue fait réellement mysqli_store_result()?

mysqli_store_result — Transfers a result set from the last query 

La question est où elle transfère le jeu de résultats? En fait, je recevais l'erreur "Commands out of sync; you can't run this command now" après l'exécution mysqli_multi_query Mais quand j'ai utilisé la méthode suivante, l'erreur disparue.

mysqli_multi_query($connection,$query); 

do 
{ 
    mysqli_store_result($connection); 
} 
while(mysqli_next_result($connection)); 

Maintenant, Dois-je utiliser ce mysqli_store_result($connection) et mysqli_next_result($connection) après chaque mysqli_query ou juste après mysqli_multi_query Parce que j'ai lu en PHP Manaul que

« Bien qu'il soit toujours bon de libérer la mémoire utilisée par le résultat d'une requête en utilisant la fonction mysqli_free_result(), quand transférer de grands ensembles de résultats en utilisant le mysqli_store_result() ce devient particulièrement important. "

Source: PHP: mysqli_store_result

One More Question Surgit Quand j'exécutais l'mentionné ci-dessus mysqli_multi_query($connection,$query); je mets une déclaration echo 'storing result <br />' comme ci-dessous

do 
{ 
    echo 'storing result <br /> 
    mysqli_store_result($connection); 
} 
while(mysqli_next_result($connection)); 

Bien qu'il n'y avait que deux requêtes INSERT dans la requête $, mais Il a donné la sortie suivante

storing result 
storing result 
storing result 
storing result 

Cela signifie que quatre ensembles de résultats ont été transférés. Je ne peux pas comprendre cette situation. Une dernière question. Est-ce que le processus do while mentionné ci-dessus affecte la performance?

+0

S'il vous plaît publier votre 'string $ query' qui produit le résultat inattendu. – mickmackusa

Répondre

0

En fait, il récupérera l'ensemble des résultats de MySQL. Vous pouvez ensuite mysqli_data_seek() pour vous déplacer vers une ligne particulière de l'ensemble. Cela signifie que tous les résultats seront stockés du côté php après le premier appel, et les appels suivants demanderont simplement les résultats de php

+0

Mais quel résultat pourrait être après une instruction INSERT INTO. Une autre question, c'est la performance efficace? – Munib

+0

Si vous avez plusieurs requêtes à exécuter avec un nombre de lignes inconnu, vous constaterez une augmentation significative et significative de l'efficacité, ainsi qu'un abaissement de la charge de travail totale sur le serveur - en particulier si vous faites tout cela sur un seul boîte. –

+0

Pour insérer je ne pense pas que vous avez besoin de stocker. Vous pouvez stocker des résultats qui sont très constants comme dans le cas d'une implémentation simple de la liste des pays que vous voulez de db, ce résultat vous pouvez stocker dans la variable store_result et ensuite l'utiliser pour que vous n'ayez pas besoin de faire des appels –

5

Les commentaires précédents ont indiqué que mysqli_store_result ne doit pas être utilisé avec les instructions INSERT, mais personne n'a mentionné la fonction appropriée: mysqli_affected_rows(). Si votre instruction renvoie un jeu d'enregistrements et que vous souhaitez le vérifier numériquement, utilisez mysqli_num_rows().

Si vous traitez avec un mélange, cela pourrait vous aider à démarrer:

$queries[]="INSERT INTO TestTable (Column1) VALUES ('TEST1')"; 
$queries[]="SELECT * FROM TestTable WHERE Column1 LIKE 'TEST%'"; 
$queries[]="INSERT INTO TestTable (Column1) VALUES ('TEST2')"; 
$queries[]="SELECT * FROM TestTable WHERE Column1 LIKE 'TEST%'"; 
$queries[]="DELETE FROM TestTable WHERE Column1 LIKE 'TEST%'"; 

if(mysqli_multi_query($con,implode(';', $queries))){ 
    do{ 
     if($result=mysqli_store_result($con)){ 
      echo "Selected rows = ".mysqli_num_rows($result)."<br><br>"; 
      mysqli_free_result($result); 
     }else{ 
      $cumulative_rows+=$aff_rows=mysqli_affected_rows($con); 
      echo "Current Query's Affected Rows = $aff_rows, Cumulative Rows = $cumulative_rows<br><br>"; 
     } 
    } while(mysqli_more_results($con) && mysqli_next_result($con)); 
} 

Sorties:

actuel des requêtes rows affected de = 1, lignes affectées cumulées = 1

lignes selected = 1

Lignes affectées par la requête actuelle = 1, lignes affectées cumulatives = 2

lignes selected = 2

rows affected actuelle de requêtes = 2, lignes affectées cumulées = 4

+0

@Munib si ma réponse répond à votre question s'il vous plaît lui attribuer la coche verte. Si quelque chose n'est toujours pas clair, laissez-moi un commentaire et je vais essayer de corriger ma réponse. Obtenons une résolution sur cette question. – mickmackusa

Questions connexes