[RESOLU] Barre de progression requète mysql

Eléphant du PHP | 138 Messages

28 sept. 2018, 23:49

Youp ! :)

Je souhaite faire une barre de progression pour indiquer l'état d'avancement d'une requête mysql. Malhreuseuement, le script que j'ai fais ne fonctionne pas.

Voilà le fichier contenant la requète , dnas lequel je commence par vider la table category, pour ensuite la remplir en lisant la table category d'une autre base :

Code : Tout sélectionner

header('Content-Type: text/json'); //Table catergory $queryx = "TRUNCATE TABLE category"; $resultx = mysql_query($queryx, $dbwrite); $i = 0; $query = "SELECT * FROM category"; $results=mysql_query($query,$opened_db); $num_rows = mysql_num_rows($results); while($row=mysql_fetch_row($results)){ $data = array(); $i++; $percent = intval($i/$num_rows * 100); $ID = addslashes($row[0]); $name = addslashes($row[1]); mysql_query("INSERT INTO category (ID, name) VALUES ('$ID', '$name')",$dbwrite); $data = array( 'pourcentage' => $percent ); echo json_encode($data); }
Si je lance directement ce fichier, j'ia bien d'affiché les valeurs :
{"pourcentage":2}{"pourcentage":5}{"pourcentage":7} ...ect ect... {"pourcentage":94}{"pourcentage":97}{"pourcentage":100}
Voici les parties concernées, dans la page depuis laquelle je lance le fichier de requête, via un bouton :
Dans le head :

Code : Tout sélectionner

<script> $(function() { var pourcentage; pourcentage = 00; $('#category').click(function () { document.getElementById('category').disabled = 'disabled'; $.get("synctablecategory.php", function(data){ pourcentage = data.pourcentage; }); }); $( "#progressbar" ).progressbar({ value:pourcentage }); }); </script>
puis dans le body :

Code : Tout sélectionner

<input type="button" id="category" value='Table "category"' /> <div id="progressbar" >
Lorsque je clique sur le bouton Table "category", la requête s'exécute bien puisque la table en question se remplie, mais la barre de progression n'apparait pas du tout.

Si je fixe arbitrairement une valeur fixe à la progressbar (par exemple value:37 à la place de value:pourcentage), elle apparait bien, remplie à 37%.

Du coup, le canard patauge lol et aurait besoin d'un petit coup de palme :D

Merci et bon Ouiken ;)
Un Couin vaut mieux que Deux tu couineras :D

Eléphant du PHP | 138 Messages

29 sept. 2018, 05:15

Re,

Après moults recherches, je suis tombé sur cette page :
https://www.htmlgoodies.com/beyond/php/ ... ripts.html
Avec un peu d'adaptation, ca répond parfaitement à mon besoin :)
Je posterais le code adapté certainement ce WE :)
Un Couin vaut mieux que Deux tu couineras :D

Eléphant du PHP | 138 Messages

30 sept. 2018, 03:34

PloP !

Alors voilà le script adapté.
Une page sauvetable.php par exemple , avec dans le head :

Code : Tout sélectionner

<link rel="stylesheet" href="//apps.bdimg.com/libs/jqueryui/1.10.4/css/jquery-ui.min.css"> <script src="//apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script> <script src="//apps.bdimg.com/libs/jqueryui/1.10.4/jquery-ui.min.js"></script> <link rel="stylesheet" href="jqueryui/style.css"> <script> function startTask(table) { document.getElementById(table).disabled = 'disabled'; fichier = 'sse_progress_' +table + '.php'; es = new EventSource(fichier); es.addEventListener('message', function(e) { var result = JSON.parse( e.data ); if(e.lastEventId == 'CLOSE') { es.close(); var pBar = document.getElementById('progressor'+table); pBar.value = pBar.max; //max out the progress bar var perc = document.getElementById('percentage'+table); perc.innerHTML = "100% de " + result.message + " lignes"; } else { var pBar = document.getElementById('progressor'+table); pBar.value = result.progress; var perc = document.getElementById('percentage'+table); perc.innerHTML = result.progress + "% de " + result.message + " lignes"; perc.style.width = (Math.floor(pBar.clientWidth * (result.progress/100)) + 15) + 'px'; } }); } </script>
Dans le body :

Code : Tout sélectionner

<input type="button" style="width:150" id="songs" onclick="startTask('songs');" value="Table 'songs'" /> <progress id='progressorsongs' value="0" max='100' style=""></progress> <span id="percentagesongs" style="text-align:left; display:inline; margin-top:5px;"></span>
A noter que pour le moment je n’ai pas épluché la nécessité des fichiers js et css .

Et une page sse_progress_songs.php avec dedans :

Code : Tout sélectionner

header('Content-Type: text/event-stream'); // recommended to prevent caching of event data. header('Cache-Control: no-cache'); function send_message($id, $message, $progress) { $d = array('message' => $message , 'progress' => $progress); echo "id: $id" . PHP_EOL; echo "data: " . json_encode($d) . PHP_EOL; echo PHP_EOL; ob_flush(); flush(); }
Puis la requête avec boucle while :

Code : Tout sélectionner

$i = 0; $r = 0; $query = "SELECT * FROM songs"; $results=mysql_query($query,$opened_db); $num_rows = mysql_num_rows($results); while($row=mysql_fetch_row($results)){ $i++; $blablabla = $row[0]; etc etc ... mysql_query("INSERT INTO songs (blablabla) VALUES ('$blablabla')",$dbwrite); if ($r >= 100) { send_message($i, $num_rows , round($i*100/$num_rows) ); usleep(20000); $r = 0; } $r++; }
Notons dans le cas présent que je SELECT une table pour la copier dans une autre, ce qui me permet d'avoir le nombre de lignes totales à traiter et donc de déduire le pourcentage d'avancement.
Notons également que, j'envoie l'info de pourcentage effectué, toutes les 100 lignes, car avec avec plus de 7400 lignes, le truc perd les pédales au bout de quelques % .
A adapter au besoin .Concernant une autre table ayant 1000 lignes seulement j'ai mis 10 au lieu de 100.
Ca permet de rester assez précis sans crouter le bin's lol
Possible également que le usleep ne soit pas indispensable.

Et au final, on envoie le message de fin :

Code : Tout sélectionner

send_message('CLOSE', $num_rows);
En effet, ce dernier permet de bien terminer le travail et d'afficher les 100% et barre complète . Sans lui, on a pas 100% si le nombre de ligne à traiter n'est pas un multiple de "100" (dans le if if $r du cas présent).

Voilà, ce n'est peut-être pas la solution la plus propre mais elle répond à mon besoin et c'est surtout la seule que j'ai trouvé sans passer par des curl et autres étrangetés lol

A tôbien ! :D
Couin
Un Couin vaut mieux que Deux tu couineras :D