Page 1 sur 1

Problème intermitent

Posté : 27 août 2007, 20:57
par Invité
Bonjour,

J'ai un petit problème qui n'est pas toujours présent.

Voici le code (Soyez indulgent, je suis pas un pro...)



$query_plus = "";

for ($i=1; $i <= $nb_ent ; $i++)
{
if(isset($no_echau))
     $query_plus = " AND no_ent NOT IN (".implode(",",$no_echau).")"; 
	 //
else 
     $no_echau = array();
//     
$duree_min= $duree_echau -5;
$sel="SELECT DISTINCT * FROM log_entr WHERE lang = '$lang' AND duree >= '$duree_min'  AND duree <= '$duree_echau' AND type_serie = '2' ".$query_plus." ORDER BY RAND() ";
$res= mysql_query($sel)or die('Erreur SQL1 !'.$sel.'<br>'.mysql_error());
$data= mysql_fetch_array($res);
...
$no_echau[$i]=$no_echau_temp;

}


Quelques fois, j'ai un erreur sql :

Code : Tout sélectionner

Erreur SQL1 !SELECT DISTINCT * FROM log_entr WHERE lang = 'fr' AND duree >= '16.25' AND duree <= '21.25' AND type_serie = '2' AND no_ent NOT IN (866,) ORDER BY RAND() You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY RAND()' at line 1
En bref, je veux selectionner un échauffement dans ma base qui dure minimum x min et maximum y min (calculer selon la durée d'entraînements total de l'utilisateur) Si l'entraînement dure 85 min, bug erreur sql. Si l'entraînement dure 80 min. tout est ok. La durée de l'échauffement est durée total /4.

De l'aide SVP

Merci

Posté : 28 août 2007, 01:32
par Sékiltoyai
Tu as des éléments vides dans ton tableau $no_echau.
Mais je vois une requète dans une boucle, c'est très mauvais, peux tu nous expliquer le contexte, le shéma des tables, et détailler le but exact de ce code car j'ai le fort sentiment que c'est très loin d'être optimisé. Il est possible que tu sous estimes la puissance du langage SQL…

Posté : 28 août 2007, 02:28
par jobine
Salut,

Voici le contexte.

Le code génère des entraînements en fonction du profil de l'utilisateur. Si il a demander 4 entraînements, le code fait 4 boucles pour sélectionner 4 entraînements que je "sauvegarde" dans un tableau. Je les affiche ensuite lorsque les entraînements sont complets (echau, serie, cool)

Je croix que j'ai trouver le problème. Lorsque la durée de l'entraînement est trop long, j'ai pas assez de choix dans ma base donc il ne retourne rien. Faut que j'ajoute la possibilité de mettre une 2e série principale (donc le temps de la série / par 2, 2 série de 30 min au lieu d'une seule de 60 min...).

J'aimerais bien que le tout soit optimiser et d'apprendre plus sur les requêtes SQL. J'ai aucune formation en info. C'est toute appris en lisant à gauche et à droite, sur votre forum et le fameux essais et erreurs :roll:

Merci de votre aide

Posté : 28 août 2007, 02:34
par Sékiltoyai
Y a-t'il un moyen pour récupérer les quatres entrainements d'un seul coup ? C'est à dire, quelles sont les règles exactes pour choisir ces entrainements ? Tu les as déjà profilés ? Tu les génères par ton script ?

Posté : 28 août 2007, 05:01
par jobine
Y a-t'il un moyen pour récupérer les quatres entrainements d'un seul coup ? C'est à dire, quelles sont les règles exactes pour choisir ces entrainements ? Tu les as déjà profilés ? Tu les génères par ton script ?
Toute des bonnes questions...

Les règles: Pour l'instant, le choix se fait sur la durée de chaque entraînement. Dans ma base, je note la durée aprox de l'entraînement. La recherche se fait sur ce critère seulement. par contre, j'aimerais un jours tenir compte de plusieurs critère comme la difficulter de l'ent etc.

Les profiles: Oui, pour chaque entraînement, je note sa durée, son intensité, la difficulter, la distance, la langue, etc.

Les entraînements sont générer par le code plus haut (supprimer en partie). La boucle se répète selon le nombre d'entraînements désirer. LEs entraînements s'affiche sur une page pour fin d'impression.

Finalement, la récupération d'un seule coup, Le nombre d'entraînement doit être varaible parce qu'un utilisateur peut choisir 2 ent/sem et un autre 5 ent/sem. (d'où la boucle). Je ne sais pas comment faire autrement...

Posté : 28 août 2007, 11:03
par Vikchill
Mmmm, ça pose pas de pb ça?
NOT IN (866,)
J'avoue ne pas vraiment savoir, je pense que non, en même temps je n'ai jamais envoyé de requête avec des clauses vides :)

Posté : 28 août 2007, 11:09
par Ryle
Ben si ça pose problème, après une virgule le sgbd attends une valeur.
La chaine à l'intérieur du IN() provenant d'un implode, s'il y a des virgules sans valeur c'est que le tableau implodé contient des éléments vides.
On en revient donc à la remarque de Sékiltoyai ;)
Tu as des éléments vides dans ton tableau $no_echau.

Posté : 29 août 2007, 02:35
par jobine
Merci de vos réponse.

Effectivement, je croix avoir trouver la raison. Il se peut que mon tableau manque des info parce que la requête ne trouve pas de valeur à mettre dedans mais la boucle continue quand même. LA solution simple est d'ajouter des valeurs dans ma base pour couvrir toute les possiblités. (j'ai déjà plus de 800 entraînements)

Avez vous d'autre solution pour éviter le problème?

Merci