Page 1 sur 1

Sérieux problème de récupération de fichiers

Posté : 09 juil. 2015, 05:33
par L'olivier
Bonjour,

J'ai quelques notions de PHP. Par exemple, J'arrive a intervenir dans un CMS directement au niveau PHP sans rien casser.
Mais je me sers à chaque fois de ce qui est déjà écrit en le retouchant en fonction de mes besoins.

Aujourd'hui, j'ai un gros ,problème d'import export.
Je refonds un site en php pur vers un site CMS (php+bdd)
Je dois récupérer 1045 textes disséminés dans 1045 fichiers PHP.
J'ai commencé à la main, mais c'est très long et très soulant.
En plus, j'ai un grand risque d'erreur d'imprécision avec la souris.

J'ai déjà cherché a automatiser la récup, mais je ne maitrise réellement bien que le vba sous access (que j'affectionne malgré ses failles bien connues).
Il me sert de moulinette.
Sauf que là, j'ai un bâts qui blesse grave. Ce crétin d'Access ne connait pas et ne veut pas connaitre l'UTF-8.
(windows n'aime pas linux)
Il ne sait donc pas ouvrir et traiter l'intérieur des fichiers.

Donc, mon besoin.
Intégrer une routine PHP dans le site à récupérer pour qu'elle me fabrique un ou des fichiers csv que je pourrais tranquillement bidouiller en extérieur du site.
Est ce que quelqu'un pourrait me donner une piste a suivre pour :
1 - trouver et recenser les fichiers à récupérer
2 - fabriquer un export au format csv unicode digérable par zindows.
3- voire mieux, repérer les balises html qui m'intéresse pour n'extraire que l'intéressant (c'est un plus optionnel)

Merci d'avance

Re: Sérieux problème de récupération de fichiers

Posté : 10 juil. 2015, 15:47
par Megadeth
Salut,

Concernant tes 1045 fichiers il n'y a que du texte dedans ? Une solution avec des includes ?

Comment ces fichiers sont ils censés s'agencer dans ton nouvel environnement ? En base ?

Mega
;)

Re: Sérieux problème de récupération de fichiers

Posté : 10 juil. 2015, 16:19
par @rthur
Bonjour,

Voici quelques pistes :
1 - trouver et recenser les fichiers à récupérer
Tu mets tous tes fichiers HTML dans un répertoire puis tu fais une boucle foreach(glob()) comme dans l'exemple de la doc PHP :
http://php.net/manual/fr/function.glob.php
2 - fabriquer un export au format csv unicode digérable par zindows.
Au sein de la boucle, tu fais ce que tu veux (l'exemple de la doc affiche le nom du fichier et sa taille sur le disque), par exemple tu peux utiliser file_get_contents() pour récupérer le contenu du fichier HTML et le mettre ailleurs (dans un fichier CSV ou dans une bdd).
Pour remplir un fichier CSV, PHP a une fonction pour cela : http://php.net/manual/fr/function.fputcsv.php
Si tu rencontre des problèmes d'accents/uf8, tu as les fonctions utf8_encode() et utf8_decode qui pourront te sortir de la grande majorité des cas.
3- voire mieux, repérer les balises html qui m'intéresse pour n'extraire que l'intéressant (c'est un plus optionnel)
Là c'est plus compliqué, soit avec une expression régulière et preg_match() pour faire l'extraction, soit avec un xpath si ton html est bien formé.
http://php.net/manual/fr/function.preg-match.php
http://php.net/manual/fr/class.domxpath.php (cf les commentaires pour des exemples fonctionnels)

Re: Sérieux problème de récupération de fichiers

Posté : 11 juil. 2015, 20:51
par L'olivier
Merci pour vos réponses.

Tout bien réfléchi et vu que je maitrise un peu le SQL.
Je vais remplir une table mysql avec les résultats d'une boucle.
Comme ça, le tout reste sur le site et une seule exécution réussie suffira a récupérer.
Ensuite via phpMyAdmin, je peux tout à fait extraire les données dans le format qui me convient dans un gros csv.
Meilleure solution pour moi ...

La boucle :

<?php
Ma fonction de boucle sur les répertoires () {
Foreach (répertoire dans le répertoire) {
Ma_fonction_d'écriture ($répertoire_visité) ;
}


Ma fonction d'écriture ($répertoire_visité) {
foreach (glob($répertoire_visité . "/*.php") as $filename) {
// Ma routine d'ajout sql
$contenu = file_get_contents(($filename);
ajoute_dans _la_BD ("ADD 'path_du_fichier', 'nom_du_fichier', "contenu_du_fichier' INTO matable ;") ;
}
?>

Je ne dois pas être bien loin.

Merci beaucoup.
Je vais tenter une écriture de cela et reviendrai vous remercier dès que j'aurai réussi à le faire fonctionner.

Re: Sérieux problème de récupération de ficlhiers

Posté : 13 juil. 2015, 07:16
par L'olivier
mon code :

Code : Tout sélectionner

<?php // Connexion au serveur $link = mysql_connect("mon_srv", "mon_id", "mon _pwd") or die("Impossible de se connecter : " . mysql_error()); echo 'Connexion reussie'; ?> <br> <?php $db_selected = mysql_select_db('Ma_Db', $link); if (!$db_selected) { die ('Impossible de sélectionner la base de données : ' . mysql_error()); } echo 'Database selected'; ?> <br> <?php // visite les dir function ScanDirectory($Directory){ $MyDirectory = opendir($Directory) or die('Erreur'); while($Entry = @readdir($MyDirectory)) { if(is_dir($Directory.'/'.$Entry)&& $Entry != '.' && $Entry != '..') { echo '<ul>'.$Directory.'/'.$Entry; ScanDirectory($Directory.'/'.$Entry); echo '</ul>'; } else { if(strrchr($Entry,'.')==".php"){ echo $Entry."<br />"; $contenu = file_get_contents($Entry, true); $sql = "INSERT INTO `test`(`chemin`, `nom`, `contenu`) VALUES ('".$Directory."', '".$Entry."', '".$contenu."')"; $result = mysql_query($sql); if (!$result) { echo $db_selected." / "; die('Requête invalide : ' . mysql_error()); } } } } closedir($MyDirectory); } ScanDirectory('.'); exit;
Voilà ... ce qui fonctionne :
- connexion avec DB, pas de souci
- visite des répertoires et des sous-épertoire 1 à 1, pas de souci
- Trouve les fichiers "*.php" et les ouvre, pas de souci
-Enregistre dans la base de données, souci

La fonction ScanDirectory() est itérative et comprend toute la mécanique.
J'ouvre sans problème un certain nombre de fichiers et pas d'autres ?????
J'enregistre sans problème dans la DB, certains contenus et pas d'autres ... ???
La requête bute sur les ' (apostrophes) rencontrés (j'avais auparavant fait tourner notepad++ pour remplacer tous les ' par des € (seul caractère inutilisé et retrouvable facilement).

Pourquoi la ligne
--> $contenu = file_get_contents($Entry, true);
fonctionne intempestivement ????
des fois, oui .. des fois, non
Je ne comprends pas

???
:(

Re: Sérieux problème de récupération de fichiers

Posté : 13 juil. 2015, 11:23
par tof73
http://php.net/manual/fr/function.mysql ... string.php pour les '

il faut indiquer le chemin en plus du nom du fichier, sinon cela ne fonctionne que si le fichier est dans le même répertoire que le script.

Re: Sérieux problème de récupération de fichiers

Posté : 13 juil. 2015, 18:39
par L'olivier
tof73,
Merci, c'était tout bêtement ça.
Après avoir passé presque 2 jours à construire mon petit bout de code en essayant pleins de solutions différentes. Je n'y voyais plus rien.
Maintenant, il me trouve les fichiers comportant des ' dans les noms que je dois modifier un à un ...
yena pas de trop ...
J'avais oublié aussi d'ajouter un if pour ne pas traiter mon fichier ma_routine.php :)

Ayé, il est passé et ma_DB me dit que tout est arrivé !! merci, trop content

script final (si ça peut aider)

Code : Tout sélectionner

<?php // Connexion au serveur $link = mysql_connect("mon_srv", "mon_id", "mon_pwd") or die("Impossible de se connecter : " . mysql_error()); echo 'Connexion reussie'; ?> <br> <?php $db_selected = mysql_select_db('ma_DB', $link); if (!$db_selected) { die ('Impossible de sélectionner la base de données : ' . mysql_error()); } echo 'ma_DB selected'; ?> <br> <?php // visite les dir function ScanDirectory($Directory){ $MyDirectory = opendir($Directory) or die('Erreur'); while($Entry = @readdir($MyDirectory)) { if(is_dir($Directory.'/'.$Entry)&& $Entry != '.' && $Entry != '..') { echo '<ul>'.$Directory.'/'.$Entry; ScanDirectory($Directory.'/'.$Entry); echo '</ul>'; } else { if(strrchr($Entry,'.')==".php"){ echo $Entry."<br />"; if ($Entry!="ma_routine.php"){ $contenu = file_get_contents($Directory.'/'.$Entry, true); $sql = "INSERT INTO `test`(`chemin`, `nom`, `contenu`) VALUES ('".$Directory."', '".$Entry."', '".$contenu."')"; $result = mysql_query($sql); if (!$result) { echo $db_selected." / "; die('Requête invalide : ' . mysql_error()); } } } } } closedir($MyDirectory); } ScanDirectory('.'); exit;


@Mega,
Concernant tes 1045 fichiers il n'y a que du texte dedans ? Une solution avec des includes ?
Comment ces fichiers sont ils censés s'agencer dans ton nouvel environnement ? En base ?


Je ne t'ai pas répondu, pardon.
Il m'a compté 1275 fichiers (tout ne doit pas être gardé).
Non, il n'y a pas que du texte dedans.
Il y a aussi la mécanique php de construction des pages html avec des appels aux routines et une structure répétée dans chaque fichier.
Je ne sais pas du tout d'où sort ce framework.
Je sais que le gars qu'à le site utilise depuis super longtemps dreamweaver.
Je suppose que ce doit être un site template (exemple) du soft.
Ce site a plus de 10 ans.
Dans chaque page, y a la mécanique et les données
Les données sont :
Le titre de la page
Le contenu principal
les keywords
la description de la page
des textes supplémentaires associées (colonne de droite)

exemple de page

Code : Tout sélectionner

<?php // Appel du fichier de gestion du comptage avec cookie include($_SERVER['DOCUMENT_ROOT']."/_compteur.php"); // Gestion des variables de description de page $title = "La Mecanique Universelle | égalité | Philosophie, ontologie, religion, liberté, bonheur"; $description = "L'humanité est vouée à atteindre sa perfection | Philosophie, ontologie, contigeance, la mécanique universelle"; $keywords = "ontologie, Amour, amour, divin, Esprit, esprit, suprême, verbe, innommable, éternel, omnipotent, omniprésent, omniscient, acte pur, atome, matière, quarks, photon, big bang, univers, quantique, physique, métaphysique, créateur, joie, vide, Braman, Yahvé, Allah amour absolu, immatériel, homme, égalité, liberté, penseurs, société, me politique, marché, libéralisme, Rochefoucauld, Rousseau, Saint-Thomas, Say, schellingschen, Schelling, Schopenhauer médias, mal, action, technique, nihilisme, domination, être, dieu, l'un, l'absolu, absolu, islam, bouddhisme, Tao, judaïsme, ascétisme, principe créateur, transcendance, transcendant, immanence, immanent, Bayle, Benjamin, Bentham, Berkeley, Bernard, Bestialitât, Between, Bossuet diable, démon, infini, évolution, existentialisme, sagesse, mondialisation, perfection, humanité, humanité, philosophe, philosophie, philosophique, spiritualité, spiritualite, spirituel, spirituelle, religion, religions, religieux, religieuse, l'extase, béatitude, éveil, aqîqa, nirvana, délivrance, ataraxie, époché, conscience, essence, destinée, hasard, vivant, mort, médias, métaphysique, metaphysique, bonheur, téléologie, teleologie, universaliste, intelligence,Pythagore, Héraclite, Parmenide, Platon, Marx, Sartre, Kirkegaard, Malebranche, Spinoza, Hegel, Descartes"; // Appel des fichiers nécessaires à la connexion MySQL et à la gestion des pages $root = $_SERVER['DOCUMENT_ROOT']; require($root."/_fonction/generique.php"); ?> <!--Début tableau contenu global du site--> <link href="_css/web_site.css" rel="stylesheet" type="text/css" /> <table cellspacing="0" cellpadding="0"> <tr><td class="tdcenter" valign="top"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="widthset"></td> </tr> </table> <?require($root."/_look/menu_chap.php");?> <!--Début tableau contenu central--> <table cellspacing="0" cellpadding="0" width="100%"> <tr> <td valign="top" class="tdcentertxt"><p class="chapitre">L'exemple tantrique<p><span class="chapo1">Approcher l'amour et la cuisine avec un abandon insouciant (bouddhisme)</span>Dans la relation sexuelle par exemple, si le couple pouvait s'abandonner aux sensations, en faisant abstraction de toutes les idées, les images, les peurs, les principes, les paroles, et toutes les mécaniques mentales qui parasitent la sensation, les 2 partenaires atteindraient vraissemblablement l'extase absolu, c'est-à-dire le plaisir absolu des sens et du sentiment pur. Dès que nous en faisons l'expérience, il devient évident que les sensations procurées par le contact entre 2 individus se désirant, les métamorphoses organiques et psychiques, le bien être que ces actes procure donne la mesure de ce qui pourrait être atteint. En effet, si l'homme pouvait s'extirper du mécanisme cérébral qui fait que le moindre petit détail, une odeur, un bruit, un grain de beauté, un vague reproche, le désir de rendre l'autre conforme à nos désirs, un infime ressentiment, peut entraver la sensation absolue procurée par le corps de l'autre. Il s'agit de l'extase amoureuse.<p>Si j'arrivais donc à écarter cette « personne &raquo; qui pense en moi à travers la masse des stéréotypes appris, si je parvenais à éteindre les réflexions et les jugements permanents du sujet prénommé « jean marc&raquo;, la conscience pure et objective </span>de mon être prendrait le relais de cette conscience personnelle et subjective</span>. La conscience pure et objective percevrait l'essence des choses et non plus les étiquettes que nous collons sur elle.<p><span class="chapo1">Atteindre le vide c'est vider sa conscience</span> Lorsqu'un être humain parvient à prendre conscience des choses à travers sa conscience pure</span><strong>,</strong> il est en état de <em>béatitude</em>, de <em>nirvana</em>, d'<em>extase</em>. Cette conscience intérieure de l'être profond, ne <em>pense</em> pas le monde, elle le <em>ressent</em>, elle est <strong>conscience directe</strong> des choses, <em>conscience intuitive</em>.</p> </td> </tr> </table> <!--Fin tableau contenu central--> <?require($root."/_look/nav_chap.php");?> </td> <td class="tdright" valign="top"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><img src="image/vrac/blind_pix.gif" width="140" height="1"></td> </tr> </table> <!--Début tableau contenu droite--> <table cellspacing="0" cellpadding="0" class="tabright" > <tr> <td align="center"> </td> </tr> </table> <!--Fin tableau contenu droite--> </td> </tr> </table> <!--Fin tableau contenu global du site--> <?require($root."/_look/footer.htm");?>
J'ai encore du boulot dessus mais grâce à vous la partie récupération php est passée
Problème résolu.

Merci à tous

Re: Sérieux problème de récupération de fichiers

Posté : 14 juil. 2015, 08:05
par L'olivier
oops ! :oops:

J'ai oublié l'encodage UTF-8 ... #-o

Merci @rthur

J'ai modifié la ligne de récupération du contenu :
$contenu = utf8_decode(file_get_contents($Directory.'/'.$Entry, true));
et paramétré le champ de ma table en ==> latin1_bin

Voilà, c'est plus lisible avec le bon encodage. =D>

Franchement, j'ai du mal a comprendre ces histoires d'encodage ...
:shock: