[RESOLU] Pas d'image captcha et à quoi sert session_start

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 mars 2023, 09:35

Bonjour à tous,

Dans un formulaire de contact avec captcha, lors du lancement de la page initiale, lorsque je clique contact, en local, la captcha n'affichait rien, ni en local et ni en ligne !
J'ai modifié le chemin d'accès qui est maintenant absolue, mais le problème reste le même .
<h3>Code anti-spams</h3>
						<img src="http://qi98.free.fr//pages/contact/captcha.php"><br>
						<input type="text" name="captcha" style=""><br>
						<p>Tous les champs avec une <strong>*</strong> sont obligatoires</p>

Mais il y a d'important aussi,, c'est qu'aucune vérification des champ n'est faite, et je ne sais pas comment faire ! :oops:

Pour ce formulaire, il est conseillé de mettre dans "entete_inc.php" (header)
<?php
session_start();
?>
J'ai lu sur https://www.php.net/manual/fr/function. ... -start.php à quoi servait différentes session, heu ! :( pour tout vous avouer, j'ai pas trop compris son utilisation !

C'est nouveau pour moi comme code, et je me demande si c'est vraiment nécessaire , :?
<?php /* contact.php */ ?>
(...)
				<form method="POST" action="?page=verification">

					<div align="left">Votre nom : *</div>
						<input type="text" name="nom" id="nom" placeholder="Votre Nom">
					<br><br>

					<div align="left">Votre mail : *</div>
						<input type="email" name="email" id="email" placeholder="Votre Email">
					<br><br>

					<div align="left">Sujet : *</div>
						<input type="text" name="sujet" id="sujet" placeholder="Quel est votre sujet ?">
					<br><br>

					<div align="left">Message : *</div>
						<textarea id="message" name="message" rows="5" cols="33" placeholder="Votre Message"></textarea>
					<br><br>

						<h3>Code anti-spams</h3>
						<img src="http://qi98.free.fr//pages/contact/captcha.php"><br>
						<input type="text" name="captcha" style=""><br>
						<p>Tous les champs avec une <strong>*</strong> sont obligatoires</p>

					<p><input type="submit" value="Envoyez"></p>

				</form>
(...)
Et voici le code de vérification.:
<?php 
	session_start();
	$nom = utf8_decode($_POST['nom']);
	$mail = ($_POST['email']);
	$subject = utf8_decode($_POST['sujet']);
	$message = utf8_decode($_POST['message']);
	$headers = 'From: '.$nom.'<'.$mail.'>'."\r\n";
	$headers .= 'Reply-to: <'.$mail.'>'."\r\n";
	$to = 'mon_ [email protected]';
?>

(...)
				<?php
					if($_POST['captcha']==$_SESSION['captcha']){
						mail($to, $subject, $message, $headers);
						echo 'Votre message a bien été envoyé';}
					else{
						echo 'Tous les champs ne sont pas justes. <a href="?page=contact.php">Recommencez</a>';	
					}
				?>
(...)

Aidez-moi SVP !
Merci d'avance.
Modifié en dernier par diomos le 17 mars 2023, 12:00, modifié 1 fois.

ynx
Mammouth du PHP | 586 Messages

17 mars 2023, 10:20

Bonjour,

Test ton lien http://qi98.free.fr//pages/contact/captcha.php directement dans la barre d'adresse de ton navigateur, tu devrais voir un message d'erreur indiquant que les sessions ne fonctionnent pas.
Chez Free, il faut à priori créer un répertoire sessions à la racine de ton FTP pour utiliser les sessions PHP.

Si le chemin vers le fichier verification.php n'est pas correct, tu peux corriger le chemin dans l'attribut action de la balise form (<form method="POST" action="http://qi98.free.fr/pages/contact/verification.php"> par exemple).

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 mars 2023, 12:50

Si j'ai mis le chemin absolu, c'est parce qu'il est référencé dans contact.php
h3>Code anti-spams</h3>
						<img src="http://qi98.free.fr/pages/contact/captcha.php"><br> 
						<!--<img src="captcha.php"><br>-->
						<input type="text" name="captcha" style=""><br>
De toute manière, je suis complètement largué parce que c'est une "<img src...> et dedans c'est une extension .PHP, complexe pour moi ! :cry:

Captcha.php est :
<?php
 session_start();

$_SESSION['captcha'] = rand(1000,9999);
/* défini la largeur et la hauteur des chiffres */
$img = imagecreatetruecolor(80,40);
$fill_color = imagecolorallocate($img,230,230,230);
imagefilledrectangle($img,0,0,80,40,$fill_color);

$text_color = imagecolorallocate($img, 10,10,10);
$font = './acidic.ttf';
/* défini la position du texte */
imagettftext($img,23,0,5,30,$text_color,$font,$_SESSION['captcha']);

header("Content-type:image/jpeg");
imagejpeg($img);
imagedestroy($img);

?>
Bon, je vois qu'il y a de nombreux "session_start", mais pourquoi en mettre dans 2 fichiers (entete_inc.php et verification.php), et d'ailleurs, je ne comprends pas du tout son utilité !

Avatar du membre
Mammouth du PHP | 1564 Messages

17 mars 2023, 12:59

Chez Free, il faut à priori créer un répertoire sessions à la racine de ton FTP pour utiliser les sessions PHP.
Crée un dossier sessions, et reviens sur le problème de session_start() si il est encore là.

session_start() sert à sauvegarder en mémoire les $_SESSION

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 mars 2023, 13:11

J'ai créé le répertoire vide "session" chez Free, mais j'ai toujours le même problème :

Code : Tout sélectionner

Warning: session_start() [function.session-start]: open(/mnt/154/sdb/9/3/qi98/sessions/sess_ae649d87fb9ba53ce154b5b297834a96, O_RDWR) failed: No such file or directory (2) in /mnt/154/sdb/9/3/qi98/entete_inc.php on line 3 Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /mnt/154/sdb/9/3/qi98/entete_inc.php:3) in /mnt/154/sdb/9/3/qi98/entete_inc.php on line 3 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /mnt/154/sdb/9/3/qi98/entete_inc.php:3) in /mnt/154/sdb/9/3/qi98/entete_inc.php on line 3

Et la ligne incriminée :
<?php /* entete_inc.php */ ?>
<?php
session_start();
?>
<!DOCTYPE html>
<html lang="fr">
    <head>
(...)
Peut-être qu'il faille attendre un peu !

Mais au fait, dans le répertoire "session", il faut mettre quelque chose ?

Avatar du membre
Mammouth du PHP | 1609 Messages

17 mars 2023, 13:14

seSSionS avec 2 S au milieu et un S à la fin. Il vaut mieux bien sur respecter la casse : sessions.
Rien à mettre dedans c'est php qui va enregistrer les données de $_SESSION dans des fichiers par visiteur (de la forme sess_{session_id} comme on peut le voir dans le message d'erreur qi98/sessions/sess_ae649d87fb9ba53ce154b5b297834a96).
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 mars 2023, 13:19

Merci Saian, ça va nettement mieux.
two3d avait pourtant bien orthographié, mais j'ai mal lu, faute d'inattention, "mea culpa" !

Merci à tous pour votre aide.

Bonne journée.

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 mars 2023, 13:30

Là, il y a un autre problème.

Je teste en local et tout va bien, mais en ligne, bien que tous les champs soient complétés, il y a toujours le message d'erreur disant de "recommencer" !
Pourtant, c'est exactement les mêmes fichiers en local et chez Free !

Dois-je attendre un peu ?

Avatar du membre
Mammouth du PHP | 1609 Messages

17 mars 2023, 13:43

Soit le captcha ne correspond pas, soit la session ne fonctionne pas mais les messages d'erreurs sont masqués. As-tu vérifié la présence du dossier sessions sur le serveur de prod ? si oui, vérifie les droits sur le répertoire.

PS : je pensais aussi tu peux avoir un problème avec la session si les scripts ne sont pas sur le même serveur.
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 mars 2023, 16:07

Le captcha fonction bien, puisque qu'en local, il n'y a aucun problème, je pencherais plutôt pour l'histoire de sessions comme tu le note !
Le répertoire "sessions" est bien sur le serveur.
http://qi98.free.fr/temp/droit-acces.jpg
J'ai pas pensé aux droits du répertoire, je vais voir ça !
Pour infos, je ne peux pas modifier "Permissions de groupe" et "permissions publiques", et oui, c'est Free !

C'est toujours pareil. Pourtant, tout est correct.
http://qi98.free.fr/temp/essai-contact.jpg
J'ai du mal à comprendre pourquoi ça va en local et pas en ligne.
http://qi98.free.fr/temp/essai-contact2.jpg

Et non, il n'y a qu'un seul serveur "Free", et tous les scripts y sont !

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 mars 2023, 17:13

J'ai fait des essais en ligne, et me suis aperçu que quand le captcha n'est pas rempli, le contact est expédié, mais dans le cas ou je complète le captcha, l'envoi ne se fait pas.
<?php
 /*session_start(); */

$_SESSION['captcha'] = rand(1000,9999);
/* défini la largeur et la hauteur des chiffres */
$img = imagecreatetruecolor(80,40);
$fill_color = imagecolorallocate($img,230,230,230);
imagefilledrectangle($img,0,0,80,40,$fill_color);

$text_color = imagecolorallocate($img, 10,10,10);
$font = './acidic.ttf';
/* défini la position du texte */
imagettftext($img,23,0,5,30,$text_color,$font,$_SESSION['captcha']);

header("Content-type:image/jpeg");
imagejpeg($img);
imagedestroy($img);

?>
Est-ce que vous voyez ce qui ne va pas parce que moi, je ne vois rien ?

PS : Avec ou sans session_start, c'est toujours pareil.

Avatar du membre
Mammouth du PHP | 1609 Messages

17 mars 2023, 18:05

Le session_start est indispensable. Je penche pour un problème avec la session. C'est dans le script de vérification qu'il faudrait vérifier $_SESSION avant le if($_POST['captcha']==$_SESSION['captcha']){ avec par exemple un var_dump($_SESSION);
Je parie que la session est vide. Si c'est le cas, il y a bien un problème de session.

PS : éventuellement pour vérifier le fichier de session, après le session_start(); tu peux faire un echo session_id(); pour récupérer l'id de session et vérifier que le fichier de session est bien présent dans le répertoire sessions (fichier sess_{session_id}).

Tu peux également contrôler le contenu du fichier qui est en fait un serialize de $_SESSION. Tu peux déserialiser son contenu pour qu'il soit plus lisible avec par exemple le formulaire à cette adresse : https://www.unserialize.com/
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 36 Messages

17 mars 2023, 19:17

Merci de ces infos Saian, mais pour "unserialize", c'est pas gagné parce que c'est nouveau pour moi et je n'ai jamais confronté à ça.

Pour le captcha, je suis paumé avec "session_start" !
En fait, je ne sais pas vraiment où mettre ça !

C'est un bon conseil de faire un "echo session_id();".
J'ai mis ça dans verification.php, mais quand je veux envoyer un message, j'ai l'erreur
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /mnt/154/sdb/9/3/qi98/entete_inc.php:15) in /mnt/154/sdb/9/3/qi98/pages/contact/verification.php on line 4

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /mnt/154/sdb/9/3/qi98/entete_inc.php:15) in /mnt/154/sdb/9/3/qi98/pages/contact/verification.php on line 4
1db7ed6e9ab870b3fb58b27ea781f572
C'est pour ça que je te disais que c'est ardu pour moi, je ne sais pas où mettre session_start.

Avatar du membre
Mammouth du PHP | 1609 Messages

18 mars 2023, 15:57

Comme précisé dans la doc : Pour utiliser des sessions basées sur les cookies, session_start() doit être appelée avant d'afficher quoi que ce soit dans le navigateur.

Hors le message d'erreur indique que la sortie (output) a commencé à la ligne de 15 de entete_inc.php (avant le session_start()).
Développeur web depuis + de 20 ans