2 erreurs php que je ne solutionne pas dans mon espace membres

Eléphanteau du PHP | 36 Messages

13 juil. 2021, 17:36

Bonjour,

sur la page de départ de mon projet d'espace membres (platform-members.php), je tape mon ID et mon PW valides dans la table de la base de données et j'ai 2 erreurs

la 1ère erreur est:
Notice: session_start(): A session had already been started - ignoring in D:\wamp64\www\testphpmysql\security.php on line 14
à la ligne 14 j'ai effectivement le code:
session_start();
j'ai cherché sur internet et j'ai effectivement 2 autres types de cas avec session_start();

- dans les fichiers qui font partie de ce projet d'espace-membre à plusieurs endroits...
platform-members.php à la ligne 10
form_conditions.php à la ligne 21
compliance.php à la ligne 6
form_registration.php à la Ligne 3
reset_password.php à la ligne 6
faut-il les supprimer ou les remplacer mais par quoi?

- dans un autre fichier qui n'a rien à voir avec le projet mais fait le même office sans base de données et qui permet actuellement aux membres d'accéder sans base de données
dans ce cas j'ai supprimé temporairement ce fichier "pour voir", mais l'erreur subsiste


la 2ème erreur est:
Warning: Cannot modify header information - headers already sent by (output started at D:\wamp64\www\killidataphpmysql\security.php:14) in D:\wamp64\www\testphpmysql\security.php on line 41
et le code de la ligne 41 est:
header('Location: '.$page_no_login);
j'ai cherché sur Internet et la réponse serait qu'un caractère blanc en trop se trouverait dans les fichiers concernés comme " <?php" ou "?> ".
j'ai cherché ces occurrences avec notepad++ et il n'y en a aucune.
J'ai aussi essayé d'enlever le seul blanc dans le code ci-dessus:
header('Location:'.$page_no_login);
mais l'erreur demeure!

Merci de votre aide pratique (du b a ba svp)

seb

Mammouth du PHP | 1887 Messages

13 juil. 2021, 17:43

les deux messages sont liés.
quelque chose est renvoyé au navigateur avant le démarrage de le session. repartir d'un fichier vide permet de trouver ce qui pose problème.

Eléphanteau du PHP | 36 Messages

13 juil. 2021, 20:11

Merci Or1,

Je comprend, mais en pratique que faut-il faire pour régler le problème ?
Dois-je fournir du ou le code total de la page 'platform-members' ou de 'security' ou autre chose pour avancer ?
Je reste débutant, hélas, vis à vis de ce genre de messages d'erreurs (qui bloque tout).

A+

Seb

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8982 Messages

13 juil. 2021, 20:30

Le 1er message indique qu'une session a déjà été ouverte avant session_start(); dans security.php on line 14.
Donc vérifie dans tes include, car tu ne dois avoir qu'un seul session_start() pour l'ensemble de l'exécution de ton script (include/require compris donc)
Vérifie peut-être aussi dans un phpinfo() si tu n'as pas la variable session.auto_start à On (par défaut normalement c'est Off)
Sinon tu peux aussi éviter ce message en vérifiant si une session a déjà été ouverte :
if(!isset($_SESSION)) session_start();

Le 2ème s'affiche uniquement parce que tu as le 1er message d'erreur qui est envoyé au navigateur, dès que tu auras éliminé le 1er message, le 2ème va disparaitre ;-)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 36 Messages

14 juil. 2021, 19:09

Bonjour @rthur,

Merci de ces pistes. J'ai oublié de dire que tout mes messages précédents étaient basés sur des tests en localhost sur wampserver mais j'avais aussi téléchargé les fichiers chez l'hébergeur et c'était pareil.

Tu écris "Donc vérifie dans tes include, car tu ne dois avoir qu'un seul session_start() pour l'ensemble de l'exécution de ton script (include/require compris donc)" mais je ne comprend pas bien.
J'ai cherché l'occurrence session_start(); avec notepad++ et tous les fichiers qui l'avait je les ai cités dans le message précédent.
Aucun d'entre eux n'est dans un include ou un require. Peux tu être plus précis?

Pour la vérification que tu proposes "if(!isset($_SESSION)) session_start();", je crois que sauf erreur cela fait la m^me chose que :

Code : Tout sélectionner

if (session_status() == PHP_SESSION_NONE) { session_start(); }
Pour tous les fichiers qui contiennent session_start(); j'ai mis à la place le code ci-dessus mais cela ne change rien.
Si je me trompe sur ce code dis moi quel est le code complet de "if(!isset($_SESSION)) session_start();"

Enfin, effectivement j'ai un phpinfo.php sur le site en local et j'ai vérifié : session.auto_start est à off (aussi sur Internet)

Merci de ton aide!

Cdlt, Seb

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8982 Messages

15 juil. 2021, 15:08

Aucun d'entre eux n'est dans un include ou un require. Peux tu être plus précis?
Impossible d'être plus précis sans connaitre ton code.
Mais si PHP indique qu'une session a déjà été lancée, c'est que c'est forcément le cas, donc il faut que tu relises ton code, et fasses ton debugage pour chercher à partir de quel endroit tu as ce souci, et pas uniquement en utilisant la recherche.
Relis tout ton code, met en commentaire des pans entier de code pour trouver quand ça marche/quand ça ne marche pas, et isoler la partie problématique...
Si je me trompe sur ce code dis moi quel est le code complet de "if(!isset($_SESSION)) session_start();"
Ce code est complet
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 36 Messages

18 juil. 2021, 15:08

Bonjour @rthur,

Merci!

Par souci de bien faire j'ai testé le code "if(!isset($_SESSION)) session_start();" à la place de session_start();
mais c'est pareil
Pour bien comprendre tu veux dire désactiver/activer par blocs sur la seule page security.php ou bien sur toutes les pages du projet (une quinzaine, avec enregistrement par formulaire, log-in, avec chargement de la BDD mysql)?
Cela va me prendre du temps même s'il s'agit de la seule page security.php... dis-moi s'il te plait.

Par ailleurs peut-on envoyer un message privé sur ce forum (par ex. à toi)? Si oui, comment?

Merci

Cordialement, Seb

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8982 Messages

19 juil. 2021, 11:02

mais c'est pareil
C'est à dire ? Quel message d'erreur obtiens-tu exactement ?
Pour bien comprendre tu veux dire désactiver/activer par blocs sur la seule page security.php ou bien sur toutes les pages du projet (une quinzaine, avec enregistrement par formulaire, log-in, avec chargement de la BDD mysql)?
Sur l'exécution de ton script. Donc si ton script inclus plusieurs autres scripts, oui cela veut dire le faire aussi sur les scripts inclus.
Par ailleurs peut-on envoyer un message privé sur ce forum (par ex. à toi)? Si oui, comment?
Oui on peut en cliquant sur le nom des utilisateurs, mais on ne fait pas de support en privé.
Le principe d'un forum c'est que l'entraide se fait en public pour que d'autres qui auraient un problème similaire puisse aussi s'y référérer, et également pour que d'autres bénévoles puisse intervenir si je fais une erreur, si il y a une autre approche + efficace, ou si simplement je n'ai pas le temps de poursuivre.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 36 Messages

15 août 2021, 12:50

Bonjour @rthur (et aussi le forum),

Merci de la piste des include et il semble que j'avance (un peu), au bout d'un mois de tests.
Comme tu le suggérais, j'ai revu mon code.
Résumons: pour le login des membres dans mon code de platform-members, si le ID et PW sont bons, dans mon test avec texte seulement, le membre est envoyé vers une page php nommée page_authorized_visitor.php qui ne contient que le texte suivant:
Contents of the home page for authorized visitor
Et cela marche (seulement en apparence?)
Bon bien sûr ce que je veux c'est qu'après bons ID et PW le membre soit envoyé vers la page d'acceuil de l'espace membres (sous-dossier xxxxxx) c-a-d xxxxxx/afichier-destination.php et le code de afichier-destination.php...
(1) commence par un contrôle avec le code
<?php require ("../security.php"); ?>
(2) contient plein d'include dans le code qui ne sont pas liés à la procédure de login

donc après ce résumé, si dans mon code de platform-members après le code de rentrée ou de sortie...
if (isset($_SESSION['user']['user'])) {
j'ai
include('xxxxxx/afichier-destination.php');
//include('page_authorized_visitor.php');
j'obtiens le message d'erreur qu'une session a déjà été ouverte avant session_start(); dans security.php (comme déjà écrit)

et cela même si je remplace
session_start();
par
if (session_status() == PHP_SESSION_NONE) {
session_start();
}

ou par
if (session_status() == PHP_SESSION_NONE) {
session_start();
}

et au contraire pour (inversion)
//include('xxxxxx/afichier-destination.php');
include('page_authorized_visitor.php');
je n'obtiens plus de message d'erreur mais sur wampserver, j'ai le message:
Contents of the home page for authorized visitor

Bon si c'est un problème d'include/require dans mon fichier de destination, je suis bloqué et piégé car je ne peux changer ma page afichier-destination.php qui fonctionne bien aujourd'hui avec un autre système de login (avec un fichier txt, sans table de membres) et qui contient toutes les requêtes sur la base de données scientifique de l'espace membre.

Enfin avant dernier test, si je désactive dans platform-members.php le code
//require('headermysql.php');
sachant que headermysql.php n'est que du code html, sans include bien sûr
et que dans wampserver je clique sur platform-members.php alors je suis basculé vers la page de login-failed!

Enfin dernier test, si dans le code ci-après de platform-members.php j'ajoute:
$members_area = "xxxxxx/afichier-destination.php";
puis à la fin du code après // Authorized visitor, je met:
header("Location: $members_area");
et je désactive le code de include comme:
//include('xxxxxx/afichier-destination.php');
alors j'ai un message d'erreur surprenant:
http://testphpmysql/xxxxxx/page_unautho ... isitor.php
page non trouvée ou inexistante
car il cherche dans le dossier espace membres le fichier page_unauthorized_visitor.php, ne l'y trouve pas (normal, alors qu'il est dans le dossier racine)... c'est tellement surprenant (pour moi) que je mentionne ce test (et pas de nombreux autres concernant les includes que j'ai aussi tentés)

voici mes codes...
pour platform-members.php

Code : Tout sélectionner

<?php /******************Config***********************/ $v_editor_name = "1111111111"; $v_editor_email = "222222222"; $v_url = "3333333333"; $v_web_name = "4444444444"; $v_pages_dir = "pages"; /**********************************************/ session_start(); //if(!isset($_SESSION)) session_start(); /*if (session_status() == PHP_SESSION_NONE) { session_start(); }*/ error_reporting(E_ALL); require("connexionBDD.php"); try { $pdo = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); } catch (Exception $e) { echo 'Erreur : ' . $e->getMessage() . '<br />'; echo 'N° : ' . $e->getCode(); } require('headermysql.php'); /************************************************************************/ if (isset($_SESSION['action'])) { $_POST['action'] = $_SESSION['action']; unset($_SESSION['action']); } /************************************************************************/ if (isset($_POST['action'])) { switch ($_POST['action']) { case "Login": require('check_user.php'); break; case "Registration": require('form_registration.php'); break; case "Validation": require('validation_inscription.php'); if (isset($_SESSION['message'])) { // Redirect $_SESSION['action'] = "Registration"; header("Location: ".$_SERVER['PHP_SELF']); exit; } else { // Success } break; case "Password_forgotten": echo "<form method='post'>"; echo "Email: <input type='text' name='email' /><br />"; echo "<input type='submit' name='action' value='Renew_password' /><br />"; echo "</form>"; break; case "Renew_password": require('renew_password.php'); break; default: // Print & delete messages if (isset($_SESSION['message'])) { echo $_SESSION['message']."<br />"; unset($_SESSION['message']); } break; } } /********************************************************************************************************/ if (isset($_SESSION['user']['user'])) { // Authorized visitor include('xxxxxx/afichier-destination.php'); //include('page_authorized_visitor.php'); } else { // Unauthorized visitor if($_POST['action'] <> "Registration" && $_POST['action'] <> "Password_forgotten"){ require('login.php'); } include('page_unauthorized_visitor.php'); } require('footermysql.php');
et pour security.php

Code : Tout sélectionner

<?php /*if (session_status() == PHP_SESSION_NONE) { session_start(); }*/ //if(!isset($_SESSION)) session_start(); error_reporting(E_ALL); //***********Configuration*****************/ // Login navigation for authorized_visitor $file_log_navigation = "zzzzzzzz/log_access_authorized_visitor.txt"; // Page for unauthorized_visitor //$page_no_login = "page_unauthorized_visitor.php"; $page_no_login = "login_failed.php"; /* On all pages only for authorized_visitor: <?php require('../security.php'); ?> */ //*****************************************/ session_start(); /*if(!isset($_SESSION)) { session_start(); }*/ /*if (session_status() == PHP_SESSION_NONE) { session_start(); }*/ if (isset($_SESSION['member'])) { // Navigation log $register = $date('Y-m-d H:m:s')."\t"; $register .= $_SERVER['REMOTE_ADDR']."\t"; $register .= $_SERVER['HTTP_USER_AGENT']."\t"; $register .= $_SESSION['user']['Rk_members']."\t"; $register .= $_SESSION['user']['first_name']." "; $register .= $_SESSION['user']['last_name']." ("; $register .= $_SESSION['user']['country'].")\t"; $register .= __FILE__; file_put_contents($file_log_navigation, $register, FILE_APPEND); } else { // No login header('Location: '.$page_no_login); exit; } session_destroy(); ?>
Merci de ton (votre) aide! (j'ai bien relu mon message pour être bien clair)

PS: j'ai aussi une question générale de béotien (sans rapport avec ce qui précède):
la 1ère fois que je teste sur wampserver et sur le web la page de login s'affiche et je peux taper mon ID et PW,
mais pour les essais suivants, la page de login ne s'affiche même pas et sans ID et PW j'ai directement Contents of the home page for authorized visitor ou Contents of the home page for unauthorized visitor, selon les tests ci-dessus
J'ai essayé d'effacer la mémoire avec ccleaner, d'arrêter wamp et de le redémarrer, d'éteindre mon ordi et de l'allumer mais cela ne marche pas.
Ce n'est que quand j'attend plus longtemps (>24 heures???) que je retrouve ma page avec login, mais une seule fois.

A+, Seb