[PHP] Script qui boucle.........

Script qui boucle......... [PHP] - PHP - Programmation

Marsh Posté le 25-10-2005 à 18:11:26    

:hello:  
 
J'ai un monster problème de script qui boucle... a devenir taré  :pt1cable:  
 
Voilà le script principal:
 

Code :
  1. if(isset($_GET['makeOnlineStats']))
  2.  {
  3.   // on fais une requete dans la table horaireScan pour le jour actuel et l'heure actuelle
  4.   // si dans la table horaireScan on retrouve une entrée pour l'heure actuelle, alors le script doit etre exécuté!
  5.   // pour les jours de la semaines, ( 0  = Lundi, 1  = Mardi, ... 6  = Dimanche)
  6.   $horaire = $db->query('SELECT * FROM '.TABLE_HORAIRE_SCAN.' WHERE numJour = WEEKDAY(NOW()) AND heure = HOUR(NOW())');
  7.   if(mysql_num_rows($horaire))
  8.   {
  9.    $result = $db->query('SELECT id, ftp1, ftp2, portFtp FROM '.TABLE_USER.'');
  10.    $nbreProprios = mysql_num_rows($result);
  11.    // on met un temps d'exécution pour le script "raisonnable" (30sec c'est longtemps pas assez!)
  12.    set_time_limit($executionTime);
  13.    while ($row = mysql_fetch_assoc($result))
  14.    {
  15.     // Champs nécessaire au test online ou pas
  16.     $ftp1 = $row['ftp1'];
  17.     $ftp2 = $row['ftp2'];
  18.     $portFtp = $row['portFtp'];
  19.     // Champs nécessaire à l'ajout dans la table de stat
  20.     $idProprios = $row['id'];
  21.     $openOrNot = '';
  22.     if(ServerOnline($ftp1, $ftp2, $portFtp))
  23.     {
  24.      //si le serveur du proprios est online, openOrNot vaut 0
  25.      $openOrNot = '0';
  26.     }
  27.     else
  28.     {
  29.      //sinon openOrNot vaut 1
  30.      $openOrNot = '1';
  31.     }
  32.     // et on insère le résultat avec l'id du proprios dans la table 'onlinestats'
  33.     $db->query('INSERT INTO '.TABLE_ONLINESTATS.' SET idProprios = '.$idProprios.', date = NOW(), online = '.$openOrNot.'');
  34.     //echo $idProprios.' - '.date("F j, Y, g:i a" ).' - '.$openOrNot.'<br>';
  35.    }
  36.    // et on supprime les enregistrements vieux de 3 mois et +
  37.    $db->query('DELETE FROM '.TABLE_ONLINESTATS.' WHERE MONTH(date) < (MONTH(NOW()) - 3)');
  38.    // et on update la table horairescan pour passer le champ scanOk à 0 (donc scanOk = 0k :-D)
  39.    //$db->query('UPDATE '.TABLE_HORAIRE_SCAN.' SET scanOk = 0 WHERE numJour = WEEKDAY(NOW()) AND heure = HOUR(NOW())');
  40.    // et on affiche le résultat
  41.    echo  '<br><br>
  42.       -> '.$nbreProprios.' serveurs scannés<br>
  43.       -> Stats pour chaque proprios updaté<br>
  44.       -> Stats de plus de '.$dureeAncienStats.' mois supprimés<br>';
  45.   }
  46.   else
  47.   {
  48.    echo '<b>Ce n\'est pas l\'heure pour faire un scan :-D !</b>';
  49.   }
  50.  }


 
Avec cette ligne, le script boucle :

Code :
  1. $db->query('INSERT INTO '.TABLE_ONLINESTATS.' SET idProprios = '.$idProprios.', date = NOW(), online = '.$openOrNot.'');


 
Et si je la remplace avec cette ligne, ca tourne :

Code :
  1. echo $idProprios.' - '.date("F j, Y, g:i a" ).' - '.$openOrNot.'<br>';


 
Pourtant ma méthode query() fonctionne très bien, je l'utilises pas que dans ce script...
 
 
A noter : le script tourne nickel en local (easyphp + php5 + mysql)! Il boucle uniquement "online"....
 
 
la fonction ServerOnline()

Code :
  1. function ServerOnline($ftp1, $ftp2, $portFtp)
  2. {
  3.  //$temp = error_reporting(E_WARNING);
  4.  $fp = fsockopen ($ftp1, $portFtp, $errorNo, $errorStr, 3);
  5.  if($fp)
  6.  {
  7.   fclose($fp);
  8.   return true;
  9.  }
  10.  else
  11.  {
  12.   // puis on ouvre sur l'adresse de secour
  13.   if($ftp2 != '')
  14.   {
  15.    $fp = fsockopen ($ftp2, $portFtp, $errorNo, $errorStr, 3);
  16.    if($fp)
  17.    {
  18.     fclose($fp);
  19.     return true;
  20.    }
  21.    else
  22.    {
  23.     return false;
  24.    }
  25.   }
  26.  }
  27.  //stream_set_timeout($fp, 0);
  28.  //error_reporting($temp);  
  29. }


 
La méthode query() de ma classe database.php

Code :
  1. function query($query)
  2. {
  3.  $result = mysql_query ($query) or die ($query . '<br><br> >> ' . mysql_error());
  4.  if(!$result)
  5.  {
  6.   echo '<B>Erreur dans l\'exécution de la requête.</B><BR>';
  7.   echo '<B>Message de MySQL :</B> ' . mysql_error($this->db);
  8.   exit();
  9.  }
  10.  return $result;
  11. }


 
Merci d'avance à tous ceux qui pourront m'aider  :jap:  
 
@++


Message édité par le_duc le 25-10-2005 à 18:36:26
Reply

Marsh Posté le 25-10-2005 à 18:11:26   

Reply

Marsh Posté le 25-10-2005 à 18:20:47    

Rajoute des echo (avec durée en ms) pour savoir quel endroit est lent.
Et fait un echo de ta requette pour être sur de ce qu'elle fait.

Reply

Marsh Posté le 25-10-2005 à 18:24:31    

Peut-être qu'il faudrait différencier le $result du select et le $result du insert, par exemple, en mettant :
...
                $result_sel = $db->query('SELECT id, ftp1, ftp2, portFtp FROM '.TABLE_USER.'');  
                $nbreProprios = mysql_num_rows($result_sel);  
                 
                // on met un temps d'exécution pour le script "raisonnable" (30sec c'est longtemps pas assez!)  
                set_time_limit($executionTime);  
                 
                while ($row = mysql_fetch_assoc($result_sel))  
...

Reply

Marsh Posté le 25-10-2005 à 18:33:34    

merci pour vos réponses!
 
omega2 > il n'y a pas vraiment d'endroit lent... c juste qu'une fois qu'il a fini la boucle while, il la recommence alors qu'il ne devrait pas!
 
olivthill > je viens d'essayer et ca ne marche pas... (tjs pareil donc!)

Reply

Marsh Posté le 25-10-2005 à 18:43:57    

S'il reprend la boucle while, c'est que t'as une autre boucle ailleur. Je vois que ça comme cause possible au vu de ton code.

Reply

Marsh Posté le 25-10-2005 à 18:58:26    

non, c le seul code que j'ai.... pas d'autre boucle!
 
Mais y'a du nouveau :D
 
Si je mets $result_ins ET un echo juste après la requete d'INSERT, ca marche  :pt1cable:  :pt1cable:  :pt1cable:  :pt1cable:

Code :
  1. $result_ins = $db->query('INSERT INTO '.TABLE_ONLINESTATS.' SET idProprios = '.$idProprios.', date = NOW(), online = '.$openOrNot.'');
  2. echo 'INSERT INTO '.TABLE_ONLINESTATS.' SET idProprios = '.$idProprios.', date = NOW(), online = '.$openOrNot.'<br>';


 
je comprends rien...


Message édité par le_duc le 25-10-2005 à 19:51:59
Reply

Marsh Posté le 25-10-2005 à 19:09:03    

t'es sur que t'es pas partie sur des doubles clics ou d'autres coneries du genre? :lol:
 
Mon ancien patron était de ce genre là et c'est super reloux quand tu es en pleine création du site.

Reply

Marsh Posté le 25-10-2005 à 19:10:36    

tu as essayé de faire un echo de ta requete pour l'executer et voir si elle passe ?
 
edit: l'executer manuellement bien entendu


Message édité par misterpinguin le 25-10-2005 à 19:11:19
Reply

Marsh Posté le 25-10-2005 à 19:49:20    

omega2 > non non, pas de double-clic :lol:
 
misterpinguin > la requete passe nickel!

Reply

Marsh Posté le 25-10-2005 à 20:26:02    

et en faisant la requête normalement sans passer par ta classe: mysql_query(ta_query) ? (on ne sait jamais)

Message cité 1 fois
Message édité par art_dupond le 25-10-2005 à 20:26:55

---------------
oui oui
Reply

Marsh Posté le 25-10-2005 à 20:26:02   

Reply

Marsh Posté le 26-10-2005 à 13:17:22    

art_dupond a écrit :

et en faisant la requête normalement sans passer par ta classe: mysql_query(ta_query) ? (on ne sait jamais)


 
ouais, ca j'ai pas encore testé, vais essayer!

Reply

Marsh Posté le 26-10-2005 à 20:08:17    

re
 
bon, avec ce code, mon script s'éxécute 2x -> j'ai 154 enregistrements dans ma table après avoir lancé le script 1x (il ne devrait y en avoir que 77, soit pile la moitié!)
 

Code :
  1. if(mysql_num_rows($horaire))
  2.   {
  3.    $result_sel = $db->query('SELECT id, ftp1, ftp2, portFtp FROM '.TABLE_USER.'');
  4.    $nbreProprios = mysql_num_rows($result_sel);
  5.    // on met un temps d'exécution pour le script "raisonnable" (30sec c'est longtemps pas assez!)
  6.    set_time_limit($executionTime);
  7.    while ($row = mysql_fetch_assoc($result_sel))
  8.    {
  9.     // Champs nécessaire au test online ou pas
  10.     $ftp1 = $row['ftp1'];
  11.     $ftp2 = $row['ftp2'];
  12.     $portFtp = $row['portFtp'];
  13.     // Champs nécessaire à l'ajout dans la table de stat
  14.     $idProprios = $row['id'];
  15.     $openOrNot = '';
  16.     if(ServerOnline($ftp1, $ftp2, $portFtp))
  17.     {
  18.      //si le serveur du proprios est online, openOrNot vaut 0
  19.      $openOrNot = '0';
  20.     }
  21.     else
  22.     {
  23.      //sinon openOrNot vaut 1
  24.      $openOrNot = '1';
  25.     }
  26.     // et on insère le résultat avec l'id du proprios dans la table 'onlinestats'
  27.     //$result_ins = $db->query('INSERT INTO '.TABLE_ONLINESTATS.' SET idProprios = '.$idProprios.', date = NOW(), online = '.$openOrNot.'');
  28.     $result_query = mysql_query ('INSERT INTO '.TABLE_ONLINESTATS.' (idProprios, date) VALUES ('.$idProprios.', NOW())');
  29.     if(!$result_query)
  30.     {
  31.      echo '<B>Erreur dans l\'exécution de la requête.</B><BR>';
  32.      exit();
  33.     }
  34.     echo $idProprios.' - '.date("F j, Y, g:i a" ).' - '.$openOrNot.'<br>';
  35.    }


 
voilà ce que j'ai dans la table après 1 passage :

Code :
  1. 1   1   2005-10-26 20:04:50
  2. 41  1  2005-10-26 20:05:51

colonne1 = id / colonne2 = idPersonne / colonne3 = date
 
 
les autres bout de code n'ont pas changé...
 
c vraiment la galère :\


Message édité par le_duc le 26-10-2005 à 20:10:40
Reply

Marsh Posté le 26-10-2005 à 20:53:56    

T'es sur que t'a pas simplement 2 fois les même proprio dans la table TABLE_USER ?  
Nettoie la ou fait un select distinct pê

Reply

Marsh Posté le 02-11-2005 à 17:45:02    

non! absolument certain!
 
mais là je test encore qqch d'autre.... j'espère que ca marchera, commence franchement à m'énerver ce problème!!! --> je mets d'abord tout dans un tableau et ensuite je mets le tout dans la BDD!
 
@++

Reply

Marsh Posté le 02-11-2005 à 18:18:23    

Si pas encore fait, fait un print_r de ton tableau avant envoie vers mysql.
L'erreur vient peut être de lui.

Reply

Marsh Posté le 02-11-2005 à 23:39:30    

1/bon déjà un truc qui fache : SELECT * pour en tirer un nombre de ligne dont le resultat de sert pas, remplace par SELECT COUNT(*)
 
2/.'' à la fin des requetes tu peux t'en passer
 
3/ quand tu selectionne, insere ou met à jour des données numériques dans mysql, les '' te servent à rien
 
4/vérifie qu'à ton insert ca te retourne bien true et non false
 
5/ fait un echo de $nbreProprios voire combien t'as de lignes retournées
 
6/ ton user utilisé pour la connexion mysql a t il bien les droits en insertion ?
 
7/mets on @ devant fsockopen, qui te plante le script normalement si probleme d'url(je crois)
 
8/error_reporting(E_ALL); en haut du script


Message édité par Profil supprimé le 02-11-2005 à 23:41:35
Reply

Marsh Posté le 03-11-2005 à 00:49:23    

1 si ça sert
2 pk pas
3 ?
4 C déja verifié avec le !$result_query ligne 34
5 oui, je serais plus pour le print_r proposé
6 à priori oui sinon cf 4
7 me parait contradictoire à 8. Faut choisir, ou tout propre ou tout sale non ?
 
Moi je continue à penser qu'on a 2 fois les même id. Un 'SELECT DISCTINCT id ...' dans la première requete doit resoudre tout ça :D


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 03-11-2005 à 09:18:19    

Ricco > 1 : il veut dire que tu ne fait que vérifier le nombre de lignes retourné et pas les donnée retrourné elles même.
2 : C'est vrai qu'un .'' ca sert strictement à rein.Dire à php qu'il doit rajouter rien, ca lui fait perdre du temps vu qu'il est obliger de traiter cette demande qui ne change rien.
3 : Quand t'envoie un nombre à uen base de donnée, il ne sert à rein de lui faire croire que c'est une chaine de caractére. Ca oblige la base de donnée à refaire un traitement derriére pour transformer la chaine de caractére en nombre.
4 : lignes 38 et 43 de ton premier script, c'est vrai que tu ne vérifie pas si l'insertion ou la supression se sont bien passé. Regarde donc ce qu'il en est en utilisant "mysql_affected_rows". C'est une fonction qui est justement fait pour indiquer le nombre de lignes touché par des insert, update, delete, truncate, replace, ...

Reply

Sujets relatifs:

Leave a Replay

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