Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1461 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1230852
le_duc
PlaTyPuS
Posté le 25-10-2005 à 18:11:26  profilanswer
 

: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
mood
Publicité
Posté le 25-10-2005 à 18:11:26  profilanswer
 

n°1230868
omega2
Posté le 25-10-2005 à 18:20:47  profilanswer
 

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.

n°1230873
olivthill
Posté le 25-10-2005 à 18:24:31  profilanswer
 

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))  
...

n°1230879
le_duc
PlaTyPuS
Posté le 25-10-2005 à 18:33:34  profilanswer
 

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!)

n°1230891
omega2
Posté le 25-10-2005 à 18:43:57  profilanswer
 

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.

n°1230912
le_duc
PlaTyPuS
Posté le 25-10-2005 à 18:58:26  profilanswer
 

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
n°1230924
omega2
Posté le 25-10-2005 à 19:09:03  profilanswer
 

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.

n°1230926
misterping​uin
Posté le 25-10-2005 à 19:10:36  profilanswer
 

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
n°1230957
le_duc
PlaTyPuS
Posté le 25-10-2005 à 19:49:20  profilanswer
 

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

n°1230988
art_dupond
je suis neuneu... oui oui !!
Posté le 25-10-2005 à 20:26:02  profilanswer
 

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
mood
Publicité
Posté le 25-10-2005 à 20:26:02  profilanswer
 

n°1231463
le_duc
PlaTyPuS
Posté le 26-10-2005 à 13:17:22  profilanswer
 

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!

n°1231859
le_duc
PlaTyPuS
Posté le 26-10-2005 à 20:08:17  profilanswer
 

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
n°1231888
Ricco
Retour au pays
Posté le 26-10-2005 à 20:53:56  profilanswer
 

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ê

n°1236706
le_duc
PlaTyPuS
Posté le 02-11-2005 à 17:45:02  profilanswer
 

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!
 
@++

n°1236733
omega2
Posté le 02-11-2005 à 18:18:23  profilanswer
 

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

n°1237031
Profil sup​primé
Posté le 02-11-2005 à 23:39:30  answer
 

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
n°1237073
Ricco
Retour au pays
Posté le 03-11-2005 à 00:49:23  profilanswer
 

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
n°1237113
omega2
Posté le 03-11-2005 à 09:18:19  profilanswer
 

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, ...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
[PHP / CURL] Comment établir une connexion TELNET ?Interraction avec un script
Galeries photos en PHP ou autresscipt PHP/HTML maj bd
Contrôler le temps d'exécution d'une partie d'un script[PHP] Opendir qui échoue, alors que le répertoire existe
Je cherche un script paid to click, paid to sign-up, paid-to-review e-Jouer avec les dates avec PHP
Script PHP, bonjour, bousoir 
Plus de sujets relatifs à : [PHP] Script qui boucle.........


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR