8791 sujets

Développement web côté serveur, CMS

Salut à tous. je me retrouve devant un phénomène qu'on pourrait qualifier de paranormal (surtout après pas mal de temps dessus).

J'ouvre un fichier dans lequel je fais des str_replace. Si je le met avant la reception d'un $_FILES. ca marche. Si je le met après, mes "règles" de replace sont baffoué en étant dédoublée.

Voici la ligne que je veux remplacer (elle se trouve dans un fichier .HTM)


<img width='248' height='155' src="aide/welcome_fichiers/image001.jpg" />


Je vais donc chercher ce fichier et remplacer ce que je veux


$txt_page = file_get_contents ($fichier);	
/* SUPPRESSION DU SUPERFLU DANS LE FICHIER */
$txt_page = str_replace("clear=ALL", "", $txt_page);
$txt_page = str_replace('src="', 'src="aide/', $txt_page);
$txt_page = str_replace('aide/aide/', 'aide/', $txt_page);
$txt_page = str_replace('.gif', '.jpg', $txt_page);
/* SUPPRESSION DU SUPERFLU DANS LE FICHIER */

ici $fichier vient de $_POST (c'est mon champ file).

juste en dessous de ces lignes j'ai un :

$fichier = $_FILES['fichier']['name'];

Donc je récupère mon input file.

Si je fais ca comme cela, ca fonctionne.

Mais si je place la reception du $_FILES au dessus de la variable $txt_page ....

voila ce que j'obtient dans ma page HTML

=>


[b]si je le met après : [/b]
<img width='248' height='155' src="aide/welcome_fichiers/image001.jpg" />

[b]Si je le met avant : [/b]
<img width='248' height='155' src="aide/aide/aide/aide/aide/aide/aide/welcome_fichiers/image001.jpg" />


Bon ok ... ca marche donc c'est pas bien grave. Mais ca m'intrigue. Il n'y à aucune boucle dans la page qui pourrait produire cet effet...

Est-ce que quelque part str_replace et $_FILES ne s'aiment pas ?

C'est un peu confus comme explication mais je ne comprend pas bien non plus en fait ...;

Si vous pouviez m'éclairer pour ma culture personnelle.

Rude
Modifié par ffwrude (08 Oct 2007 - 18:43)
Ok je poste l'intégrale mais bon ... le fichier HTM n'est pas important, c'est un fichier généré par Word. Et j'ai besoin de remplacer certains trucs dans l'html que génère Word.

Formulaire =>


<script type='text/javascript'>
	function fonction_submit(){
		document.getElementById('nom_fichier').value = document.getElementById('fichier').value;
		document.envoi.submit();
	}
</script>

<div style='width:100%;text-align:center;border:1px solid black;height:100%;'>
	<br />
	<span style='text-align:center;width:100%;font-weight:bold;font-family:arial;font-size:18px;color:darkblue;'>
		Envoi des fichiers aide Kav@log.
	</span>
	<br /><br />
	<form name='envoi' id='envoi' enctype='multipart/form-data' method='post' action='traitement.php'>
		Keywords : <input type='text' name='keywords' />
		<br /><br />
		Cat&eacute;gorie : <input type='text' name='categorie' />
		<br /><br />
		R&eacute;f&eacute;rence : <input type='text' name='reference' />
		<br /><br />
		Fichier : <input type='file' id='fichier' name='fichier' />
		<br /><br />
		<input type='hidden' name='nom_fichier' id='nom_fichier' />
		<input type='button' value='Submit' onclick='fonction_submit();' />
	</form>
</div>


(Je sais, pas de doctype. mais c'est pour une application locale).

Puis ensuite la page de traitement


<?php

	/* =========---------------- ATTENTION !!! ------------------------== 
		
		Ce fichier respecte la structure : nom_de_dossier/nom_de_dossier.htm & nom_de_dossier/nom_de_dossier_fichiers/*.*
		Exemple : ./welcome/welcome.htm & ./welcome/welcome_fichiers/*.*
		
	     ===================------------------====================--*/
	[b]$txt_page = file_get_contents ($fichier);	
	/* SUPPRESSION DU SUPERFLU DANS LE FICHIER */
	$txt_page = str_replace("clear=ALL", "", $txt_page);
	$txt_page = str_replace('src="', 'src="aide/', $txt_page);
	$txt_page = str_replace('aide/aide/', 'aide/', $txt_page);
	$txt_page = str_replace('.gif', '.jpg', $txt_page);
	/* SUPPRESSION DU SUPERFLU DANS LE FICHIER */[/b]
	
	
	/* Recuperation des variables */
	
	[b]$fichier = $_FILES['fichier']['name'];[/b]
	$keywords = $_POST["keywords"];
	$categorie = $_POST["categorie"];
	$reference = $_POST["reference"];
	echo "<b>".$_POST["nom_fichier"]."</b><br />";
	$nom1 = split("\\\\\\\\",$_POST["nom_fichier"]); // SUPPRESSION DES SLASHS dans le nom du fichier
	$nom_dossier1 = split(".htm",$fichier); 		// Pour récuperer le NOM du fichier et du dossier
	$nom_dossier = $nom_dossier1[0];
	print_r($nom1);
	$nom = "./".$nom_dossier."/".$nom_dossier;			//Définit l'URL du nom de dossier. exemple => ./welcome/welcome (sans l'extension)
	
	/* Ecriture du fichier avec les corrections */
	//unlink("./".$nom_dossier1[0]."/".$fichier);
	$fp = fopen("./".$nom_dossier1[0]."/".$fichier,"w");
	fwrite($fp,$txt_page);
	fclose($fp);
			// Récupere contenu du fichier
	//echo $txt_page;
	
	
	/*Ecriture du fichier avec les corrections */
	
	// Etape de transformation GIF => JPEG + suppression Thumbs.db
		$files_1 = glob($nom."_fichiers/*.*");
	foreach($files_1 as $filename_1){
		
		$decoupage = substr($filename_1,-3,3);
		$decoupage2 = split("/",$filename_1);
		
		if($decoupage == ".db"){
			unlink($nom."_fichiers/Thumbs.db");
		}
		
		if($decoupage == "gif"){
			$src_jpg=imagecreatefromgif($filename_1); 
			Imagejpeg($src_jpg,$nom."_fichiers/".substr($decoupage2[3],0,-4).".jpg"); 
			ImageDestroy($src_jpg);
			unlink($nom."_fichiers/".substr($decoupage2[3],0,-4).".gif");
		}
	}
	
	$i = 0;
	// récupération des fichiers associés au .HTM
	$files = glob($nom."_fichiers/*.*");
	foreach ($files as $filename){
		$destination = $filename;
		$new_filename = split("/",$filename);
	echo "<br /><span style='color:darkred;font-weight:bold;'>".$files[$i]."</span><br />";
	echo "<br /><span style='color:darkblue;font-weight:bold;'>".$filename."</span><br />";
		$i++;
	$destination_file = "./www/aideK/aide/".$nom1[5]."_fichiers/".$new_filename[3];
	echo "<br />Destination file => ".$destination_file."<br />";
	$source_file = $filename;
	echo "<br />Source file => <b>".$source_file."</b><br />";
	
	
	
	
	// Mise en place d'une connexion basique
	$ftp_server = "serveur";
	$conn_id = ftp_connect($ftp_server);
	
	$ftp_user_name = "login";
	$ftp_user_pass ="pass";
	
	// Identification avec un nom d'utilisateur et un mot de passe
	$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
		$dir = './www/aideK/aide/'.$nom1[5].'_fichiers/';
		@ftp_mkdir($conn_id, $dir);
	// Vérification de la connexion
	if ((!$conn_id) || (!$login_result)) {
	    echo "La connexion FTP a échoué !";
	    echo "Tentative de connexion au serveur $ftp_server pour l'utilisateur $ftp_user_name";
	    exit;
	}else{
	    echo "Connexion au serveur $ftp_server, pour l'utilisateur $ftp_user_name<br />";
	}

	// Chargement d'un fichier sur le FTP
	$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY); 

	// Vérification du status du chargement
	if (!$upload) {
	    echo "Le chargement FTP a échoué!";
	}else{
	    echo "Chargement de $source_file vers $ftp_server en tant que $destination_file";
	}
}
	$upload2 = ftp_put($conn_id,"./www/aideK/aide/".$nom1[5].".htm", $nom.".htm", FTP_BINARY); 
	if (!$upload2) {
	    echo "Le chargement FTP a échoué!";
	}else{
	    echo "<br />Chargement de ".$nom.".htm vers $ftp_server en tant que ./www/aideK/aide/".$nom1[5].".htm";
	}
	
	// Fermeture du flux FTP
	ftp_close($conn_id);
	
	// Redirige vers la base de données.
	echo "<script type='text/javascript'>alert(\"\");window.open('insert_base.php?k=".$keywords."&c=".$categorie."&f=".$fichier."&r=".$reference."','','');</script>";
?>


(le document.location pointe en réalité vers une adresse de type http://www )
Modifié par ffwrude (09 Oct 2007 - 11:07)
Bah de l'input file dans le formulaire.

Fichier : <input type='file' id='fichier' name='fichier' />


PS : si ce genre de problème t'éclate j'en ai un autre en réserve du même style lol. avec un strpos qui trouve pas toutes les occurences d'une chaine Smiley smile
Modifié par ffwrude (09 Oct 2007 - 14:45)
register_global à on Smiley sweatdrop
Je te conseil de faire quelques recherches sur les problèmes de sécurités posés par cette directive du ini.


Pour revenir à ton problème je penses que $_FILES['fichier']['name'] (fichier chez le client) est erroné pour ce que tu veux en faire, l'utilisation correcte serait $_FILES['fichier']['tmp_name'] (fichier uploadé).


PS: la fonction strpos() est décrite dans la doc officielle comme:
a écrit :
Retourne la position numérique de la première occurrence de needle dans la chaîne de caractères haystack.
Register_global à ON ? je ne sais pas trop ce que c'est ... Pourrait tu m'éclairer ?

. Pour le $_FILES, je ne vois pas en quoi il est erroné. Je viens de tester quand même et j'ai toujours ce même souci.

Rude

PS : non rien à voir ce que je veux dire c'est que je fais un strpos de "color:" et il me zappe les 3premiers. assez fun Smiley smile
Pour register_global, voir un article sur php.net à ce sujet qui explique bien mieux que moi.

$_FILES['truc']['name'] ne correspond pas à l'adresse du fichier uploadé mais au nom tel que sur l'ordinateur expéditeur.
Peut-être que ça marche en local, mais sur le net je penses pas que ça soit fiable.



PS: ah dans ce cas probableemnt autre chose qui intervient
Et voilà, je soupçonnais un problème de register_globals déjà à la base.


Alors pour répéter ce qui est répété dans 32 767 articles sur le web, si t'as un input avec un name="fichier" par exemple, il ne faut jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais jamais utiliser $fichier directement comme ça, mais toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours toujours $_POST['fichier'], ça fera 255 problèmes en moins Smiley smile
En fait c'est pour une appli locale. Elle n'ira jamais sur le net.

Pour le $fichier utilisé comme ca au départ, ce n'était pas fait de la sorte. C'est à cause de mon problème avec la position du $_FILES[""] dans le fichier que je l'ai utilisé comme tel.

Je n'y comprend franchement rien. Je suis rester un peu après le boulot hier pour repartir la dessus et piger POURQUOI ca bug des que je déplace le $_FILES...

C'est assez bluffant ...

Rude

PS : merci pour l'article. Je ne savais pas que ca s'appellait comme ca .
As-tu un exemple de fichier uploadé qu'on puisse tester, parce que chez moi str_replace marche bien après un $_FILES[] Smiley cligne .
de la page venant du file get contents ?

EDIT : bon bah voilà mais c'est un peu lourd.

Alors il y'à beaucoup de truc vide parce que j'ai du épurer le contenu du fichier avant de le mettre ici. Il est donc parfois normal d'avoir des balises sans aucun contenu à l'interieur. Mais je ne peux pas mettre le fichier "original"

J'ai épurer car la page HTML est un manuel venant de Word.

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head>


<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 11">
<meta name="Originator" content="Microsoft Word 11">

<div class="Section1">

<p class="MsoNormal" style="text-align: center;" align="center"><b><span style="font-size: 24pt; font-family: Arial; color: red;">SOUSCRIRE UNE DEMI-</span></b></p>

<p class="MsoNormal" style="text-align: center;" align="center"><b><span style="font-size: 24pt; font-family: Arial; color: red;">&nbsp;</span></b></p>

<p class="MsoNormal"><span style="font-family: Arial; color: red;">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-size: 13pt; font-family: Arial; color: red;">&nbsp;</span></p>

<ol style="margin-top: 0cm;" start="1" type="1">
 <li class="MsoNormal" style="color: rgb(51, 153, 102);"><b><u><span style="font-family: Arial;">Fenêtre principale des
     </span></u></b><o:p></o:p></li>
</ol>

<p class="MsoNormal"><b><span style="font-size: 13pt; font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b></p>

<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><span style="font-size: 13pt; font-family: Symbol;">·</span><span style="font-size: 7pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 13pt; font-family: Arial;">Sur la fiche de la personne, ouvrir
l&#8217;onglet «&nbsp;demi-&nbsp;»</span></p>

<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><span style="font-size: 13pt; font-family: Symbol;">·</span><span style="font-size: 7pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 13pt; font-family: Arial;">Cliquer sur le bouton «&nbsp;ajouter
une demi-&nbsp;»</span></p>

<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt;"><span style="font-size: 13pt; font-family: Symbol;">·</span><span style="font-size: 7pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 13pt; font-family: Arial;">Choisir la catégorie désirée, puis
l&#8217;article associé.</span></p>

<p class="MsoNormal"><span style="font-size: 13pt; font-family: Arial;">&nbsp;</span></p>

<p class="MsoNormal"><b><span style="font-size: 13pt; font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b></p>

<ol style="margin-top: 0cm;" start="2" type="1">
 <li class="MsoNormal" style="color: rgb(51, 153, 102);"><b><u><span style="font-family: Arial;">Fenêtre de définition
     des paramètres d&#8217;un article à ation récurrente</span></u></b><o:p></o:p></li>
</ol>

<p class="MsoNormal"><b><span style="font-size: 13pt; font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b></p>

<p class="MsoNormal"><b><span style="font-size: 13pt; font-family: Arial; color: rgb(51, 153, 102);"><img id="_x0000_i1025" src="aide/demi_fichiers/image001.jpg" height="37" width="41">&nbsp; </span></b><span style="font-family: Arial;">Le nom du  associé à la demi-
n&#8217;apparaîtra que si ce dernier est défini comme «&nbsp;nous appartient&nbsp;»
et «&nbsp; de club&nbsp;».</span></p>

<p class="MsoNormal"><b><span style="font-size: 13pt; font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b></p>

<p class="MsoNormal"><span style="font-family: Arial;">Choisir la durée de période
able&nbsp;:</span></p>

<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-size: 10pt; font-family: Symbol;">·</span><span style="font-size: 7pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-family: Arial;">Calage des périodes sur la période
standard:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span style="">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-family: Arial;">Ex: Si le  arrive en
cours de mois, le montant de la  sera <span class="SpellE">proratisé</span>.
Les es suivantes commenceront le 1er de chaque mois.<o:p></o:p></span></p>

<p class="MsoNormal"><span style="font-family: Arial;"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal"><o:p>&nbsp;</o:p></p>

<p class="MsoNormal" style="text-indent: 18pt;"><span style="font-size: 10pt; font-family: Symbol;">·</span><span style="font-size: 7pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="font-family: Arial;">Début de chaque période respectant le
même jour:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</p>

<p class="MsoNormal"><span style="font-family: Arial;">Ex: Si le  arrive le
15 du mois, les es commenceront toujours à cette même date.</span></p>

<p class="MsoNormal">&nbsp;</p>

<ol style="margin-top: 0cm;" start="3" type="1">
 <li class="MsoNormal" style="color: rgb(51, 153, 102);"><b><u><span style="font-family: Arial;">Attribution d&#8217;un
      d&#8217;heures à une </span></u></b><b><span style="font-family: Arial;">:<o:p></o:p></span></b></li>
</ol>

<p class="MsoNormal"><o:p>&nbsp;</o:p></p>

<p class="MsoNormal"><o:p>&nbsp;</o:p></p>

<p class="MsoNormal"><b><span style="font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b><span style="font-family: Arial;">Si un  d&#8217;heures est associé à la , et
que celui-ci est suffisant, la durée de la  sera ajoutée au cumul
d&#8217;heures de la . Il n&#8217;y aura pas de ation ni de décrémentation des
s.<o:p></o:p></span></p>

<p class="MsoNormal"><o:p>&nbsp;</o:p></p>

<p class="MsoNormal"><span style="font-family: Arial;">&nbsp;En revanche, si il n&#8217;y
a pas de  d&#8217;heures défini, ou que celui-ci est insuffisant, la 
sera ajoutée au panier ou décrémenté de la .<o:p></o:p></span></p>

<p class="MsoNormal"><o:p>&nbsp;</o:p></p>

<p class="MsoNormal"><b><span style="font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b><b><span style="font-size: 13pt; font-family: Arial; color: rgb(51, 153, 102);"><img id="_x0000_i1026" src="aide/demi_fichiers/image001.jpg" height="37" width="41"></span></b><b><span style="font-family: Arial; color: rgb(51, 153, 102);"> &nbsp;&nbsp; </span></b><span style="font-family: Arial;">La date de la première  concernée ne doit pas
être antérieur à la date de début de .</span></p>

<p class="MsoNormal"><span style="font-family: Arial;">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-family: Arial;">&nbsp;</span></p>

<p class="MsoNormal">&nbsp;</p>

<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: Arial;">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-family: Arial;">&nbsp;</span></p>

<p class="MsoNormal"><b><span style="font-size: 13pt; font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b></p>

<p class="MsoNormal"><b><span style="font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b></p>

<p class="MsoNormal"><b><span style="font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b></p>

<p class="MsoNormal"><b><span style="font-family: Arial; color: rgb(51, 153, 102);">&nbsp;</span></b></p>

<p class="MsoNormal"><span style="font-size: 13pt;">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-size: 13pt;">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-size: 13pt;">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-size: 13pt;">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-size: 13pt;">&nbsp;</span></p>

<p class="MsoNormal"><span style="font-size: 13pt;">&nbsp;</span></p>

</div>


</body></html>

Rude
Modifié par ffwrude (10 Oct 2007 - 17:02)
Testé chez moi en local avec le code suivant, en lui envoyant la page que tu as mis via le même formulaire:

	$fichier = $_FILES['fichier']['tmp_name'];
	$txt_page = file_get_contents ($fichier);
	/* SUPPRESSION DU SUPERFLU DANS LE FICHIER */
	$txt_page = str_replace("clear=ALL", "", $txt_page);
	$txt_page = str_replace('src="', 'src="aide/', $txt_page);
	$txt_page = str_replace('aide/aide/', 'aide/', $txt_page);
	$txt_page = str_replace('.gif', '.jpg', $txt_page);
	/* SUPPRESSION DU SUPERFLU DANS LE FICHIER */


	/* Recuperation des variables */
	$fichier = $_FILES['fichier']['name'];

	echo $txt_page, $fichier;
	exit();
	// ...

(register_global et magic_quotes sont à off chez moi)

Eh bien ça marche j'ai bien
<img width='248' height='155' src="aide/test_fichiers/image001.jpg" />

pas de /aide/aide/aide/aide Smiley confus
Modifié par Necromantik (10 Oct 2007 - 19:44)