[RESOLU] Traiter seulement les fichiers OK

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 : [RESOLU] Traiter seulement les fichiers OK

Re: Traiter seulement les fichiers OK

par kiko67 » 27 mai 2014, 16:54

Maintenant la sortie de
$xml = simplexml_load_string($contenu);
est du genre:

Code : Tout sélectionner

traitement de C:/Documents and Settings/900204/Bureau/Test/201405190631124567890 12.xml <br/> SimpleXMLElement Object ( [alerte] => Service [typenotif] => RECOVERY [service] => service-vidal_hoptimal_server [hote] => terra [adresse_ip] => 172.19.0.16 [etat] => OK [id_etat] => 0 [descr] => 1 process named medicament.exe ( 0) [timestamp] => 2014-05-19 06:31:12 ) traitement de C:/Documents and Settings/900204/Bureau/Test/201405200837092345678 90.xml <br/> SimpleXMLElement Object ( [alerte] => HOST [typenotif] => RECOVERY [service] => SimpleXMLElement Object ( ) [hote] => info_stage_1 [adresse_ip] => 192.168.12.89 [etat] => UP [id_etat] => 0 [descr] => PING OK - Paquets perdus = 0%, RTA = 2.07 ms [timestamp] => 2014-05-20 08:37:09 ) traitement de C:/Documents and Settings/900204/Bureau/Test/201405200837093456789 01.xml <br/> SimpleXMLElement Object ( [alerte] => HOST [typenotif] => RECOVERY [service] => SimpleXMLElement Object ( ) [hote] => info_stage_1 [adresse_ip] => 192.168.12.89 [etat] => UP [id_etat] => 0 [descr] => PING OK - Paquets perdus = 0%, RTA = 0.76 ms [timestamp] => 2014-05-20 08:37:09 ) C:\Documents and Settings\900204\Bureau\Test>
Comme dois je traiter ces éléments objets xml avant de formuler la requête pour les insérer dans la base ??

Merci

Re: Traiter seulement les fichiers OK

par kiko67 » 27 mai 2014, 16:31

Beh je te le remets avec la belle couleur
<?php

error_reporting(E_ALL ^ E_NOTICE);

// variables de connexion a la base
$serveur = "localhost";
$base = "nagios_to_parcpc";
$user = "carlo";
$pass = "xxxxx";

//variables des dossiers de traitement
$dossierencours="C:/Documents and Settings/900204/Bureau/Test";
$dossiertraite="C:/Documents and Settings/900204/Bureau/Archivage";

// connexion à MySQL
$mysqli = new mysqli($serveur, $user, $pass, $base);
if(mysqli_connect_errno()) { 
printf ("Echec de la connexion:%s\n",mysqli_connect_error());
exit();
}
echo 'Information sur le serveur : '.$mysqli->host_info;

// on selectionne que les fichiers xml
$liste = glob("$dossierencours/*.xml");

// pour chaque fichier on extrait le contenu
foreach ($liste as $file)
{
    echo "traitement de $file <br/>\n";
    $contenu = file_get_contents($file);
    $xml = simplexml_load_string($contenu);

    $insertion = mysql_query("INSERT INTO notifications (Alerte, Type_Notification, Service, Hote, Adresse_IP, Etat, ID_Etat, Descriptif, Date_Heure) VALUES ('$alerte', '$typenotif', '$service', '$hote', '$adresse_ip', '$etat', '$id_etat', '$descr', '$timestamp')");
	
    $filename = basename($file); //nom du fichier
    rename($file,"$dossiertraite/${filename}_fini"); //déplace

}
// deconnexion de la base
$mysqli->close();
?>
Avant il me disait "acces denied" à la base et "A link to the server could not be established" après j'ai changé le mot de passe et il me semble avoir marché un coup.
Mais le problème c'est que les données ne sont pas insérées dans la base comme si la requête était mal formulée.
Bizarre.
Peut être que avec un objet xml la requête a un format différent, ou non ?

Je pète un plomb. #-o

Merci à vous tous.

Re: Traiter seulement les fichiers OK

par telnes » 27 mai 2014, 13:31

hello

pour info il y a un bouton PHP qui permet de mettre le code php avec une belle synthaxe


sinon ton script il te retourne quoi ?


++

Re: Traiter seulement les fichiers OK

par kiko67 » 27 mai 2014, 11:49

Salut,
je remets le code,

Code : Tout sélectionner

<?php error_reporting(E_ALL ^ E_NOTICE); // variables de connexion a la base $serveur = "localhost"; $base = "nagios_to_parcpc"; $user = "root"; $pass = ""; //variables des dossiers de traitement $dossierencours="C:/Documents and Settings/900204/Bureau/Test"; $dossiertraite="C:/Documents and Settings/900204/Bureau/Archivage"; // connexion à MySQL $mysqli = new mysqli($serveur, $user, $pass, $base); if(mysqli_connect_errno()) { printf ("Echec de la connexion:%s\n",mysqli_connect_error()); exit(); } echo 'Information sur le serveur : '.$mysqli->host_info; // on selectionne que les fichiers xml $liste = glob($dossierencours."/*.xml"); // pour chaque fichier on extrait le contenu foreach ($liste as $file) { echo "traitement de $file <br/>\n"; $contenu = file_get_contents($file); $xml = simplexml_load_string($contenu); $insertion = mysql_query("INSERT INTO notifications (Alerte, Type_Notification, Service, Hote, Adresse_IP, Etat, ID_Etat, Descriptif, Date_Heure) VALUES ('$alerte', '$typenotif', '$service', '$hote', '$adresse_ip', '$etat', '$descr', '$timestamp')"); $filename = basename($file); //nom du fichier rename($file,"$dossiertraite/${filename}_fini.xml"); //déplace } // deconnexion de la base $mysqli->close();
La connexion à la base semble bien marcher par contre les données ne sont pas inserées comme si glob ne les recuperait pas.
Pourquoi ?
Il doit manquer une ligne.

Merci à tous.

Re: Traiter seulement les fichiers OK

par telnes » 26 mai 2014, 13:39

hello

si tu fait une fonction connectMaBase() il faudrait peut etre l'utiliser ? (avant de faire une request notamment)

ps: surtout ne pas hésiter à mettre l'erreur dans google ;) il y a peut de chance que personne n'ai eu m'erreur avant toi

Re: Traiter seulement les fichiers OK

par kiko67 » 26 mai 2014, 11:36

hello

tu devrais faire la méthode du debugger à l'arrache :) qui consiste à mettre des echo et des print_r() dans le code pour voir si les étapes se déroule comme prévus

++

Ce que je viens de faire.
Alors j'ai remplacé le regexp par du glob et, de ce coté là, ca a l'air de tourner.
Par contre dans le dernier log j'ai:
Parse error : syntax error unexpected end of file in .../monscript at line 31
Là ligne où il y a
?>

Code : Tout sélectionner

<?php set_time_limit(0); //mysql connection error_reporting(E_ALL ^ E_NOTICE); function connectMaBase(){ $connexion = mysqli_connect('localhost','root',''); mysqli_select_db('nagios_to_parcpc'); if (!$connexion) { die('Impossible de se connecter: '. mysql_error()); } echo "connection a la base OK"; // on atrribue des variables au dossiers $dossierencours="C:\Documents and Settings\900204\Bureau\Test"; $dossiertraite="C:\Documents and Settings\900204\Bureau\Traités"; // On ouvre le dossier a traiter $dossier = opendir ($dossierencours); // on selectionne que les fichiers xml avec des noms de 23 nombre $files = glob("$dossier/*.xml"); if (!empty ($files)) exit; else{ // pour chaque fichier on extrait le contenu foreach ($files as $file) $contenu = file_get_contents($file); } mysql_query("INSERT INTO notifications (Alerte, Type_Notification, Service, Hote, Adresse_IP, Etat, ID_Etat, Descriptif, Date_Heure) VALUES ('$alerte', '$typenotif', '$service', '$hote', '$adresse_ip', '$etat', '$descr', '$timestamp')"); $filename = basename($file); //nom du fichier rename($file,"$dossiertraite/$filename_fini"); //déplace ?>
Merci pour votre aide :wink:

Re: Traiter seulement les fichiers OK

par telnes » 26 mai 2014, 11:02

hello

tu devrais faire la méthode du debugger à l'arrache :) qui consiste à mettre des echo et des print_r() dans le code pour voir si les étapes se déroule comme prévus

++

Re: Traiter seulement les fichiers OK

par kiko67 » 26 mai 2014, 10:57

Le script qui
1. se connecte à la base
2. attribue des valeurs aux dossiers
3. Cherche dans ces dossiers tous les fichiers ayant comme nom 23 chiffres et l'extension xml
4 envoye les données vers la base
5. transfere les fichiers vers un autre dossier

NE MARCHE PAS:

Code : Tout sélectionner

<?php set_time_limit(0); echo "starting"; //mysql connection error_reporting(E_ALL ^ E_NOTICE); function connectMaBase(){ $connexion = mysql_connect('localhost','root','kiko67'); mysql_select_db('nagios_to_parcpc'); if (mysql_select_db ('nagios_to_parcpc', $connexion) == false) die ("Serveur inaccessible"); } echo "connecte a la base <br /><br />"; // on atrribue des variables au dossiers $dossierencours="C:\Documents and Settings\900204\Bureau\Test"; $dossiertraite="C:\Documents and Settings\900204\Bureau\Traités"; // On ouvre le dossier a traiter $dossier = opendir ($dossierencours); // on lit le dossier que on a chargé $lecture = readdir ($dossier); // on selectionne que les fichiers xml avec des noms de 23 nombre $liste = new RegexIterator(new DirectoryIterator($lecture,'/^[0-9]{23}\.xml$/i'); if (!empty ($liste)) exit; else{ // pour chaque fichier on extrait le contenu foreach ($liste as $file) $contenu = file_get_contents($file); } mysql_query("INSERT INTO notifications (Alerte, Type_Notification, Service, Hote, Adresse_IP, Etat, ID_Etat, Descriptif, Date_Heure) VALUES ('$alerte', '$typenotif', '$service', '$hote', '$adresse_ip', '$etat', '$descr', '$timestamp')"); $filename = basename($file); //nom du fichier rename($file,"$dossiertraite/$filename_fini"); //déplace php?>
Les données ne sont pas inserées dans la base.
Il me dit erreur à la ligne correspondante à:
$liste = new RegexIterator(new DirectoryIterator($lecture,'/^[0-9]{23}\.xml$/i')
Pourquoi ?

Merci

Re: Traiter seulement les fichiers OK

par kiko67 » 22 mai 2014, 12:05

Merci t'es génial,
on va voir si ça marche.
:wink:

Re: Traiter seulement les fichiers OK

par telnes » 22 mai 2014, 11:24

hello

le plus simple est de faire ce que tu as fait ; scinder les étapes puis après il faut les tradures en php

<?php

$path = "todo"; //chemin vers le répetoire avec les fichier .txt
$to = "done"; //chemin pour les fichiers traités

$files = glob("$path/*.txt"); //récupère le chemin des fichiers dans un tableau

foreach($files as $file){	// pour chaque fichier dans le tableau on fait 

	echo "traitement de $file <br />\n";
	//récupère le contenu
	$content = file_get_contents($file);

	//actions

	//déplace le fichier
	$filename = basename($file); //nom du fichier
	rename($file,"$to/$filename"); //déplace
}


?>

foreach => http://www.php.net/manual/fr/control-st ... oreach.php

Re: Traiter seulement les fichiers OK

par kiko67 » 22 mai 2014, 10:28

Merci :wink: mais,
Le problème c'est que les fichiers texte sont écrits au fur et à mesure dans ce dossier et ont pour nom l'année, le mois, le jour, l'heure, etc..donc une chaine de 23 chiffres puis le .txt.
Je dois donc créer un script qui:
1. scanne le répertoire,
2. ouvre un fichier par ex. 20140522105433123456789.txt
3. traite ce fichier (en insérant les données, formées de CHAMP:VALEUR X 7, dans une table d'une base de données déjà crée)
4. enfin qui le déplace dans un dossier (Archivés)

5. recommence jusque à ce que le dossier soit vide.

Ce script sera lancé par un planificateur de taches.

Panique à bord pour moi, qui débute.

Re: Traiter seulement les fichiers OK

par yann18 » 21 mai 2014, 16:55

pour vérifier l'extension d'un fichier il y a une fonction php toute faite:
//exemple
$file ='fichier.jpeg'; //nom fichier
$ext = pathinfo( $file, PATHINFO_EXTENSION);//jpeg

Re: Traiter seulement les fichiers OK

par kiko67 » 21 mai 2014, 16:29

Ok je vais essayer avec stripos,
mais tu sais, je ne suis pas encore au niveau de me poser des question sur les ressources consommées par le serveur pour glober sur une dizaine de fichiers par jour.

Merci pour ton aide. :wink:

PS: Et je trouve que le manuel est clair pour les initiés comme toi qui connaissent tous les termes qui s'y trouvent mais en vrai on y passe des heures à chercher:
array
string
==
!=
etc...

Re: Traiter seulement les fichiers OK

par xTG » 21 mai 2014, 16:19

glob() te permet de filtrer et de ne récupérer que les fichiers répondant à une expression régulière.
Mais elle est assez consommatrice de ressource.

Une boucle sur la liste des fichiers et un stripos() pour savoir si .txt est détecté ou non dans la chaîne est ce qui coûte le moins cher.
Concernant la manuel... Je vois difficilement comment on peux faire plus clair. Tu te poses la question array VS string mais as-tu regardé le type de paramètre de la fonction ?

Re: Traiter seulement les fichiers OK

par kiko67 » 21 mai 2014, 15:27

Oui ti me renvoies sur le manuel,
mais il n'est pas clair.
Il faut que je fasse un explode avant?
ou que je recherche .txt ?
Il faut specifier la position ?

Les fichiers sont du genre:
1234567890.txt et ils sont dynamiques car le nom change en fonction de la date et de l'heure.
la chaine est donc composée de 23 caractères et .txt

Il n'y a pas une méthode plus simple ?
Qui chercherait que les fichiers contenants .txt ?

Merci pour ton aide