Une requette assze complex

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 : Une requette assze complex

par Cyrano » 17 juin 2005, 23:30

Est-ce que tu réalises que tu fais 7 fois les mêmes opérations pour les 7 jours de la semaine...? Tu peux sûrement améliorer en réduisant le tout à une seule fois, mais en triant tes résultats lors de la requête et en te servant de logique et de tableaux. Tu nous envoies 470 lignes de code indigeste : tu as identifié le problème, c'est un début. Maintenant pourquoi ça marche pour le premier et pas pour les suivants ? Arriver à bouffer toute la mémoire allouée, c'est pas vraiment courant.

Essaye de réfléchir à une méthode sur la base d'une seule requête comme ceci:

Code : Tout sélectionner

SELECT jour, TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, emission FROM Emissions ORDER BY jour
Tu auras tout et il te suffira ensuite de trier en identifiant le jour de chaque ligne pour séparer les lignes lors de ton affichage.

par Kma » 17 juin 2005, 22:09

bon j'ai reussi a le faire pour le jour0 et j'ai dupliqué mais ca marche pas

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 524288 bytes) in /var/www/free.fr/f/f/horizonfm945/v4/test.php on line 208

la souce est la sivante

Code : Tout sélectionner

<html> <head> </head> <body> <? include("conf/conf.php"); $today = date ("w"); $start= "10800"; $end= 10800+86400; // 3h + 24h $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, emission FROM Emissions WHERE jour LIKE '1______' ORDER BY secdebut"; $resultat = mysql_query($requete,$connexion); while($data = mysql_fetch_array($resultat)) { $id= "0"; $secdebut= $data[secdebut]; $emission= $data[emission]; $secfin= $data[secfin]; if ($secdebut<10800) { $secdebut=$secdebut+86400; } if ($secfin<10800) { $secfin=$secfin+86400; } $bloc= ($secdebut-$start)/1800; if ($bloc!=0) { $jour0[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour0['.$id.']=""; $id++; } } $bloc= ($secfin-$secdebut)/1800; if ($bloc!=0) { $jour0[$id]='<td rowspan="'.$bloc.'">'.$emission.'</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour0['.$id.']=""; $id++; } } $start= $secfin; } $bloc= ($end-$secfin)/1800; if ($bloc!=0) { $jour0[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>';; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour0['.$id.']=""; $id++; } } $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, emission FROM Emissions WHERE jour LIKE '_1_____' ORDER BY secdebut"; $resultat = mysql_query($requete,$connexion); while($data = mysql_fetch_array($resultat)) { $id= "0"; $secdebut= $data[secdebut]; $emission= $data[emission]; $secfin= $data[secfin]; if ($secdebut<10800) { $secdebut=$secdebut+86400; } if ($secfin<10800) { $secfin=$secfin+86400; } $bloc= ($secdebut-$start)/1800; if ($bloc!=0) { $jour1[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour1[$id]=""; $id++; } } $bloc= ($secfin-$secdebut)/1800; if ($bloc!=0) { $jour1[$id]='<td rowspan="'.$bloc.'">'.$emission.'</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour1[$id]=""; $id++; } } $start= $secfin; } $bloc= ($end-$secfin)/1800; if ($bloc!=0) { $jour1[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>';; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour1[$id]=""; $id++; } } $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, emission FROM Emissions WHERE jour LIKE '__1_____' ORDER BY secdebut"; $resultat = mysql_query($requete,$connexion); while($data = mysql_fetch_array($resultat)) { $id= "0"; $secdebut= $data[secdebut]; $emission= $data[emission]; $secfin= $data[secfin]; if ($secdebut<10800) { $secdebut=$secdebut+86400; } if ($secfin<10800) { $secfin=$secfin+86400; } $bloc= ($secdebut-$start)/1800; if ($bloc!=0) { $jour2[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour2[$id]=""; $id++; } } $bloc= ($secfin-$secdebut)/1800; if ($bloc!=0) { $jour2[$id]='<td rowspan="'.$bloc.'">'.$emission.'</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour2[$id]=""; $id++; } } $start= $secfin; } $bloc= ($end-$secfin)/1800; if ($bloc!=0) { $jour2[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>';; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour2[$id]=""; $id++; } } $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, emission FROM Emissions WHERE jour LIKE '___1___' ORDER BY secdebut"; $resultat = mysql_query($requete,$connexion); while($data = mysql_fetch_array($resultat)) { $id= "0"; $secdebut= $data[secdebut]; $emission= $data[emission]; $secfin= $data[secfin]; if ($secdebut<10800) { $secdebut=$secdebut+86400; } if ($secfin<10800) { $secfin=$secfin+86400; } $bloc= ($secdebut-$start)/1800; if ($bloc!=0) { $jour3[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour3[$id]=''; $id++; } } $bloc= ($secfin-$secdebut)/1800; if ($bloc!=0) { $jour3[$id]='<td rowspan="'.$bloc.'">'.$emission.'</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour3[$id]=""; $id++; } } $start= $secfin; } $bloc= ($end-$secfin)/1800; if ($bloc!=0) { $jour3[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>';; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour3[$id]=""; $id++; } } $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, emission FROM Emissions WHERE jour LIKE '____1__' ORDER BY secdebut"; $resultat = mysql_query($requete,$connexion); while($data = mysql_fetch_array($resultat)) { $id= "0"; $secdebut= $data[secdebut]; $emission= $data[emission]; $secfin= $data[secfin]; if ($secdebut<10800) { $secdebut=$secdebut+86400; } if ($secfin<10800) { $secfin=$secfin+86400; } $bloc= ($secdebut-$start)/1800; if ($bloc!=0) { $jour4[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour4[$id]=""; $id++; } } $bloc= ($secfin-$secdebut)/1800; if ($bloc!=0) { $jour4[$id]='<td rowspan="'.$bloc.'">'.$emission.'</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour4[$id]=""; $id++; } } $start= $secfin; } $bloc= ($end-$secfin)/1800; if ($bloc!=0) { $jour4[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>';; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour4[$id]=""; $id++; } } $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, emission FROM Emissions WHERE jour LIKE '_____1_' ORDER BY secdebut"; $resultat = mysql_query($requete,$connexion); while($data = mysql_fetch_array($resultat)) { $id= "0"; $secdebut= $data[secdebut]; $emission= $data[emission]; $secfin= $data[secfin]; if ($secdebut<10800) { $secdebut=$secdebut+86400; } if ($secfin<10800) { $secfin=$secfin+86400; } $bloc= ($secdebut-$start)/1800; if ($bloc!=0) { $jour5[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour5[$id]=""; $id++; } } $bloc= ($secfin-$secdebut)/1800; if ($bloc!=0) { $jour5[$id]='<td rowspan="'.$bloc.'">'.$emission.'</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour5[$id]=""; $id++; } } $start= $secfin; } $bloc= ($end-$secfin)/1800; if ($bloc!=0) { $jour5[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>';; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour5[$id]=""; $id++; } } $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, emission FROM Emissions WHERE jour LIKE '______1' ORDER BY secdebut"; $resultat = mysql_query($requete,$connexion); while($data = mysql_fetch_array($resultat)) { $id= "0"; $secdebut= $data[secdebut]; $emission= $data[emission]; $secfin= $data[secfin]; if ($secdebut<10800) { $secdebut=$secdebut+86400; } if ($secfin<10800) { $secfin=$secfin+86400; } $bloc= ($secdebut-$start)/1800; if ($bloc!=0) { $jour6[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour6[$id]=""; $id++; } } $bloc= ($secfin-$secdebut)/1800; if ($bloc!=0) { $jour6[$id]='<td rowspan="'.$bloc.'">'.$emission.'</td>'; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour6[$id]=""; $id++; } } $start= $secfin; } $bloc= ($end-$secfin)/1800; if ($bloc!=0) { $jour6[$id]='<td rowspan="'.$bloc.'">Rock non stop</td>';; // la case de l'émission $id++; for($i=1; $i !=$bloc ; $i++) { $jour6[$id]=""; $id++; } } ?> <table width="100%" border="2"> <tr> <td width="0px"></td> <!-- la colone pour faire les demi heure en rowspan--> <td>Heure</td> <td>Lundi</td> <td>Mardi</td> <td>Mercredi</td> <td>Jeudi</td> <td>Vendredi</td> <td>Samedi</td> <td>Dimanche</td> </tr> <? //Ensuite on affiche les 48 lignes correspondants aux créneaux allant de 3H à 3H par demi heure //Les 48 crénneau peuvent être calculés automatiquement à partir de 3H $hd = 03; //Heure de départ des créneaux d'un jour 10800=3h en sec $id= 0; for ($c=0; $c < 24 ; $c++) { //La première colonne de la ligne contient le crénneau calculé à partir de $hd echo '<tr> <td></td> <td rowspan="2">'.$hd.'H00</td> '.$jour1[$id].' '.$jour2[$id].' '.$jour3[$id].' '.$jour4[$id].' '.$jour5[$id].' '.$jour6[$id].' '.$jour0[$id].' </tr>'; $id++; echo '<tr> <td></td> '.$jour1[$id].' '.$jour2[$id].' '.$jour3[$id].' '.$jour4[$id].' '.$jour5[$id].' '.$jour6[$id].' '.$jour0[$id].' </tr>'; $id++; //Préparer le crénneau suivant $hd += 01; if ($hd == "24") { $hd= 0; } } ?> </table> </body> </html>

par pjl » 16 juin 2005, 14:46

Un petit effort dans l'écriture (je n'ose croire qu'à un niveau bac, on ne puisse écrire un peu mieux) et l'utilisation de la balise PHP pour mettre ton code en relief devraient aider les personnes qui te répondent.

par Kma » 16 juin 2005, 14:40

mais $b c temps d'on tu parle et elle est defini puisquelle est le resultat du calcule presedent

ou laors je vous pas de koi tu me parle

par Cyrano » 16 juin 2005, 11:12

Pour utiliser une variable, il faut commencer par la définir, c'est à dire lui assigner une valeur.
Si je fais:
$a = $b/100;
J'aurai une erreur parce que $b n'est pas définie: Si en revanche je fais ceci:
$b = 25;
$a = $b / 100;
Ça va fonctionner parce que je définis $b avant de l'utiliser.

par Kma » 16 juin 2005, 10:35

ell est n'est pas defini c'esta dire

dsl je sui un peut nvice ne la matière

ma commende if est-elle bonne

par Cyrano » 16 juin 2005, 08:05

Ligne 90 tu intercales une donnée entre deux cellules de ton tableau, et cette variable n'est définie nulle part:
$jour1[$id]
Lignes 98 et 101, tu mets
$id= $id++;
Si c'est juste pour incrémenter $i, tu peux tout simplement mettre:
$i++;

par Kma » 16 juin 2005, 03:48

Bon je vien de decortique et aparament ya un truc quelque part

Code : Tout sélectionner

[php] <html> <head> <link href="css/style.css" rel="stylesheet" type="text/css"> </head> <body> <? include("conf/conf.php"); $start= 10800; // start= 3h $id= 0; $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, TIME_TO_SEC(fin) AS secfin, emission FROM Emissions WHERE jour LIKE '____1__'"; // test sur le vendredi DLMMJVS et metre un un sur le jour $resultat = mysql_query($requete,$connexion); while ($row=mysql_fetch_assoc($resultat)) { $secdebut= $row[secdebut]; $secfin= $row[secfin]; $emission= $row[emission]; if ($start= "$secdebut") // une émission { $temps= $secfin - $secdebut; //calcule en secde du temps de l'émission $bloc= $temps/1800; // division du temps en demi heure = le nombre de ligne fusioné echo $id.' td rowspan='.$bloc.'>'.$emission.'</td <br>'; // la case de l'émission $id++; for ($boucle=$bloc; $boucle>1; $boucle--) // la boucle pour les colone vide du rowspan { echo $id.' <br>'; $id++; } $start = $secfin; } else // pas d'emission { $temps= $secdebut - $start; //calcule en secde du temps de l'émission $bloc= $temps/1800; // division du temps en demi heure = le nombre de ligne fusioné echo $id.' td rowspan='.$bloc.'>rock non stop</td <br>'; // la case de l'émission $id++; for ($boucle=$bloc; $boucle>1; $boucle--) // la boucle pour les colone vide du rowspan { echo $id.' <br>'; $id++; } $start = $secfin; } } ?>[/php]
et voila ce que je recupère


0 td rowspan=2>L'intégrale... ou presque !
1
2 td rowspan=6>Le matin c'est Béné
3
4
5
6
7
8 td rowspan=6>Vos debuts de soirée avec osmin
9
10
11
12
13
14 td rowspan=4>test de temps
15
16
17


donc il ne lirai pas bien mon if et ne part jamais dans le else

par Kma » 16 juin 2005, 03:30

bon j'ai bosser dessus apres tout le taf que j'ai eu a coter (c bien pbeau de faire dessite masi faut aussi faire le taf a coter et preparer le bac bref) et voila ou j'en suis aujourdh'ui

je te donne la source complette et des explication a la fin de la source

Code : Tout sélectionner

<html> <head> <link href="css/style.css" rel="stylesheet" type="text/css"> </head> <body> <? include("conf/conf.php"); $start= 10800; // start= 3h $id= 0; $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, TIME_TO_SEC(fin) AS secfin, emission FROM Emissions WHERE jour LIKE '_____1_'"; // test sur le vendredi DLMMJVS et metre un un sur le jour $resultat = mysql_query($requete,$connexion); while ($row=mysql_fetch_assoc($resultat)) { $secdebut= $row[secdebut]; $secfin= $row[secfin]; $emission= $row[emission]; if ($start= $debut) // une émission { $temps= $secfin - $secdebut; //calcule en secde du temps de l'émission $bloc= $temps/1800; // division du temps en demi heure = le nombre de ligne fusioné $jour1[$id]='<td rowspan="$bloc">emission</td>'; // la case de l'émission $id = $id++; for ($boucle=$bloc; $boucle>1; $boucle--) // la boucle pour les colone vide du rowspan { $jour1[$id]=''; $id = $id++; } $start = $fin; } else // pas d'emission { $temps= $debut - $start; //calcule en secde du temps de l'émission $bloc= $temps/1800; // division du temps en demi heure $jour1[$id]='<td rowspan="$bloc">Rock non Stop</td>'; $id = $id++; for ($boucle=$bloc; $boucle>1; $boucle--) // la boucle pour les colone vide du rowspan { $jour1[$id]=''; $id = $id++; } $start = $debut; //start = debut } } ?> <table width="100%" border="2"> <tr> <td width="0px"></td> <td> Heure </td> <td> Lundi </td> <td> Mardi </td> <td> Mercredi </td> <td> Jeudi </td> <td> Vendredi </td> <td> Samedi </td> <td> Dimanche </td> </tr> <? //Ensuite on affiche les 48 lignes correspondants aux créneaux allant de 3H à 3H par demi heure //Les 48 crénneau peuvent être calculés automatiquement à partir de 3H $hd = 03; //Heure de départ des créneaux d'un jour 10800=3h en sec $id= 0; for ($c=0; $c < 24 ; $c++) { //La première colonne de la ligne contient le crénneau calculé à partir de $hd echo'<tr> <td></td> <td rowspan="2">'.$hd.'H00</td> '.$jour1[$id].' <td valign="middle" align="center" rowspan="2"> ici le programlle du Mardi</td> <td valign="middle" align="center" rowspan="2"> ici le programlle du Mercredi</td> <td valign="middle" align="center" rowspan="2"> ici le programlle du Jeudi</td> <td valign="middle" align="center" rowspan="2"> ici le programlle du vendredi</td> <td valign="middle" align="center" rowspan="2"> ici le programlle du Samedi</td> <td valign="middle" align="center" rowspan="2"> ici le programlle du Dimanche</td> </tr>'; $id= $id++; '<tr> <td></td> '.$jour1[$id].' </tr>'; $id= $id++; //Préparer le crénneau suivant $hd += 01; if ($hd == "24") { $hd= 0; } } ?> </table> </body> </html>
donc en fait ca marche pas des masse car je pense que je m'y prend mal pour avoir mon champs type

Code : Tout sélectionner

$jour1[0]='<td rowspan"2">rock non sop</td>' $jour1[1]='' $jour1[2]='<td rowspan"3">$emission1</td>' $jour1[4]='' $jour1[4]='' $jour1[5]='<td rowspan"1">rock non stop</td>'
donc si vous pouviez me dire ou je fait fausse route

par kma » 14 juin 2005, 15:11

oui mais je la conanit pas cette fonction et aparamznt ce qu'il fait na rien a voir à ce dont j'ai besoin en fait donc je recommence tout depuis le debut

par Cyrano » 14 juin 2005, 14:52

Ben ok, tu fait un appel vers fonction qui n'est nulle paret dans ton code: il faudrait peut-être ajouter l'include vers le fichier où se trouve cette fonction, tu ne crois pas ?

par Kma » 14 juin 2005, 14:42

bon j'ai essayer de taper un peu pour mon cas et voila ou j'en suis

Code : Tout sélectionner

<html> <head> </head> <body> <? include("conf/conf.php"); ?> <table width="100%" border="6" cellpadding="5" cellspacing="2" table background="images/fond2.gif"> <tr><th width="11%"> <? // heure debut et fin de type hh:mm:ss $requete= "SELECT TIME_TO_SEC(debut) AS secdebut, debut, TIME_TO_SEC(fin) AS secfin, fin, jour, emission FROM Emissions"; $resultat = mysql_query($requete,$connexion); while ($row=mysql_fetch_assoc($resultat)) { $secdebut= $row['secdebut']; //heure de debut en seconde $start= $secdebut - 10800; // debut de l'emploi du temps a 3h soir 10800 seconde $bloc= $start / 1800; // un bloc (celule = 30 mn) // emission $emission= $row['emission']; $date =$row['date']; if ($date = "1______") // Diamnche { $njour= "0"; } if ($date = "_1_____") // Lundi { $njour= "1"; } if ($date = "__1____") // Mardi { $njour= "2"; } if ($date = "___1___") // Mercredi { $njour= "3"; } if ($date = "____1__") // Jeudi { $njour= "4"; } if ($date = "_____1_") // vendredi { $njour= "5"; } if ($date = "______1") // Samedi { $njour= "6"; } // On établit la durée du rendez-vous $secdefin= $row['secdefin']; $duree[$njour][$bloc]= $secdefin - $secdebut; // S'il y a une émission onair=1 $onair = 1; /* On construit le tableau $emission */ $ems[$njour][$bloc] = array($emission, $duree, $onair); } ?> </tr> <? //Ensuite on affiche les 48 lignes correspondants aux créneaux allant de 3H à 3H par demi heure //Les 48 crénneau peuvent être calculés automatiquement à partir de 3H $hd = 10800; //Heure de départ des créneaux d'un jour 10800=3h en sec for ($c=0; $c < 48 ; $c++) { //La première colonne de la ligne contient le crénneau calculé à partir de $hd ?> <tr> <th> <? //La durée affichée d'un crénneau est toujour 30MN $hf = $hd +1800; //par exemple $hf contient 9H si $hd contient 8H echo "$hd"."H"." à "."$hf"."H"; //Préparer le crénneau suivant $hd += 1800; //Correction pour le passage de 00h à 03h if ($secdebut < "1300") { $secdebut += 86400; } //La deuxieme partie de la ligne affichée contient les RDV des 5 jours for ($j=0; $j < 7 ; $j++) { //Attention: ne pas créer de céllule si le crénneau précédent l'a déjà consommée à cause d'une durée qui dépasse 1 heure //$c : le n° du crénneau et $j celui du jour du RDV if (!occupé($c,$j) ) { //voir la fonction occupé() qui determine si une céllule peut être créée //la céllule qui s'affiche peut consommer plusieurs lignes selon la durée du RDV planifié (c'est ROWSPAN qui s'en charge) //BGCOLOR permet de peindre le fond si le RDV existe //COLOR change de couleur de texte si le RDV existe ?> <td valign="middle" align="center" width="18%" rowspan=<? echo $duree[$njour][$bloc]>0?$duree[$njour][$bloc]:""; ?> bgcolor="<? echo $duree[$njour][$bloc]>0?"silver":""; ?>" style="color:<? echo $ems[$njour][$bloc]=="*"?"":"purple"; ?>"> <? echo $ems[$njour][$bloc]; } } } ?> </table> </body> </html>

l'ereur est la suivante
Fatal error: Call to undefined function: occupé() in /var/www/free.fr/f/f/horizonfm945/v4/test.php on line 97

par Kma » 14 juin 2005, 12:49

ha si c bon firefox a du delirer

par Kma » 14 juin 2005, 12:40

ya pas de lien

par Kma » 14 juin 2005, 12:39

ok je te remerci pour ton aides