Ecrire des variables dans un fichier avec fwrite

Mammouth du PHP | 531 Messages

27 janv. 2008, 22:59

Bonsoir.
Petit soucis pour écrire le contenu de variables avec fwrite :
<?php

$fichier = fopen ('../config.php','w+');
	fwrite ($fichier, "
<?php
mysql_connect ('".$_POST["serveur"]."', '".$_POST['identifiant']."', '".$_POST['passe']."') OR DIE ('<p>'.$serveur_erreur.'</p>'.mysql_error());
mysql_select_db ('".$_POST['base']."') OR DIE ('<p>'.$serveur_erreur.'</p>'.mysql_error());
?>
");
J'ai bien testé avec echo les variables envoyées mais quand j'ouvre le fichier à tous les endroits ou devraient être le contenu es variables je n'ai rien...

J'ai foiré quelque part ? :(

PS : pour $serveur_erreur, je veut bien écrire $serveur_erreur et non le contenu d'une variables (ce n'est pas une erreur)

Eléphant du PHP | 445 Messages

27 janv. 2008, 23:11

Essayes d'echapper les caractères speciaux.

Code : Tout sélectionner

< par \< ? par \? > par \>

Mammouth du PHP | 531 Messages

27 janv. 2008, 23:54

Essayes d'echapper les caractères speciaux.

Code : Tout sélectionner

< par \< ? par \? > par \>
Oula en échappant c'est l'anarchie :
\<\?php
mysql_connect ('', '', '') OR DIE ('<p>'..'</p>'.mysql_error());
mysql_select_db ('') OR DIE ('<p>'..'</p>'.mysql_error());
\?\>
Et sinon sans échapper ça donne ça :
<?php
mysql_connect ('', '', '') OR DIE ('<p>'..'</p>'.mysql_error());
mysql_select_db ('') OR DIE ('<p>'..'</p>'.mysql_error());
?>
:roll:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 janv. 2008, 00:07

J'ai l'impression que tu ne t'y prends pas de la bonne manière.

Apparemment tu es en train d'écrire un script de modification des identifiants de connexion un peu comme dans ce sujet.

Tu ne dois pas aller modifier un fichier complet mais juste les données concernées donc les identifiants qui peuvent être placés dans un fichier xml.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 531 Messages

28 janv. 2008, 00:21

En fait c'est pas tout à fait ça.
Ce n'est pas un script de modification mais de création. Une fois qu'il est fait on y touche plus.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 janv. 2008, 00:26

idem... tu crées ton script qui va lire le fichier xml avec ces données et affectes les variables avec ce qui a été lu :)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 531 Messages

28 janv. 2008, 00:35

Je vais regarder ça alors :wink:
Mais conçernant le pourquoi la variable ne s'écrit pas dans le fichier ça me turlupine quand même :D

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

28 janv. 2008, 00:42

les variables POST sont vides :-k

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 531 Messages

28 janv. 2008, 00:54

Non ça serait trop facile :lol:
J'ai testé avec un echo
<?php
switch($etape) {
	default :
	$contenu = '
<form method="post" action="index.php?etape=1">
<label>Serveur SQL : </label><input type="text" name="serveur" />
<label>Identifiant SQL : </label><input type="text" name="identifiant" />
<label>Passe : </label><input type="text" name="passe" />
<label>Base : </label><input type="text" name="base" />
<input type="submit" value="Valider" />
</form>
';
	break;
	case 1 : echo $_POST['serveur'];
	$fichier = fopen ('../config.php','w+');
	fwrite ($fichier, "
<?php
mysql_connect ('".$_POST['serveur']."', '".$_POST['identifiant']."', '".$_POST['passe']."') OR DIE ('<p>'.$serveur_erreur.'</p>'.mysql_error());
mysql_select_db ('".$_POST['base']."') OR DIE ('<p>'.$serveur_erreur.'</p>'.mysql_error());
?>
");
}

echo $contenu;
?>

Eléphant du PHP | 445 Messages

28 janv. 2008, 02:23

1. A quoi est affecté $etape ?
2. Que donnes un var_dump($_POST) en debut de code ?
3. $serveur_erreur est interpreté comme une variable et on pas comme du texte.
4. A quoi servent les . et les ' apres les OR DIE ?

Mammouth du PHP | 531 Messages

28 janv. 2008, 11:10

1. A quoi est affecté $etape ?
2. Que donnes un var_dump($_POST) en debut de code ?
3. $serveur_erreur est interpreté comme une variable et on pas comme du texte.
4. A quoi servent les . et les ' apres les OR DIE ?
1) Alors $etape c'est juste par rapport à ce qui doit s'afficher, regarde quand on entre dans le switch, par défaut c'est le formulaire qui s'affiche. Quand étape = 1 on traite les données du formulaire, et le code n'est pas complet ici mais on affichera un message et on continuera les étapes. Bref ça n'a rien à voir avec le problème, c'est juste pour m'éviter de faire 40 pages.

2) J'ai pas essayé var_dump mais j'ai fait des echo de ms variables avant fwrite, elles s'affichent bien et ne sont pas vides.

3) Exact... d'habitude j'utilise les apostrophes et la j'ai utilisé les guillemets donc je n'ai pas besoin d'échapper en fait ? Je crois que le problème est ici :lol:

4) '<p>'.$serveur_erreur.'</p>'.mysql_error()); -> C'est ce que je veut écrire dans le fichier
mysql_connect (' --> Dans le fichier on attaque avec des primes

En fait je cherche à écrire exactement ça dans le fichier :
<?php
mysql_connect ('monserveur', 'mon identifiant', 'mon pass') OR DIE ('<p>'..'</p>'.mysql_error());
mysql_select_db ('ma base') OR DIE ('<p>'..'</p>'.mysql_error());
?>
Ou mon serveur, mon identifiant etc... sont les valeurs des POST

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 janv. 2008, 11:59

Il ne te manquerait pas quelque chose à concatener entre les '<p>'..'</p>' ? Le résultat que tu souhaite ne serait pas plutôt :

Code : Tout sélectionner

<?php mysql_connect ('monserveur', 'mon identifiant', 'mon pass') OR DIE ('<p>'.$serveur_erreur.'</p>'.mysql_error()); mysql_select_db ('ma base') OR DIE ('<p>'.$serveur_erreur.'</p>'.mysql_error()); ?>
Première chose à faire, passer en chaine et extraire celles à remplacer par des variables
<?php
$str = "<?php
mysql_connect ('" . "monserveur" . "', '" . "monidentifiant" . "', '" . "monpass" . "') OR DIE ('<p>'.\$serveur_erreur.'</p>'.mysql_error()); 
mysql_select_db ('" . "ma base" . "') OR DIE ('<p>'.\$serveur_erreur.'</p>'.mysql_error());
?>";
?>
Il est peut être nécessaire d'échapper les "?" en "\?" je ne sais plus, il est indispensable d'échapper le $ de $serveur_erreur, par contre il n'y a pas de soucis avec les "<", ">"

Nota : comme pour une requête sql, faire les choses par étape et commencer par stocker le résultat dans une chaine permet de l'afficher et de voir si le résultat correspond à ce que l'on attend avant de le coller dans un fichier :)
<?php
$str = "<?php 
mysql_connect ('" . $_POST['serveur'] . "', '" . $_POST['identifiant'] . "', '" . $_POST['passe'] . "') OR DIE ('<p>'.\$serveur_erreur.'</p>'.mysql_error()); 
mysql_select_db ('" . $_POST['base'] . "') OR DIE ('<p>'.\$serveur_erreur.'</p>'.mysql_error()); 
?>";
echo '<pre>'.$str.'</pre>';
$fichier = fopen ('../config.php','w+'); 
fwrite ($fichier, $str); 
?>
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 445 Messages

28 janv. 2008, 12:19

Perso, j'utiliserais les simple quote afin d'eviter toute interpretation.

J'ai teste ceci et aucune erreur.
<?php

$crnl  = "\r\n" ;
$data  = '<?php'.$crnl ;
$data .= 'mysql_connect(\''.$_POST['serveur'].'\',\''.$_POST['identifiant'].'\',\''.$_POST['passe'].'\')';
$data .= ' or die(\'<p>\'.$serveur_erreur.\'</p>\'.mysql_error());'.$crnl ;
$data .= 'mysql_select_db(\''.$_POST['base'].'\')';
$data .= ' or die(\'<p>\'.$serveur_erreur.\'</p>\'.mysql_error());'.$crnl ;
$data .= '?>'.$crnl ;
	
$handle = fopen('../config.php','w+') or die('Erreur : Ouverture Fichier.');
fwrite($handle,$data) or die('Erreur : Ecriture Fichier');
fclose($handle);

?>