Requête MySQL qui fonctionne dans PhpMyAdmin mais pas dans mon script

Requête MySQL qui fonctionne dans PhpMyAdmin mais pas dans mon script - PHP - Programmation

Marsh Posté le 26-09-2007 à 18:42:16    

Bonjour,
j'arrive a exécuter la requête SQL dans PhpMyAdmin,
mais dans mon script, j'ai systématiquement une erreur...
 

Code :
  1. $requete  = " SELECT @dt := max(STA_DATE) FROM T_STA_STATS; ";
  2. $requete .= " SELECT @nb := count(*) FROM T_USR_USER where USR_DATE_LAST = @dt; ";
  3. $requete .= " UPDATE T_STA_STATS SET STA_NB_USR = @nb WHERE STA_DATE = @dt; ";
  4. $result = mysql_query($requete);
  5. if (!$result) error_sql_log("[ERREUR:]", $requete);


 
 
Quelqu'un aurait une idée s'il vous plait ???
 
 
Ce que fait la requête :
- récupération de la date maxi enregistrée dans les stats
- récupère le nombre d'utilisateur qui ont comme dernière date d'utilisation cette date là.
- mise à jour de la ligne avec la valeur trouvée à la date indiquée.
 

Reply

Marsh Posté le 26-09-2007 à 18:42:16   

Reply

Marsh Posté le 26-09-2007 à 18:50:57    

par curiosité, tu utilises des variables MySQL, c'est bien ca ?  
 
sinon tu ne peux pas executer plusieurs requetes en meme temps. Phpmyadmin les dispatch automatiquement.
 
Pour avoir le type d'erreur => mysql_error()

Reply

Marsh Posté le 26-09-2007 à 19:18:34    

Oui, les variables MySQL (c'est la 1ère fois).
 
J'avais mis des point-virgules à la fin pour enchainer,
c'est peut être ça ?
Je dois en faire 3 ?
 
l'erreur que j'ai dans le log :
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 ';  SELECT @nb := count(*) FROM T_USR_USER where USR_DATE_LAST =;
 

Reply

Marsh Posté le 26-09-2007 à 19:22:37    

J'ai essayé en 3 fois,
pas d'erreur, mais pas de changement de valeurs...
(comme si les variables ne transmettaient pas leur valeurs)

Reply

Marsh Posté le 26-09-2007 à 19:59:51    

Si t'utilises les variables, elles disparaissent une fois la requête éxécutée je pense, c'est normal que ça change rien.
Soit fais ça avec une procédure stockée, un trigger, un script qui gère les valeurs :spamafote:


Message édité par leflos5 le 26-09-2007 à 20:00:04
Reply

Marsh Posté le 27-09-2007 à 18:25:41    

MERCI !
 
Bon, je fais 3 requêtes, et récupères les variables via php.
Ce qui donne :

Code :
  1. $requete  = " SELECT max(STA_DATE) FROM T_STA_STATS; ";
  2.   $result = mysql_query($requete);
  3.   if (!$result) error_sql_log("[ERR-IJ0a]", $requete);
  4.   list($dt) = mysql_fetch_row ($result);
  5.   $dt = date("Ymd", strtotime($dt));
  6.   //
  7.   $requete = " SELECT count(*) FROM T_USR_USER where USR_DATE_LAST = '" . $dt . "' ";
  8.   $result = mysql_query($requete);
  9.   if (!$result) error_sql_log("[ERR-IJ0b]", $requete);
  10.   list($nb) = mysql_fetch_row ($result);
  11.   //
  12.   if ( strval($nb) > 0 and ($dt != '') )
  13.   {
  14.     $requete = " UPDATE T_STA_STATS SET STA_NB_USR = " . $nb . " WHERE STA_DATE = '" . $dt . "' ";
  15.     $result = mysql_query($requete);
  16.     if (!$result) error_sql_log("[ERR-IJ0c]", $requete);
  17.   }


Message édité par apophyss le 29-09-2007 à 10:24:04
Reply

Marsh Posté le 27-09-2007 à 18:48:42    

A tester pour voir vu que t'es en mysql:

Citation :

UPDATE T_STA_STATS T1,T_STA_STATS T2
set T1.STA_NB_USR = (SELECT count(*) FROM T_USR_USER where USR_DATE_LAST = max(T2.STA_DATE) )
where T1.STA_DATE = max(STA_DATE)


Par contre je ne garantie pas le résultat (pas testé) ni la vitesse (requête imbriqué)
 
Je pense qu'il est également possible de faire la même chose avec moins de perte de vitesse en faisant une requête du genre :

Citation :

UPDATE T_STA_STATS,  
(SELECT count(*) nb, max(STA_DATE) DATE_MAX FROM T_STA_STATS,T_USR_USER where USR_DATE_LAST = max(STA_DATE)) T2
SET T_STA_STATS.STA_NB_USR = T2.nb
WHERE STA_DATE =  
T2.DATE_MAX


La encore je n'ai pas testé donc je ne suis pas certain à 100% que ça marche sans erreur mais normalement ça devrait être bon.
 
 
A noter que c'est pas des façons très habituelle de faire et la seconde risque de ne marcher qu'avec mysql.

Reply

Marsh Posté le 28-09-2007 à 03:07:56    

J'avais pas pensé aux requêtes imbriquées dans ce cas, j'avais même pas regardé ce que tu voulais.
 
En effet doit y'avoir moyen de le faire autrement en une requête imbriquée si t'as un mysql >=5
 
Tu veux faire quoi au juste :??: Pourquoi un update et pas simplement un insert une fois par jour :??: Ton tuple est crée au début de la journée (ou au premier connecté de la journée) et tu le mets à jour toutes le x minutes, c'est ça :??:
 
En gros la date en question tu la connais ou faut aller la chercher (vu que c'est la dernière apparement) ?
 
Parce que y'a même pas besoin d'aller chercher si loin si tu connais la date dès le départ ;)

Reply

Marsh Posté le 29-09-2007 à 10:21:44    

Le where USR_DATE_LAST = max(STA_DATE) ne marche justement pas... (snif)
 
J'essaies d'être compatible avec le plus de versions possibles de MySQL et php (vu que c'est un script redistribué).
 
 
Je fais cet update, justement, juste AVANT l'insert de la ligne de stats du jour : donc je récupère les valeurs de la veille.
(pour afficher celle du jour, que je recalcule en live)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed