Souci en php demande de fonction
Alain_42 Messages postés 5413 Statut Membre -
Je me permets de poster sur ce forum car je ne trouve pas la solution à un de mes problème en php.
Je temporise une boucle while qui affiche entrée par entrée une base de donnée :
$sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' ");
//affichage de la page en question :
while($row = mysql_fetch_array($sql, MYSQL_ASSOC))
{
echo $row['Texte'];
echo "<br><hr style='border:1px solid black;'><br>";
sleep(10);
}
jusque là tout va bien ça marche !
Le problème c'est que je souhaiterai que lorsque la boucle while reprend la première entrée de la base de donnée disparaisse pour n'afficher qu'une entrée par entrée... !
Impossible de trouver une solution....
Merci de votre aide si vous trouvez!
Anto
Configuration: Windows XP Firefox 3.0.1
74 réponses
- 1
- 2
- 3
- 4
Le problème porte sur l'affichage d'une seule entrée à la fois parmi les résultats d'une requête MySQL en PHP, au lieu d'afficher toutes les entrées en boucle avec un délai entre chaque passage. Des solutions consistent à charger les entrées dans un tableau côté serveur, puis à les afficher une par une côté client via JavaScript, en parcourant le tableau avec une minuterie et des appels répétés. Certaines propositions préconisent aussi de regrouper les résultats dans des blocs HTML avec des identifiants et de masquer/afficher via CSS et JavaScript pour éviter les rechargements. En complément, il faut prévoir l’encodage des valeurs côté PHP et les échapper correctement avant de les injecter en JavaScript afin d’éviter les erreurs d’affichage et les failles de sécurité.
-
Je temporise une boucle while qui affiche entrée par entrée une base de donnée :
Quel intérêt à faire ça ?
le script php vca beuguer très rapidement si tu as beaucoup d'enregistrements car il y a un max execution time en général 30 secondes
si tu as 20 enregistrements ça fera 10 x 20 = 200 secondes
de toute façon le script php attend la fin de son éxécution avant d'envoyer la page vers le navigateur -
Arf zut je savais pas qu'il y'avait des restrictions de temps d'execution...
En fait je voudrais que chaque entrée de ma base de donnée s'affiche une par une pendant un certain temps sur une page blanche.
Pour faire une sorte de diaporama powerpoint avec mes entrées...
Je ne vois pas comment faire autrement... -
Oki Merci :)
Des pistes pour un eventuel javascript tout beau qui extrayerait entrée par entrée ?-
va falloir que tu le code à la mimine^^
tu sors toutes les entrées et tu les places dans un conteneur type block (par défaut). Il faut qu'elles aient toutes un id par incrémentation, ce serait tip top. Par défaut, tu mets le display:none; (ou visibility, au choix, c'est un peu brouillon tout ça) et ta fonction javascript contiendra une minuterie avec comme consigne de cacher l'entrée avec l'id courante, incrémenter l'id, monter l'id suivante, laisser filer la minuterie :D. Par contre, je sèche pour le déclenchement de la fonction.... onload peut être, dépend de ta page. -
va falloir que tu le code à la mimine^^
tu sors toutes les entrées et tu les places dans un conteneur type block (par défaut). Il faut qu'elles aient toutes un id par incrémentation, ce serait tip top. Par défaut, tu mets le display:none; (ou visibility, au choix, c'est un peu brouillon tout ça) et ta fonction javascript contiendra une minuterie avec comme consigne de cacher l'entrée avec l'id courante, incrémenter l'id, monter l'id suivante, laisser filer la minuterie :D. Par contre, je sèche pour le déclenchement de la fonction.... onload peut être, dépend de ta page. -
va falloir que tu le code à la mimine^^
tu sors toutes les entrées et tu les places dans un conteneur type block (par défaut). Il faut qu'elles aient toutes un id par incrémentation, ce serait tip top. Par défaut, tu mets le display:none; (ou visibility, au choix, c'est un peu brouillon tout ça) et ta fonction javascript contiendra une minuterie avec comme consigne de cacher l'entrée avec l'id courante, incrémenter l'id, monter l'id suivante, laisser filer la minuterie :D. Par contre, je sèche pour le déclenchement de la fonction.... onload peut être, dépend de ta page.
-
-
oui tu peux par exemple dans ton script php , dans ta boucle while (sans tempo) generer un array javascript (un peu différent d'un array php)
et ensuite tu envoie ça à la page et dans ton script javascript par une tempo tu viens afficher dans la page les éléments les uns après les autres -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Merci pour vos reponses :)
J'ai trouvé ca comme code :
<head>
<META HTTP-EQUIV="refresh" CONTENT="5; URL=afficheur2.php">
</head>
et je pense faire l'incrementation pour le changement d'entrée à afficher avec une variable de session!
J'espère que ca va marcher !! -
je doute, mais tiens nous au courant^^ (sait on jamais, et désolé pour les doublons, CCM plantait -_-)
-
après un refresh de cette page :
//entete obligatoire pour la suite !!!!!!!!!!!!!
Require("./Include/function.php");
include("./Include/connexion.inc.php");
// selection de l'element a afficher
// la valeur 1 est la valeur pour signaler tout les ecran
$ecran = 'A';//valeur a chager selon l'ecran : voir la base de donnée
$sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' ");
//affichage de la page en question :
while($row = mysql_fetch_array($sql, MYSQL_ASSOC))
{
echo $row['Texte'];
echo "<br><hr style='border:1px solid black;'><br>";
}
$_SESSION['defilement'] = $_SESSION['defilement']+1;
echo $_SESSION['defilement'];
ma variable $_SESSION['defilement'] vaut tjr 1 quelque soit le nombre de refresh.... je vois pas pkoi...? -
-
Essayes ça, je n'ai pas testé c'est une piste
<?php //connexion etc.. $sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' "); $tab_php=array(); while($row = mysql_fetch_array($sql, MYSQL_ASSOC)) { $tab_php[]= $row['Texte']; //on empile dans un array php } ?> <html> <head> <script type="text/javascript"> function affiche_texte(i){ <?php //on va generer l'array JS a partir de celui en php echo 'var tableau_JS = new Array('; foreach($tab_php as $valeur) { if(is_int($value)){ echo $value.','; }else{ echo '"'.$value.'",'; } } echo ');'; ?> var obj=document.getElementById('zone_affichage'); //on atteint le div obj.innerHTML=tableau_JS[i]; //on y ecrit l'entrée de l'array i++; if (i < tableau_JS.length) { //on boucle tant que le tableau n'est pas fini setTimeout(affiche_texte(i),10000);//tempo en milisecondes } } </script> </head> <body onLoad="javascript:affiche_texte('0');"> <div id="zone_affichage"> <!-- ça va s'afficher là --> </div> </body> </html> -
heu une petite erreur il faut comme ça je crois:
setTimeout("affiche_texte(i)",10000); -
-
-
j'ai fait l'essai effectivement beaucoup de bugs
essayes comme ça (j'ai remplacé ta requette par un array en "dur" un deux trois..)
<?php //connexion etc.. //$sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' "); $tab_php=array("un","deux","trois","quatre"); /*while($row = mysql_fetch_array($sql, MYSQL_ASSOC)) { $tab_php[]= $row['Texte']; //on empile dans un array php } */ ?> <html> <head> <script type="text/javascript"> var i=0; function affiche_texte(){ <?php //on va generer l'array JS a partir de celui en php $j=0; echo 'var tableau_JS = new Array('; foreach($tab_php as $value) { if(is_int($value)){ echo $value; }else{ echo '"'.$value.'"'; } $j++; if($j<sizeof($tab_php)) echo ','; } echo ');'; ?> var obj=document.getElementById('zone_affichage'); //on atteint le div obj.innerHTML=tableau_JS[i]; //on y ecrit l'entrée de l'array i++; if (i < tableau_JS.length) { //on boucle tant que le tableau n'est pas fini setTimeout("affiche_texte()",10000);//tempo en milisecondes } } </script> </head> <body onLoad="javascript:affiche_texte('0');"> <div id="zone_affichage"> <!-- ça va s'afficher là --> </div> </body> </html> -
Ca fait un script qui compte de 1 à 4 en lettre :p
http://www.lycee-queneau.net/afficheur3.php
Mais il y'a un défilement maintenant !
Merci de ton aide ! -
une petite variante: (modif de la ligne setTimeout et suppr va ri=0)
<?php //connexion etc.. //$sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' "); $tab_php=array("un","deux","trois","quatre"); /*while($row = mysql_fetch_array($sql, MYSQL_ASSOC)) { $tab_php[]= $row['Texte']; //on empile dans un array php } */ ?> <html> <head> <script type="text/javascript"> function affiche_texte(i){ <?php //on va generer l'array JS a partir de celui en php $j=0; echo 'var tableau_JS = new Array('; foreach($tab_php as $value) { if(is_int($value)){ echo $value; }else{ echo '"'.$value.'"'; } $j++; if($j<sizeof($tab_php)) echo ','; } echo ');'; ?> var obj=document.getElementById('zone_affichage'); //on atteint le div obj.innerHTML=tableau_JS[i]; //on y ecrit l'entrée de l'array i++; if (i < tableau_JS.length) { //on boucle tant que le tableau n'est pas fini setTimeout(function(){affiche_texte(i);},5000);//tempo en milisecondes } } </script> </head> <body onLoad="javascript:affiche_texte('0');"> <div id="zone_affichage"> <!-- ça va s'afficher là --> </div> </body> </html> -
-
oui c'est normal puisque j'ai remplacé ta requette par un array bidon,
le deuxième code est juste un peu "plus propre"
pour avoir ta page normale remplaces:
<?php
//connexion etc..
//$sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' ");
$tab_php=array("un","deux","trois","quatre");
/*
par:<?php //connexion etc.. $sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' "); $tab_php=array(); -
j'ai mis ca comme ca :
<?php
//connexion etc..
Require("./Include/function.php");
include("./Include/connexion.inc.php");
$sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' ");
$tab_php=array();
?>
<html>
<head>
<script type="text/javascript">
function affiche_texte(i){
<?php
//on va generer l'array JS a partir de celui en php
$j=0;
echo 'var tableau_JS = new Array(';
foreach($tab_php as $value) {
if(is_int($value)){
echo $value;
}else{
echo '"'.$value.'"';
}
$j++;
if($j<sizeof($tab_php)) echo ',';
}
echo ');';
?>
var obj=document.getElementById('zone_affichage'); //on atteint le div
obj.innerHTML=tableau_JS[i]; //on y ecrit l'entrée de l'array
i++;
if (i < tableau_JS.length) {
//on boucle tant que le tableau n'est pas fini
setTimeout(function(){affiche_texte(i);},5000);//tempo en milisecondes
}
}
</script>
</head>
<body onLoad="javascript:affiche_texte('0');">
<div id="zone_affichage">
<!-- ça va s'afficher là -->
</div>
</body>
</html>
et meme sorti : page blanche avec undefined :-/ -
il manque la boucle while :
<?php //connexion etc.. Require("./Include/function.php"); include("./Include/connexion.inc.php"); $sql = mysql_query("SELECT * FROM ".$base_page." WHERE Ecran='".$ecran." ' OR Ecran='1' "); $tab_php=array(); while($row = mysql_fetch_array($sql, MYSQL_ASSOC)) { $tab_php[]= $row['Texte']; //on empile dans un array php } ?> <html> <head> <script type="text/javascript"> function affiche_texte(i){ <?php //on va generer l'array JS a partir de celui en php $j=0; echo 'var tableau_JS = new Array('; foreach($tab_php as $value) { if(is_int($value)){ echo $value; }else{ echo '"'.$value.'"'; } $j++; if($j<sizeof($tab_php)) echo ','; } echo ');'; ?> var obj=document.getElementById('zone_affichage'); //on atteint le div obj.innerHTML=tableau_JS[i]; //on y ecrit l'entrée de l'array i++; if (i < tableau_JS.length) { //on boucle tant que le tableau n'est pas fini setTimeout(function(){affiche_texte(i);},5000);//tempo en milisecondes } } </script> </head> <body onLoad="javascript:affiche_texte('0');"> <div id="zone_affichage"> <!-- ça va s'afficher là --> </div> </body> </html> -
Je suis désolé de t'embeter avec ca :/
Toujours le même message...
Undefined....
:-(
c'est une erreur javascript alors?
- 1
- 2
- 3
- 4