8791 sujets

Développement web côté serveur, CMS

Pages :
bonjour
j'ai un problème, une fois le fichier créé j'obtient:


bonjour.1f71e0f4ac9b47cd93bf269e4017abaab9d3bd63


dedant il y a d'écrit:



1f71e0f4ac9b47cd93bf269e4017abaab9d3bd63:1f71e0f4ac9b47cd93bf269e4017abaab9d3bd63




et j'ai fais le code suivant:

<?php
$pseudoo = htmlspecialchars($_POST['pseudoo']);
$passwordd = sha1($_POST['passwordd']);

if(!empty($pseudoo))
{
$filename = $pseudoo.'.'.$passwordd;

$handle = fopen($filename, 'w');

$lireeee = fgets($handle, 4096);
echo $lireeee;
exit;
}
?>

<form method="post" >
<input name="pseudoo" type="text" /><br>
<input name="passwordd" type="text" /><br>
<input value="test" type="submit" /><br>
</form>


Le problème c'est que je n'est aucune erreur qui s'affiche et pas le text que contient le fichier.. comment faire??


Problème n°2

Je veux écrire dans un .htpasswd, ok tout s'écrit, mais soit cela efface tout ce qu'il y a déjà dans le fichier ou soit cela l'écrit à la suite sur une seul et meme ligne!! :colere2: donc comment faire pour que cela écrire l'un en dessous de lautre?? voici le code ( j'ai essayer plusieur lettre pour fopen() )

<?php
$pseudo = htmlspecialchars($_POST['pseudo']);
$password = htmlspecialchars($_POST['password']);


if (!empty($pseudo))
{
$filename = 'dossier2/dossier3/.htpasswd';
$cbd10 = $pseudo.':'.$password.'
'; // ici un retour a la ligne car l  \n et <br> ne son compris dans un fichier text
$handle = fopen($filename, 'a+');


   if (fputs($handle, $cbd10) == FALSE) {
       echo "Impossible d'écrire dans le fichier ($filename)";
       exit;
   }
   
   echo "L'écriture de ($cbd10) dans le fichier ($filename) a réussi";
   
   fclose($handle);
                   
} else {
   echo "Le fichier $filename n'est pas accessible en écriture.";
}


?>  


<form method="post">
<b>Pseudo : </b>
<input type="text" name="pseudo" /><br>
<b>Password : </b>
<input type="text" name="password" /><br>
<input type="submit" value="envoyer" /><br>
</form>


Dans les ficchier text ce code fonctionne parfaitement bien c'est pourquoi je ne comprend vraiment pas ce problème... Smiley decu
Modifié par moii (15 Nov 2006 - 19:02)
Bonsoir.

Problème n°1:
Cette ligne :
$handle = fopen($filename, 'w');

... a pour effet de créer un fichier en écrasant le fichier existant. (parametre 'w').

Pour récupérer le contenu du fichier, sans l'écraser, le plus simple est la fonction file_get_contents:

$lireeee = file_get_contents($filename);
echo $lireeee;
... Problème n° 2
Les fichiers sont ouvrable de plusieurs manières, a+ est OK pour ajouter des données à la fin. Donc pas de problèmes. Si le fichier n'existe pas, en revanche, ouverture en mode 'w'.

Les lignes sans retour chariot, sont peut être dues à votre systeme d'exploitation (windows ? Smiley confused ) Dans ce cas, le retour chariot, c'est \r\n
J'ai quand même rédigé en mode normal, c'est à dire Linux, avec un seul caractère (\n).


<?php
$pseudo = (isset($_POST['pseudo'])) ? $_POST['pseudo'] :"";
$password = (isset($_POST['password'])) ? $_POST['password'] :"";

if (!empty($pseudo))
{
	$filename = 'test.txt';
	$cbd10 = "$pseudo:$password\n"; // (mode unix. \r\n pour windown -corrigé [smile] )

	if (!file_exists($filename))
		$handle = fopen($filename, 'w');   // création
	    else
		     $handle = fopen($filename, 'a+');   // mode append

	if (!fputs($handle, $cbd10))   // si ça ne marche pas...
	{
	   echo "Impossible d'écrire dans le fichier ($filename)";
	   exit;
	}
	else
		{
			echo "L'écriture de ($cbd10) dans le fichier ($filename) a réussi";[winner] 
			fclose($handle);
		}
}

?>


Si celà peut vous aider à avancer... Smiley cligne
Modifié par GeorgesM (16 Nov 2006 - 07:28)
Bonsoir,
GeorgesM a écrit :
Les lignes sans retour chariot, sont peut être dues à votre systeme d'exploitation (windows ? Smiley confused ) Dans ce cas, le retour chariot, c'est /n/r
Je crois que c'est plutôt \r\n. Smiley smile
Certainement, mais sans être un spécialiste, la position de ces caractères est interchangeable. \n c'est "line feed" et \r, "carriage return". L'ordonnancement de succession de ces deux commande n'influence pas son effet.
Néanmoins, vous avez raison, et plutôt que de rajouter des problèmes à windows, qui n'en manque pas, je vais rétablir la bonne succession.
Modifié par GeorgesM (16 Nov 2006 - 09:32)
En théorie, je ne sais pas, mais en pratique, amusez-vous à exécuter le script PHP suivant :
<?= "a\n\rb" ?>
et à ouvrir le résultat dans un éditeur de texte, et vous verrez au mieux deux sauts de ligne, au pire deux caractères ésotériques si votre éditeur est un peu rigide...

Je ne m'avance pas parce que je n'en suis pas sûr mais je crois qu'il est bien spécifié que ces deux caractères doivent figurer dans cet ordre.
... donc, petite recherche ...
a écrit :

During the early ARPAnet research days (~1970-1972), this end-of-line
diversity among operating systems made network communication among
diverse host systems difficult. After some discussion (recorded in
early RFCs), the researchers adopted a single convention:

ASCII text transmitted across the network *must* use the
two-character sequence: CR LF.


... traduit approximativement par :

Pendant les premiers temps de recherches d'ARPANet (~1970-1972), cette diversité de retour chariot parmi les logiciels d'exploitation a rendu la communication de réseau entre les divers systèmes hôtes difficile.
Après débats (..), les chercheurs ont adopté une convention simple :
le texte ASCII transmis à travers le réseau *doit* respecter l'ordre des caractères : CR LF.

Oui effectivement, c'est sans autre solution que CR LF. Ce que je disais dans mon message précédent ne serait valable que pour un media genre teletype.
De même, les anciennes imprimantes avaient des dip switch pour contrôler le comportement vis à vis de ces deux commandes ascii.
Je suis chez free est je veux écrire des passe dans un .htpasswd par le biais du script pour inscrire quelque chose dans un fichier.
Mais comme vous devez le savoir le truck c'est que si il n'y a pas de retour a la ligne alors... c'est la cata!!

donc voila le code qui marche sur un fichier texte et null part allieur:

<?php
$pseudo = htmlspecialchars($_POST['pseudo']);
$password = htmlspecialchars($_POST['password']);

if (!empty($pseudo))
{
$filename = '.htpasswd';
$cbd10 = $pseudo.':'.$password.'
';//pour retour a la ligne..
$handle = fopen($filename, 'a+');


   if (fputs($handle, $cbd10) == FALSE) {
       echo "Impossible d'écrire dans le fichier ($filename)";
       exit;
   }
   echo "<br>L'écriture de (".$cbd10.") dans le fichier (".$filename.") a réussi<br></b><br>";
   fclose($handle);
   
$handle2 = fopen($filename, 'r');
   while (!feof($handle2)) {
     $buffer = fgets($handle2,999);
     echo $buffer .'<br>';
   }
   fclose($handle2); exit;
} 
?>  


<form method="post">
<b>Pseudo : </b>
<input type="text" name="pseudo" /><br>
<b>Password : </b>
<input type="text" name="password" /><br>
<input type="submit" value="envoyer" /><br>
</form>

Modifié par moii (16 Nov 2006 - 20:41)
Remplacez-donc :

$cbd10 = $pseudo.':'.$password.'

';//pour retour a la ligne..


par :
$cbd10 = "$pseudo:$password\n";


et si vous ne l'avez pas fait, télechargez un éditeur de texte comme notepad++
... parce que votre impression de problème ne vient pas du fichier stocké chez free, mais bien de votre éditeur de texte windows qui ne lit pas correctement les fichiers textes linux... (traduire : les fichiers textes normaux).
<?php
$pseudo = (isset($_POST['pseudo'])) ? $_POST['pseudo'] :"";
$password = (isset($_POST['password'])) ? $_POST['password'] :"";

if (!empty($pseudo))
{
Questions :
- dans ces 3 lignes de code, à quoi sert la première ?
- A quoi ça sert d'ouvrir un fichier en écriture pour y balancer des infos "vides" ?

Version proposée :
if (!empty($_POST['pseudo']) && trim($_POST['pseudo'])!='' && !empty($_POST['password']) && trim($_POST['password'])!='')
{


La syntaxe suivante :
$cbd10 = "$pseudo:$password\n";

Cette forme n'est pas terrible car elle oblige php à parser la chaine, pour vérifier qu'elle contient des variables, les mettre en mémoire, les concaténer et reconstruire la chaine de manière correcte.

$cbd10 = $pseudo.':'.$password."\n";

Le caractère de retour à la ligne dans un txt est le "\n"
Le bête bloc note de windaube le lit parfaitement.
Bison a écrit :
La syntaxe suivante :
$cbd10 = "$pseudo:$password\n";

Cette forme n'est pas terrible car elle oblige php à parser la chaine, pour vérifier qu'elle contient des variables, les mettre en mémoire, les concaténer et reconstruire la chaine de manière correcte.

$cbd10 = $pseudo.':'.$password."\n";
Pour ma part, je vote pour la première solution, qui est nettement plus lisible.

Pourquoi vouloir à tout prix optimiser un code qui sera exécuté de façon exceptionnelle ?
Modifié par Eldebaran (17 Nov 2006 - 11:16)
Version proposée :
if (!empty($_POST['pseudo']) && trim($_POST['pseudo'])!='' && !empty($_POST['password']) && trim($_POST['password'])!='')
{


Ce code exemple n'est pas un code "production". Cette optimisation part du principe qu'on ne désire pas connaître $pseudo et $password.
Si dans la suite du script il fallait envoyer un message à l'internaute lui indiquant quoi que ce soit, il y a fort à parier qu'il sera nécessaire de relire les varables, annulant du coup l'optimisation.

Enfin, l'inclusion de variable dans un chaîne est une fonctionnalité propre à php et perl. Le temps d'exécution est entre 40% et 70% supérieur à la version concaténée. Par contre le gain en expressivité se retrouve au moment du débogage et amortit très largement le temps machine additionnel.

Si vous faites l'impasse sur cette fonctionnalité, il y a fort à parier que vous faites aussi l'impasse sur la syntaxe heredoc :



$s = <<<EOD
<html>
<head><title>$titre</title>
<body>
     Bonjour $pseudo
</body>
</html>

EOD;
echo $s;


Non ?
GeorgesM a écrit :
Ce code exemple n'est pas un code "production". Cette optimisation part du principe qu'on ne désire pas connaître $pseudo et $password.
Si dans la suite du script il fallait envoyer un message à l'internaute lui indiquant quoi que ce soit, il y a fort à parier qu'il sera nécessaire de relire les varables, annulant du coup l'optimisation.

Si tu trouve qu'envoyer du "vide" ou du "contenu non exploitable" est mieux, fais-le.
!empty() en plus de ses spécificités propres offre la même fonctionnalité que isset() pourquoi donc faire deux fois le même travail ?
Puis, dire quoi à l'internaute ????
Qu'il n'a pas encore envoyé son formulaire ???
Je suppose qu'il le sait...

Syntaxe Heredoc === Chaine dynamique, je ne l'utilise JAMAIS.

Eldebaran a écrit :
Pour ma part, je vote pour la première solution, qui est nettement plus lisible.

C'est pas terrible comme argument... pour un chinois, le chinois est lisible.
C'est comme de dire le PERL est moins lisible que le PHP
Pour un néofite, une regex est totalement illisible... quand on sait la lire, ça n'enlève rien à son efficacité ni sa rapidité lorsqu'elle est optimisée.
Donc en gros, il suffit d'apprendre. Smiley cligne

Puis l'argument
a écrit :
Pourquoi vouloir à tout pris optimiser un code qui sera exécuté de façon exceptionnelle ?

Quand on le fait pas pour quelquechose d'exceptionnel, ça veut dire qu'on ne le fait pas du tout en autre temps.
C'est comme si tu disais :
"Comme je ne sors ma voiture de mon garage qu'à Noël pour aller faire mes courses j'en conclus que le port de ma ceinture de sécurité n'est pas optimisé." Smiley langue
a écrit :
Syntaxe Heredoc === Chaine dynamique, je ne l'utilise JAMAIS.

Pourquoi ?

a écrit :

Puis, dire quoi à l'internaute ????
Qu'il n'a pas encore envoyé son formulaire ???
Je suppose qu'il le sait...


... et pourquoi pas de lui proposer de lui renvoyer son mot de passe s'il l'a oublié. Pourquoi décider arbitrairement qu'un fonctionnalité est inutile? Ce n'est pas très convivial..
Modifié par GeorgesM (17 Nov 2006 - 12:39)
Bison a écrit :
!empty() en plus de ses spécificités propres offre la même fonctionnalité que isset() pourquoi donc faire deux fois le même travail ?

Et en plus empty peut être vachement dangereux. Imaginons qu'on a un input demandant un nombre de 0 à 10. Si l'utilisateur tape 0, empty va renvoyer true... Du coup impossible de mettre 0 dans le champs Smiley decu
Oui.
D'une façon, plus "bourin", j'utilise plutot strlen($s)==0
Mais je suis traumatisé par mes débuts en informatique..
GeorgesM a écrit :
Syntaxe Heredoc === Chaine dynamique, je ne l'utilise JAMAIS.

Pourquoi ?
PHP parse le contenu de la chaîne à la recherche de variable. Un peu comme les double-quotes, sauf qu'avec HEREDOC on a tendance à mettre des textes monstres. Si tu utilises du heredoc, vaut mieux essayer de profiler l'application et voir si ça ralentit pas trop les choses... Je te conseille de lire un post de Sara Golemon, How long is a piece of string? (en) Smiley smile
Modifié par FlorentG (17 Nov 2006 - 12:42)
FlorentG a écrit :
Et en plus empty peut être vachement dangereux.

C'est la première fois que j'entend dire que !empty est vachement dangereux.
Aurais-tu l'amabilité de me diriger vers le lien contenant ces sources d'informations. Smiley smile

Pour ce qui est du script du posteur, c'est le cas typique de celui qui attend un 0 dans le pseudo et dans le passe, c'est clair ! Smiley fache

EDIT : sans oublier les espaces... Smiley langue
Modifié par Bison (17 Nov 2006 - 12:50)
Haha Smiley lol Enfin dangereux dans le sens où certaines variables "non-empty" peuvent être tout à coup "empty" (le coup du zéro) Smiley smile Donc à utiliser en faisant attention à ce qu'on test

Notons que 0 est empty, mais pas 0.0 Smiley eek
FlorentG a écrit :

PHP parse le contenu de la chaîne à la recherche de variable. Un peu comme les double-quotes, sauf qu'avec HEREDOC on a tendance à mettre des textes monstres. Si tu utilises du heredoc, vaut mieux essayer de profiler l'application et voir si ça ralentit pas trop les choses... Je te conseille de lire un post de Sara Golemon, How long is a piece of string? (en) Smiley smile


Et bien non, ça n'impacte pas de façon sensible. Ce n'est pas du tout significatif, même avec un heredoc épais (plusieurs milliers de lignes).
Modifié par GeorgesM (17 Nov 2006 - 13:31)
Pages :