Un problème possible dans une requête MySql Pdo

Fermé
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024 - 11 janv. 2021 à 12:34
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024 - 28 janv. 2021 à 12:58
bonjour,

c'est mon 1er message et je suis encore peu avancé en Mysql mais j'ai déjà installé une BDD et j'ai fait des requêtes sur la base qui marchent.

là je suis en train de mettre en place un projet de section membres à partir d'exemples sur Internet (le fichier de départ est une plateforme qui sert à se loguer, à devenir membres via un formulaire et à changer de PW si oublié, la BDD à une table de membres) et je rencontre une difficulté.

le fichier de départ (fichier-de-depart.php) commence par le code suivant (connexionBDD.php contient les infos de connexion):
<?php
/******************Config***********************/
$v_editor_name = "aaaaa";
$v_editor_email = "bbbbbb";
$url = "cccccc";
$v_web_name = "dddd";
/**********************************************/
session_start();
error_reporting(E_ALL);
require ("connexionBDD.php");
try {
  $connexion = 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();
}



le fichier de destination (fichier-de-destination.php) commence par le code:
<?php require ("../securite.php");?>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">


Lorsque dans localhost je clique sur le fichier de départ (fichier-de-depart.php), j'ai tout de suite les erreurs suivantes :

( ! ) Warning: require(../securite.php): failed to open stream: No such file or directory in D:\fichier-de-depart.php on line 1
Call Stack
# Time Memory Function Location
1 0.0004 407680 {main}( ) ...\fichier-de-depart.php:0
2 0.0335 465224 include( 'D:\fichier-de-depart.php' ) ...\fichier-de-depart.php:81

( ! ) Fatal error: require(): Failed opening required '../security.php' (include_path='.;C:\php\pear') in D:\membres\fichier-de-destination.php on line 1
Call Stack
# Time Memory Function Location
1 0.0004 407680 {main}( ) ...\fichier-de-depart.php:0
2 0.0335 465224 include( 'D:\membres\fichier-de-destination.php' ) ...\fichier-de-depart.php:81

Je ne comprend pas car j'ai bien un fichier securite.php dans le même dossier que le fichier de départ!
Il contient le code total suivant:
<?php

$file_log_navigation = "secret/log_navigation_authorized_visitor.txt";

$page_no_login = "login_failed.php";

//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();
?>


Pouvez-vous m'éclairer?

N.B. j'ai bien dans les 2 cas du code pour mettre en évidence les erreurs:
catch (Exception $e) {
echo 'Erreur : ' . $e->getMessage() . '<br />';
echo 'N° : ' . $e->getCode();
Je ne suis plus sûr que le signalement du code se fasse comme indiqué par <code php>, j'ai cherché sur CCM via le moteur de recherche mais je n'ai pas trouvé la bonne réponse!


Merci d'avance

Cordialement,
JH


Configuration: Windows / Firefox 84.0

31 réponses

jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
11 janv. 2021 à 14:07
Bonjour,

dans le même dossier ... donc .. pas de ../ mais simple ./

Ou mieux...
<?php 
require_once ( __DIR__  . "/securite.php");
?>

0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
11 janv. 2021 à 14:08
Au passage, active la gestion des erreurs PDO et place CHAQUE REQUETE dans un bloc TRY/CATCH
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
11 janv. 2021 à 15:42
Merci Jordane,

Mais euh, le fichier-de-destination.php est dans le sous dossier 'membres' donc c'est normal de faire <?php require ("../securite.php");?> pour aller chercher securite.php qui est dans le dossier racine comme le fichier-de-depart.php, non?

JH
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié le 11 janv. 2021 à 16:18
Bon...
On va reprendre dans l'ordre ...

Déjà .. pourquoi, alors que tu as un fichier nommé connexionBdd ... tu require ce fichier ET tu fais la connexion à la bdd ???
<?php
/******************Config***********************/
$v_editor_name = "aaaaa";
$v_editor_email = "bbbbbb";
$url = "cccccc";
$v_web_name = "dddd";
/**********************************************/
session_start();
error_reporting(E_ALL);
require ("connexionBDD.php"); // .. ce fichier ne contient pas la connexion à la bdd tel que son nom pourrait le laisser penser ?????
try {
  $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
 // Tu n'as pas activé la gestion des erreurs PDO ...
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}


Normalement, tu devrais avoir :
<?php 
// ceci est le  Fichier connexionBDD.php

/******************Config***********************/
$v_editor_name = "aaaaa";
$v_editor_email = "bbbbbb";
$url = "cccccc";
$v_web_name = "dddd";
/**********************************************/
try {
   $connexion =new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd .';charset=utf8',$PARAM_utilisateur, $PARAM_mot_passe);
  // Activation des erreurs PDO
  $connexion ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
 $connexion ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}
?>    

Ensuite...
Le message d'erreur indique

( ! ) Warning: require(../securite.php): failed to open stream: No such file or directory in D:\fichier-de-depart.php on line 1

Il s'agit bien ici, d'un problème dans le fichier D:\fichier-de-depart.php
Donc.. si les deux fichiers sont dans le même dossier .... alors ... le chemin avec les .. n'est pas bon !
Dans ton fichier D:\fichier-de-depart.php
<?php
// Fichier D:\fichier-de-depart.php

// pour tester.. on va regarder si le fichier existe
$fileSecurite = __DIR __ . '/securite.php';
if(!file_eixsts($fileSecurite)){
  echo " Fichier " . $fileSecurite . " manquant ou mal ortographié !!";
  exit;
}

require_once  __DIR __ . '/securite.php';


Ensuite.. le second message c'est :

( ! ) Fatal error: require(): Failed opening required '../security.php' (include_path='.;C:\php\pear') in D:\membres\fichier-de-destination.php on line 1

Là .. on est bien dans le fichier D:\membres\fichier-de-destination.php
et il essaye d'inclure le fichier security.php ... sauf que.. dans le premier fichier .. tu nous as dit que le fichier se nomme securite.php .... ouppss....!!!
Et donc,
<?php  
// Fichier D:\membres\fichier-de-destination.php

require_once __DIR__ "/../securite.php";



Il faudrait, avant tout, commencer par lire les messages d'erreur...
Comme tu peux le voir;. ça n'a rien ( mais alors vraiment rien..) à voir avec la connexion à la bdd, pdo.... (c'est pour ça que j'ai déplacé ta question qui se trouvait dans le forum mysql vers le forum php )

Bref.. ou mais heuu.. comme tu le dis ... avant tout... faut déjà juste lire .... en général ça aide à comprendre où se trouve les soucis...

Bonne journée.
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
11 janv. 2021 à 17:34
Merci Jordane,
Avec humour (partagé, j'espère) je te répondrai "on peut pas vivre avant d'avoir vécu", donc encore merci de ton activité pédagogique!

Le fichier connexionBDD.php contient les infos de connexion, donc si en local c'est:
<?php
$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'nomdemabase';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';
?>


dans la partie publique (dossier racine) où se trouve connexionBDD.php, page-de-depart.php et securite.php, il y a une autre page qui utilise la BDD sans passer par l'espace membre et donc j'ai repris le même code d'appel à la BDD pour page-de-depart.php (je répète: page-de-destination.php qui est la page d'accès à l'espace membre est dans un autre dossier, un sous-dossier du précédent, appelé membres, les deux fichiers, page-de-depart.php et page-de-destination.php, ne sont pas dans le même dossier)

J'ai bien vérifié (2 fois): il y a bien le fichier securite.php dans le dossier dit racine et il n'y est pas dans le sous-dossier membres.

Donc si je traduit bien ta demande (?) j'ajoute en haut du fichier page-de-depart.php le code:
<?php
// Fichier D:\fichier-de-depart.php

// pour tester.. on va regarder si le fichier existe
$fileSecurite = 'securite.php';
if(!file_exists($fileSecurite)){
  echo " Fichier " . $fileSecurite . " manquant ou mal ortographié !!";
  exit;}?>


réponse:
Fichier ../securite.php manquant ou mal ortographié !!

Je ne suis pas sûr de la "traduction" de ton code (je n'ai pas compris : __DIR __):
$fileSecurite = __DIR __ . '/securite.php';
sachant que securite.php est dans le même dossier que le fichier page-de-depart.php

J'ai essayé (par dépit) pour la ligne 5:
$fileSecurite = .'/securite.php';
mais là j'ai Parse error: syntax error, unexpected '.' in D:\page-de-depart.php on line 5
ET:
$fileSecurite = '/securite.php';
même réponse:
Fichier ../securite.php manquant ou mal ortographié !!

Cordialement,

A+

jh_kd
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
11 janv. 2021 à 17:50
Juste un mot de plus, je viens de faire "restart all services" puis dans local host je reteste:
avec le bout de code : $fileSecurite = 'securite.php'; pour page-de-depart.php, la réponse :
il n'y a plus : Fichier ../securite.php manquant ou mal ortographié !!
mails il revient à (mais avec des numéros différents):

( ! ) Warning: require(../securite.php): failed to open stream: No such file or directory in D:\fichier-de-depart.php on line 1
Call Stack
# Time Memory Function Location
1 0.0001 406432 {main}( ) ...\fichier-de-depart.php:0
2 0.0072 464008 include( 'D:\fichier-de-depart.php' ) ...\fichier-de-depart.php:94

( ! ) Fatal error: require(): Failed opening required '../security.php' (include_path='.;C:\php\pear') in D:\membres\fichier-de-destination.php on line 1
Call Stack
# Time Memory Function Location
1 0.0001 406432 {main}( ) ...\fichier-de-depart.php:0
2 0.0072 464008 include( 'D:\membres\fichier-de-destination.php' ) ...\fichier-de-depart.php:94

Mystère!

JH
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705 > jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
Modifié le 11 janv. 2021 à 18:04
peux-tu me montrer le code complet de tes différents fichiers en précisant pour chacun d'eux, le nom et leur emplacement sur ton ordi.

j'espère également, que tu as bien copié collé les codes que je t'ai donné, j'ai l'impression que tu as essayé de les réécrire à ta sauce ... Ce n'est pas ce que je t'ai demandé... Et on ne va pas s'en sortir si tu le fais comme ça...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
11 janv. 2021 à 17:47
On recommence ..

( avant tout.. si une instruction ne te parle pas... google est ton ami .. il te suffit de chercher, par exemple PHP __DIR__ pour voir ç quoi ça sert )

Donc

<?php 
// ceci est le  Fichier connexionBDD.php

/******************Config***********************/
$v_editor_name = "aaaaa";
$v_editor_email = "bbbbbb";
$url = "cccccc";
$v_web_name = "dddd";
/**********************************************/

$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'nomdemabase';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';

try {
   $connexion =new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd .';charset=utf8',$PARAM_utilisateur, $PARAM_mot_passe);
  // Activation des erreurs PDO
  $connexion ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
 $connexion ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}
?> 


<?php
// Fichier D:\fichier-de-depart.php

// pour tester.. on va regarder si le fichier existe
$fileSecurite = __DIR __ . '/securite.php';
if(!file_eixsts($fileSecurite)){
  echo " Fichier " . $fileSecurite . " manquant ou mal ortographié !!";
  exit;
}

require_once  __DIR __ . '/securite.php';

// Puis le reste du code de cette page




<?php  
// Fichier D:\membres\fichier-de-destination.php

require_once __DIR__ "/../securite.php";


// puis le reste du code ...



Tu n'as que des copier/coller à faire .... rien de plus.. rien de moins...



0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
11 janv. 2021 à 17:49
Il serait pas mal .. de nous faire une capture écran de ton explorateur windows ouvert sur la liste de tes fichiers...
histoire qu'on puisse vérifier leur nom exact ...


NB: Pense à afficher l'extension des fichiers dans ton explorateur
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
12 janv. 2021 à 12:39
Bonjour,

Ah, merci vivement, il ne m'était pas venu à l'idée que dans __DIR __ . '/securite.php', __DIR __ était une constante magique (je cherchais une manière d'écrire un directory= dossier en Anglais!).
J'ai tout repris intégralement, et là:

avec, dans fichier-de-depart.php, à la ligne 29 (après le test d'existence)

require_once __DIR __ . "/securite.php";

j'ai

Parse error: syntax error, unexpected '__' (T_STRING) in D:\fichier-de-depart.php on line 29

donc sauf misinterprétation de ma part il confirme bien que securite.php existe dans le dossier racine, puis il teste le require_once et là le message d'erreur je ne le situe pas (d'après Google et CCM il y aurait un souci d'échappement ou de guillemets ou un manque de ' ; ' à la fin de la ligne précédente.
J'ai vérifié 10 fois mais ce n'est pas le cas pour ces 3 erreurs.

Ce qui m'étonne c'est l'ajout du code require_once __DIR __ . "/securite.php"; car d'après mon modèle l'appel de securite.php ne concerne que le fichier de destination dans l'espace membre et pas fichier-de-depart.php.

Bon si je commente cette ligne dans fichier-de-depart.php:
//require_once __DIR __ . "/securite.php";

alors je reviens à une erreur pour la ligne 1 dans fichier-de-destination.php (attention ce n'est plus fichier-de-depart.php, il a sauté directement de fichier-de-depart.php à fichier-de-destination.php!):

Parse error: syntax error, unexpected '"/../securite.php"' (T_CONSTANT_ENCAPSED_STRING) in D:\membres\fichier-de-destination.php on line 1

et dans ce fichier-de-destination.php du dossier membre la ligne 1 est maintenant:
<?php require_once __DIR__ "/../securite.php";?>
et avant c'était à la place: <?php require ("../securite.php");?>

j'ai cherché dans Google (et CCM) et l'erreur T_CONSTANT_ENCAPSED_STRING semble concerner les lignes avant sauf que là c'est la ligne 1! ou bien un souci de guillemet simple ou double (là ils sont tous les deux doubles, mais j'ai aussi essayé avec les deux en simple).

Voilà,

A+

cordialement
jh_kd

PS:
voici le code ajouté dans fichier de départ pour éviter tout malentendu, de la ligne 22 à 29 incluse:

// Fichier D:\fichier-de-depart.php

// pour tester.. on va regarder si le fichier existe
$fileSecurite = "securite.php";
if(!file_exists($fileSecurite)){
  echo ' Fichier ' . $fileSecurite . ' manquant ou mal orthographié !!';
  exit;}
//require_once __DIR __ . "/securite.php";


et bien sûr dans l'explorateur il n'y a pas d'erreur tu peux me faire confiance... pas de boulette de ce type! (mais je peux faire un jpg avec les suffixes si tu insistes... je comprend que cela rende perplexe)
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
12 janv. 2021 à 12:45
il y a un point qui a sauté
<?php require_once __DIR__ "/../securite.php";?>


à corriger par
<?php require_once __DIR__  . "/../securite.php";?>
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
12 janv. 2021 à 15:23
Là il y a quelque chose qui s'affiche. Progrès! Merci.
En effet quand je clique sur fichier-de-depart.php dans localhost, immédiatement c'est le fichier d'échec login_failed.php qui s'affiche.

Donc c'est pour cela (à tort) que j'avais mis le fil dans mysql car j'avais l'impression que la BDD n'était pas accrochée.
En fait il semble que "il fait comme si il contournait" l'étape de saisie de ID et PW ou celle de l'inscription nouvelle pour dire tout de suite "pas bons ID ou PW" ou pas bon "inscription" (etc.), ce que normalement securite.php (code déjà cité entièrement plus haut dans ce fil) et la suite de fichier-de-depart.php (voir le code ci-après) sont censés vérifier.

Si je clique directement sur securite.php dans localhost, immédiatement c'est le fichier d'échec login_failed.php qui s'affiche aussi (pareil).

Si je clique directement sur check_user.php (le 1er vérifié dans le code -copié plus loin ici- de fichier-de-depart.php, aussi dans le dossier racine) dans localhost, là j'ai le message d'erreur suivant:

( ! ) Notice: Undefined index: user in D:\check_user.php on line 4
Call Stack
# Time Memory Function Location
1 0.0078 409344 {main}( ) ...\check_user.php:0

( ! ) Notice: Undefined variable: pdo in D:\check_user.php on line 5
Call Stack
# Time Memory Function Location
1 0.0078 409344 {main}( ) ...\check_user.php:0

( ! ) Fatal error: Uncaught Error: Call to a member function query() on null in D:\check_user.php on line 5
( ! ) Error: Call to a member function query() on null in D:\check_user.php on line 5
Call Stack
# Time Memory Function Location
1 0.0078 409344 {main}( ) ...\check_user.php:0

Et les codes des lignes 4 et 5 de check_user.php sont:
$sql = "SELECT * FROM membersbase WHERE user LIKE '".trim($_POST['user'])."' AND active = '1'";
$row = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);


Peut-être y-a-t'il là un problème PDO???

J'aurai tendance à le penser car pour un autre fichier validation_inscription.php plus loin dans le code de fichier-de-depart.php j'ai aussi des erreurs du même type pour le code:
$sql = "SELECT COUNT(1) FROM membersbase WHERE email_regis LIKE '".strtolower($_SESSION['registration']['email_regis'])."'";
$number = $pdo->query($sql)->fetchColumn();


et idem pour renew_password.php:
$sql = "SELECT * FROM membersbase WHERE email_corresp LIKE '".$email_user."' AND active = '1'";
$row = $pdo->query($sql)->fetch();


Donc pour la suite de fichier-de-depart.php voici le code:
//le fichier suivant ne contient que du html
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('member/page_authorized_visitor.php');
	include("membre/fichier-de-destination.php");
	
} else {

	// Unauthorized visitor
	require('login.php');
	//include('page_unauthorized_visitor.php');
	include('login_failed.php');

}

//le fichier suivant ne contient que du html	
require('footermysql.php');
?>


J'espère que cela peut aider.
Si tu vois quelque chose qui cloche... à part mes supputations???

Merci
Bien cordialement
jh_kd
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
12 janv. 2021 à 18:51
nous coller quelques lignes de code prises dans les fichiers par-ci par-là ne nous permet pas de nous rendre compte de leur imbrication ni de voir d'éventuelles autres erreurs...
Je te le redemande, il faut que tu nous postes le code complet de chaque fichier en précisant bien de quel fichier il s'agit à chaque fois....
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
13 janv. 2021 à 11:40
Bonjour,

C'est vraiment sympa de regarder le code des pages concernées !
Et je vais les poster sans aucun problème...

Mais avant pour ma pédagogie, j'ai 2 questions, stp:

1- j'ai essayé de voir/corriger les (petites) erreurs de requête sql dans mon (nouveau) PHPmyadmin (5.0.2) car je viens de changer d'ordi (Windows10).
Un exemple:
$sql = "SELECT * FROM membersbase WHERE user LIKE '".trim($_POST['user'])."' AND active = '1'";
$row = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);


Je teste différentes corrections dans Phpmyadmin et la suivante marche
SELECT * FROM membersbase WHERE user LIKE '.trim($_POST["user"]).' AND active = '1'


mais la réponse est:
MySQL a retourné un résultat vide (c'est à dire aucune ligne). (traitement en 0,0014 seconde(s).)

Est-ce que c'est parce qu'il ne peut pas trouver ($_POST["user"]) qui est une variable de session ou bien parce que le code suivant de PDO n'est pas bon :
$row = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);


2- je n'ai un appel (connexion) à la base de données que dans 2 fichiers (fichier-de-depart.php et fichier-de-destination.php) par dans le premier:

/******************Config***********************/
$v_editor_name = "aaaaa";
$v_editor_email = "bbbbbb";
$url = "cccccc";
$v_web_name = "dddd";
/**********************************************/

$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'nomdemabase';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';

try {
   $connexion =new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd .';charset=utf8',$PARAM_utilisateur, $PARAM_mot_passe);
  // Activation des erreurs PDO
  $connexion ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
 $connexion ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}


aurais-je dû mettre aussi ce code en tête dans les autres qui sont liés à fichier-de-depart.php par le processus de login/inscription/PW oublié???

Merci (pas obligé de répondre si cela prend du temps... je pense poster tous les codes concernés dans 2 ou 3 heures)


Bien cordialement,

jh_kd
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
13 janv. 2021 à 14:01
oula....
Visiblement il y a pleins de choses qui ne sont pas claires pour toi ...
Déjà ..
$_POST .. ce n'est pas une variable de session... mais une variable générée lors de l'envoi ( du "submit") d'un formulaire
Les variables de session.. c'est $_SESSION

Ensuite, dans une requête SQL, si tu cherches une valeur exacte .. ce n'est pas avec un LIKE mais avec le symbole égale =
Si tu veux faire une recherche "partielle", dans ce cas le LIKE s'utilisera avec des caractères JOKER ( des % )
Exemple
Je cherche jordane dans le where
$sql = "SELECT * FROM membersbase WHERE user ='jordane"

Je cherche les personnes dont le "user" commence par jo
$sql = "SELECT * FROM membersbase WHERE user LIKE 'jo%'


Ensuite, je t'ai donné un lien pour bien écrire/gérer les éventuels souci dans les requêtes via PDO
(je te le redonne...)
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
Il faudrait l'appliquer !!

Pour le reste, j'attendrais d'avoir la liste de tes fichiers, leurs noms, leurs emplacement .. et leurs contenus pour essayer de dépatouiller tout ça...
Car ton code semble bien bordélique....
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
13 janv. 2021 à 15:19
Rebonjour,

Eh oui on ne peut rien te cacher, mais je fais de mon mieux poiur adapter scrupuleusement et je travaille dur!

Les fichiers concernés sont les suivants (tous dans le dossier racine... je n'ai pas repris fichier-de-destination.php qui est la page d'accueil des membres dans le sous-dossier 'membre' commençant par <?php require_once __DIR__ ."/../security.php";?>
//before <?php require ("../security.php");?>)

Comme promis voici les codes complets des fichiers (cela fait beaucoup mais c'est un projet complet).
fichier-de-depart.php
renew_password.php
reset_password.php
save_new_email.php
save_new_password.php
securite.php
validation_inscription.php
check_user.php
compliance.php
form_registration.php

Juste quelques remarques préalables:
- le code de form_registration.php est partiel : il ne reprend que le code de son début, le reste est la suite du formulaire qui marche avec accès à la BDD
- le code login.php n'est que du html5 (explication du processus), non repris
- le code form_conditions.php n'est que du html5 (règles d'éthiques), non repris

Les codes fichier par fichier dans le même ordre sont:

fichier-de-depart.php
<?php
/******************Config***********************/
$v_editor_name = "aaaaa";
$v_editor_email = "bbbbbb";
$url = "cccccc";
$v_web_name = "dddd";
/**********************************************/

$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'nomdemabase';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';

try {
  $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
   // Activation des erreurs PDO
  $connexion ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
 $connexion ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}
// Fichier D:\fichier-de-depart.php

// pour tester.. on va regarder si le fichier existe
$fileSecurite = "securite.php";
if(!file_exists($fileSecurite)){
  echo ' Fichier ' . $fileSecurite . ' manquant ou mal ortographié !!';
  exit;}
//require_once __DIR __ . "/securite.php";

//le fichier suivant est codé Html5
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;
			
//added new
	case "Logout":
		unset($_SESSION['user']);
		header("Location: ".$_SERVER['PHP_SELF']);
		exit;

	case "Save_new_email":
		require('save_new_email.php');
		break;

	case "Save_new_password":
		require('save_new_password.php');
		break;	
//added end

		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('page_authorized_visitor.php');
	include("membre/fichier-de-destination.php");
	
} else {

	// Unauthorized visitor
	require('login.php');
	//include('page_unauthorized_visitor.php');
	include('login_failed.php');

}

//le fichier suivant n'est que du html5
	
require('footermysql.php');
?>


renew_password.php
<?php	
// Search email
$email_user = trim(strtolower($_POST['email']));

$sql = "SELECT * FROM membersbase WHERE email_corresp LIKE '".$email_user."' AND active = '1'";
$row = $pdo->query($sql)->fetch();
if ($row) {

	// Create & save code
	$code = uniqid();
	$sql = "UPDATE membersbase SET code = '".$code."' WHERE Rk_members = '".$row['Rk_members']."'";
	$save = $pdo->query($sql);

	// Email for reset password
	$from = $v_editor_name." <".$v_editor_email.">";
	$subject = "Reset password";
	$url_reset_password = $v_url."/reset_password.php?code=".$code;

	$headers = "Mime-Version: 1.0\r\n";
	$headers .= "Content-type: text/html; charset=UTF-8\r\n";
	$headers .= "Content-Transfer-Encoding: 7bit\r\n";
	$headers .= "From: ".$from;

	$text = "Hello ".$row['first_name']." ".$row['last_name']."<br><br>";
	$text .= "To reset your password, you must click on following link, thank you.<br><br>";
	$text .= "<a href='".$url_reset_password."'>Reset password</a><br><br>";
	$text .= "Best regards<br>";
	$text .= $from;

	mail($email_user, $subject, $text, $headers);

	echo "Sent Email to $email_user";

	// Redirect
	//header("Location: ".$_SERVER['PHP_SELF']);
	//exit;

} else {

	// Email not exists
	echo "Email $email_user does not exist or is not active";

	// Redirect
	//header("Location: ".$_SERVER['PHP_SELF']);
	//exit;

}
?>


reset_password.php
<?php

// Start session
// Receive request from to reset password
// Receive GET code
session_start();
	error_reporting(E_ALL);
    $PARAM_hote = 'localhost';
	$PARAM_port = '3306';
	$PARAM_nom_bd = 'nomdemabase';
	$PARAM_utilisateur = 'root';
	$PARAM_mot_passe = '';
	// Start session
    try {
        $connexion = 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();
    }
	// Header seulemnt html5
	require('headermysql.php');

if ($_POST['action'] == "validation") {

	if (strlen($_POST['new_password']) < 7 || strlen($_POST['new_password'] > 16)) {
		echo "<p>Invalid length password (7-16)</p>";

	} else {

		// New password is valid
		$new_password = password_hash(trim($_POST['new_password']), PASSWORD_DEFAULT);
		$sql = "UPDATE membersbase SET password = '".$new_password."', code = '' WHERE code = '".$_POST['code']."'";
		$pdo->query($sql);

		$_SESSION['message'] = "<p>Success! Password changed</p>";
		// erreur probable due à $v_url qu'il faudrait changer en "localhost" ou "killidatamysql" à header("Location: ".$v_url);
		header("Location: ".$v_url);
		exit;
		
	}


} else {

	$sql = "SELECT * FROM membersbase WHERE code = '".$_GET['code']."'";
	//erreur code pour $row = $pdo->query($sql)->fetch();
	$row = $pdo->query($sql)->fetch();

	if ($row) {

		// Exists code
		//probable error for if ($row['active'] == 1) {
		if ($row['active'] == 2) {

			// Active
			?>
			<form method="post">

			<input type="hidden" name="code" value="<?php echo $_GET['code']; ?>">

			<div class="input-group">
				<div class="input-group-prepend">
		    		<span class="input-group-text">New Password</span>
				</div>
				<input type="text" placeholder="8-12 Characters" class="form-control col-4" name="new_password">
			</div>

			<br>
			<button type="submit" name="action" value="validation" class="btn btn-primary centro">Submit</button>
			<br>

			</form>
			<?php

		} else {
			
			// Not active
			echo "<p>Member not active</p>";

		}

	} else {

		// Incorrect code
		echo "<p>Incorrect code received</p>";

	}

}

// Footer
//require('footermysql.php');
?>



save_new_email.php
<?php
$new_email = strtolower(trim($_POST['new_email']));

// Check if e-mail is valid
if (filter_var($new_email, FILTER_VALIDATE_EMAIL)) {

	// Check not repeated
	$sql = "SELECT COUNT(1) FROM membersbase WHERE email_corresp = '".$new_email."'";
	$number = $pdo->query($sql)->fetchColumn();

	if ($number < 1) {

		$sql = "UPDATE membersbase SET email_corresp = '".$new_email."' WHERE Rk_members = '".$_SESSION['user']['Rk_members']."'";
		$pdo->query($sql);

		echo "New email ".$new_email." recorded";

	} else {

		echo "Email ".$new_email." Email already used";

	}

} else {

	echo "Email ".$new_email." invalid";

}
?>


save_new_password.php
<?php
$new_password = trim($_POST['new_password']);

// Check length
if (strlen($new_password) >= 7 && strlen($new_password) <= 16) {

	$new_password = password_hash($new_password, PASSWORD_DEFAULT);

	$sql = "UPDATE membersbase SET password = '".$new_password."' WHERE Rk_members = '".$_SESSION['user']['Rk_members']."'";
	$pdo->query($sql);

	echo "New password recorded";

} else {

	echo "New password is invalid. Its length must be between 7 and 16 characters";

}
?>


securite.php
<?php
//***********Configuration*****************/
// Log navigation for authorized_visitor
$file_log_navigation = "log_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 in subdirectory membre:
<?php require("securite.php"); ?>
*/

//*****************************************/
//session_start();

if (isset($_SESSION['member'])) {

	// Navigation log

	// 2020-12-31 23:59:59	217.56.78.123	Internet Explorer	127	Manuel López (Spain)	xxxx_yyyy.php
	
	$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);
	header('Location: '.$page_no_login);
	exit;
}

session_destroy();
?>


validation_inscription.php
<?php

// Trim all values and save in session
foreach ($_POST['registration'] as $variable => $value) {
	$_SESSION['registration'][$variable] = trim($value);
}

// First Name
if (strlen($_SESSION['registration']['first_name']) < 2) {
	$_SESSION['message'] = "First Name too short<br>";
}

// Last Name
if (strlen($_SESSION['registration']['last_name']) < 2) {
	$_SESSION['message'] .= "Last Name too short<br>";
}

// check E-mail for registration
if (!filter_var($_SESSION['registration']['email_regis'], FILTER_VALIDATE_EMAIL)) {
	$_SESSION['message'] .= "Invalid registration e-mail<br>";
}

// E-mail for registration already used
$sql = "SELECT COUNT(1) FROM membersbase WHERE email_regis LIKE '".strtolower($_SESSION['registration']['email_regis'])."'";
$number = $pdo->query($sql)->fetchColumn();
if ($number == 1) {
	$_SESSION['message'] .= "E-mail registration already used<br>";
}

// check E-mail for corespondence
if (!filter_var($_SESSION['registration']['email_corresp'], FILTER_VALIDATE_EMAIL)) {
	$_SESSION['message'] .= "Invalid correspondence e-mail<br>";
}

// E-mail for correspondence already used
$sql = "SELECT COUNT(1) FROM membersbase WHERE email_corresp LIKE '".strtolower($_SESSION['registration']['email_corresp'])."'";
$number = $pdo->query($sql)->fetchColumn();
if ($number == 1) {
	$_SESSION['message'] .= "E-mail for correspondence already used<br>";
}

// Username = ID
if (strlen($_SESSION['registration']['user']) < 5 || strlen($_SESSION['registration']['user'] > 20)) {
	$_SESSION['message'] .= "Invalid length user (5-20)<br>";
}

// Username (ID) already used
$sql = "SELECT COUNT(1) FROM membersbase WHERE user LIKE '".$_SESSION['registration']['user']."'";
$number = $pdo->query($sql)->fetchColumn();
if ($number == 1) {
	$_SESSION['message'] .= "Username (ID) already selected, please choose another ID<br>";
}

// check if useful to harmonize min-max lengths of ID and PW like Invalid length for password (7 characters or more, up to 15 characters)
if (strlen($_SESSION['registration']['password']) < 7 || strlen($_SESSION['registration']['password'] > 16)) {
	$_SESSION['message'] .= "Invalid length for password (7 characters or more, up to 15 characters)<br>";
}

if ($_SESSION['registration']['day_birthday'] == "--"
	|| $_SESSION['registration']['month_birthday'] == "--"
	|| $_SESSION['registration']['year_birthday'] == "--" ) {
		$_SESSION['message'] .= "Invalid Date of Birthday<br>";
}

if ($_SESSION['registration']['country'] == "--") {
	$_SESSION['message'] .= "Country not selected<br>";
}

if (strlen($_SESSION['registration']['address']) < 20) {
	$_SESSION['message'] .= "Postal Address too short<br>";
}

if (strlen($_SESSION['registration']['profile']) < 20) {
	$_SESSION['message'] .= "Profile too short<br>";
}

if (strlen($_SESSION['registration']['motivations']) < 5) {
	$_SESSION['message'] .= "Motivations too short<br>";
}

// new item; publicized profile or not
if ($_SESSION['registration']['confirmation'] == "--") {
	$_SESSION['message'] .= "Online presentation of profile not selected<br>";
}

// if ($_SESSION['registration']['type_of_activity'] == "--") {
if ($_SESSION['registration']['type_of_activity'] == "--") {
	$_SESSION['message'] .= "Type of activity not selected<br>";
}

if (!isset($_SESSION['message'])) {

	//$_SESSION['registration']['code'] = uniqid();
	$password = password_hash($_SESSION['registration']['password'], PASSWORD_DEFAULT);
	$birthday = $_SESSION['registration']['year_birthday']."-".$_SESSION['registration']['month_birthday']."-".$_SESSION['registration']['day_birthday'];

// check if active is 0 or 1 by default
	$sql = "INSERT INTO membersbase SET
				active = '1',
				first_name = '".$_SESSION['registration']['first_name']."',
				last_name = '".$_SESSION['registration']['last_name']."',
				email_regis = '".strtolower($_SESSION['registration']['email_regis'])."',
				email_corresp = '".strtolower($_SESSION['registration']['email_corresp'])."',
				user = '".$_SESSION['registration']['user']."',
				password = '".$password."',
				birthday_date = '".$birthday."',
				country = '".$_SESSION['registration']['country']."',
				full_present_postal_address = '".$_SESSION['registration']['address']."',
				profile = '".$_SESSION['registration']['profile']."',
				motivations = '".$_SESSION['registration']['motivations']."',
				confirmation = '".$_SESSION['registration']['news']."',
				type_of_activity = '".$_SESSION['registration']['activity']."',
				type = 'standard',
				datetime_registration = NOW(),
				ip_registration = '".$_SERVER['REMOTE_ADDR']."'";
	$pdo->query($sql);

	// Message OK
	echo "<p>You have been pre-registered.<br>";
	echo "We shall send you an acceptance or non-acceptance e-mail to ".strtolower($_SESSION['registration']['email_corresp'])."<br>";
	echo "If within a few days you do not receive that e-mail, check your spam folder.</p>";

	// Send email to admin team
	$from = $v_editor_name." <".$v_editor_email.">";
	$subject = "New Inscription in ".$v_web_name;
	$to = $v_editor_name." <".$v_editor_email.">";
	
	$headers = "Mime-Version: 1.0\r\n";
	$headers .= "Content-type: text/html; charset=UTF-8\r\n";
	$headers .= "Content-Transfer-Encoding: 7bit\r\n";
	$headers .= "From: ".$from."\r\n";

	$text = "First name: ".$_SESSION['registration']['first_name']."<br>";
	$text .= "Last name: ".$_SESSION['registration']['last_name']."<br>";
	$text .= "Email regis: ".strtolower($_SESSION['registration']['email_regis'])."<br>";	
	$text .= "Email corresp: ".strtolower($_SESSION['registration']['email_corresp'])."<br>";
	$text .= "User: ".$_SESSION['registration']['user']."<br>";
	$text .= "Password: ".$_SESSION['registration']['password']."<br>";
	$text .= "Birthday: ".$birthday."<br>";
	$text .= "Country: ".$_SESSION['registration']['country']."<br>";
	$text .= "Postal_address: ".$_SESSION['registration']['address']."<br>";
	$text .= "Profile: ".$_SESSION['registration']['address']."<br>";	
	$text .= "Motivations: ".$_SESSION['registration']['motivations']."<br>";
	$text .= "Confirmation: ".$_SESSION['registration']['news']."<br>";
	$text .= "Type of activity: ".$_SESSION['registration']['activity']."<br>";

	mail($to, $subject, $text, $headers);

	// Delete data users
	unset($_SESSION['registration']);
	unset($_SESSION['message']);
	
}
?>


check_user.php
<?php

// Check user & password
$sql = "SELECT * FROM membersbase WHERE user LIKE '".trim($_POST['user'])."' AND active = '1'";
$row = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
if ($row) {

	// Exists user and is active (1)
	// Check password
	if (password_verify($_POST['password'], $row['password'])) {

		// Password correct -> // Store data in session
		foreach ($row as $col => $value) {
			$_SESSION['user'][$col] = $value;
		}

		// Access log
		$file_log_access = "log_authorized_visitor.txt";

		// 2020-12-31 23:59:59	217.56.78.123	Internet Explorer	127	Manuel López (Spain)

		$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'].")";

		file_put_contents($file_log_access, $register, FILE_APPEND);

		header("Location: ".$_SERVER['PHP_SELF']);		
		exit;	

	} else {

		// User and password incorrect
		echo "Password is incorrect";

	}

}else{

	// User & password incorrect
	echo "User does not exists or user is not active";

}
?>


compliance.php
<?php

// Start session
// Receive request to accept conditions
// Receive GET code
session_start();
	error_reporting(E_ALL);
$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'nomdemabase';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';
	// Start session
    try {
        $connexion = 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();
    }
	// Header, slt html5
	require('headermysql.php');

if ($_POST['accept'] == "Sign") {

	if ($_POST['condition1'] == '1' && $_POST['condition2'] == '1' && $_POST['condition3'] == '1') {

		$sql = "UPDATE membersbase SET active = '1', code = '' WHERE code = '".$_POST['code']."'";
		$pdo->query($sql);

		$_SESSION['message'] = "<p>Your application for membership is complete. We will reply shortly</p>";
		header("Location: ".$v_url);
		exit;

	} else {

		// Not accepted all conditions
		echo "<p>You have not accepted all required conditions</p>";

	}

} else {

	// Enter first

	$sql = "SELECT * FROM membersbase WHERE code = '".$_GET['code']."'";
	//erreur code pour $row = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
	$row = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);

	if ($row) {

		switch ($row['active']) {

			case '1':
				// is not it '0'?
				// Already active wait confirm
				echo "<p>User waiting for admin staff confirmation… Welcome. You will be an active new member, once security issues are solved by admin staff… if you do not receive an e-mail with warning of a possible problem, it usually takes less than 24 hours to activate your account (please try to enter with ID and PW after that, of if not successful, be more patient !</p>";
				break;

			case '2':
				// is not it '1'?
				// Already active
				echo "<p>User active</p>";
				break;				
			
			default:
				require('form_conditions.php');
				break;
		}

	} else {

		// Incorrect code
		echo "<p>Invalid code received</p>";

	}

}

// le fichier suivant est seulement html5
//require('footermysql.php');
?>


form_registration.php
<?php

session_start();

// Delete action
unset($_SESSION['action']);

// Asign values
if(!isset($_SESSION['registration']['first_name'])) $_SESSION['registration']['first_name'] = ""; 
if(!isset($_SESSION['registration']['last_name'])) $_SESSION['registration']['last_name'] = ""; 
if(!isset($_SESSION['registration']['email_regis'])) $_SESSION['registration']['email_regis'] = ""; 
if(!isset($_SESSION['registration']['email_corresp'])) $_SESSION['registration']['email_corresp'] = ""; 
if(!isset($_SESSION['registration']['user'])) $_SESSION['registration']['user'] = ""; 
if(!isset($_SESSION['registration']['password'])) $_SESSION['registration']['password'] = ""; 
if(!isset($_SESSION['registration']['day_birthday'])) $_SESSION['registration']['day_birthday'] = "";
if(!isset($_SESSION['registration']['month_birthday'])) $_SESSION['registration']['month_birthday'] = "";
if(!isset($_SESSION['registration']['year_birthday'])) $_SESSION['registration']['year_birthday'] = "";
if(!isset($_SESSION['registration']['country'])) $_SESSION['registration']['country'] = "";
if(!isset($_SESSION['registration']['full_present_postal_address'])) $_SESSION['registration']['full_present_postal_address'] = "";
if(!isset($_SESSION['registration']['profile'])) $_SESSION['registration']['profile'] = "";
if(!isset($_SESSION['registration']['motivations'])) $_SESSION['registration']['motivations'] = "";
if(!isset($_SESSION['registration']['activity'])) $_SESSION['registration']['activity'] = "";

// Print messages
if (isset($_SESSION['message'])) {
	echo "<p>".$_SESSION['message']."</p>";
	unset($_SESSION['message']);
}
?>

<form method="post">

<br>
<h3>Registration Form</h3>

	<div class="input-group">
		<div class="input-group-prepend">
    		<span class="input-group-text">First name (only usual name in daily practice) (if suitable or important, please state full list afterwards between brackets)</span>
		</div>
		<input type="text" placeholder="Minimum 2 characters" class="form-control col-4" name="registration[first_name]" value="<?php echo $_SESSION['registration']['first_name'] ?>">
	</div>

	<div class="input-group">		
		<div class="input-group-prepend">
    		<span class="input-group-text">Last name (only usual name in daily practice) (if suitable or important, please state full list afterwards between brackets)</span>
		</div>
		<input type="text" placeholder="Minimum 2 characters" class="form-control col-4" name="registration[last_name]" value="<?php echo $_SESSION['registration']['last_name'] ?>">
	</div>

	<div class="input-group">
		<div class="input-group-prepend">
    		<span class="input-group-text">E-mail for registration (preferably with name included in it, and, for professionals, it must be your official institutional address)</span>
		</div>
		<input type="text" placeholder="Email address" class="form-control col-4" name="registration[email_regis]" value="<?php echo $_SESSION['registration']['email_regis'] ?>">
	</div>
	
	<div class="input-group">
		<div class="input-group-prepend">
    		<span class="input-group-text">E-mail for correspondence (notably for professionals, if distinct from institutional), otherwise just copy herein Email for registration</span>
		</div>
		<input type="text" placeholder="Email address" class="form-control col-4" name="registration[email_corresp]" value="<?php echo $_SESSION['registration']['email_corresp'] ?>">
	</div>

	<div class="input-group">
		<div class="input-group-prepend">
    		<span class="input-group-text">Username (=ID) (a username with name then possibly initials is preferred, but not compulsory… beware, this cannot be changed afterwards)</span>
		</div>
		<input type="text" placeholder="5-20 Letters" class="form-control col-4" name="registration[user]" value="<?php echo $_SESSION['registration']['user'] ?>">
	</div>

	<div class="input-group">
		<div class="input-group-prepend">
    		<span class="input-group-text">Password (=PW) (upper and lower case are different) (this can be changed afterwards, any time, if 7 characters or more)</span>
		</div>
		<input type="password" placeholder="7-16 Characters" class="form-control col-4" name="registration[password]" value="<?php echo $_SESSION['registration']['password'] ?>">
	</div>

	<div class="input-group">
		<div class="input-group-prepend">
    		<span class="input-group-text">Date of birth (if confidential, mark only the actual year, plus month as 'January' and day as '01', then in practice it will become 1989-01-01)</span>
		</div>
		<select class="form-control col-2" name="registration[day_birthday]">
			<option value="--">--Day--</option>
			<?php for ($i=1; $i<=31; $i++) {
					echo '<option value="'.$i.'" ';
					if ($_SESSION['registration']['day_birthday'] == $i) echo 'selected';
					echo '>'.$i.'</option>';
			} ?>
		</select>
		<select class="form-control col-2" name="registration[month_birthday]">
			<?php $array_months = array('','January','February','March','April','May','June','July','August','September','October','November','December'); ?>
			<option value="--">--Month--</option>
			<?php for ($i=1; $i<=12; $i++) {
					echo '<option value="'.$i.'" ';
					if ($_SESSION['registration']['month_birthday'] == $i) echo 'selected';
					echo '>'.$array_months[$i].'</option>';
			} ?>
		</select>
		<select class="form-control col-2" name="registration[year_birthday]">
			<option value="--">--Year--</option>
			<?php for ($i=1920; $i<=date('Y'); $i++) {
					echo '<option value="'.$i.'" ';
					if ($_SESSION['registration']['year_birthday'] == $i) echo 'selected';
					echo '>'.$i.'</option>';
			} ?>
		</select>
	</div>

	<div class="input-group">
		<div class="input-group-prepend">
    		<span class="input-group-text">Country of Origin (NOT Country of Residence) (name in English)</span>
		</div>
		<select class="form-control col-5" name="registration[country]">
			<option value="--">--Country--</option>
			<?php
				//$sql = "SELECT country_full_english FROM countryform WHERE active = 1 ORDER BY country_full_english";
				$sql = "SELECT country_full_english FROM countryform ORDER BY country_full_english";
				$rows = $pdo->query($sql);
				foreach ($rows as $row) {
					echo '<option value="'.$row['country_full_english'].'" ';
					if ($_SESSION['registration']['country'] == $row['country_full_english']) echo 'selected';
					echo '>'.$row['country_full_english'].'</option>';
				}
			?>
		</select>
	</div>
	
	
// etc.

	<br>
	<h6 class="text-center bg-warning text-dark">All fields are required</h6>
	<button type="submit" name="action" value="Validation" class="btn btn-primary centro">Submit</button>
	<br>
</form>



Voilà

Encore merci!

Bien cordialement

jh_kd
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
13 janv. 2021 à 16:48
Bon..

Je ne vais pas tout coder...
Mais dans le principe :

Tu créés un fichier cnxBdd.php (qui sert à faire la connexion en PDO et que tu pourras inclure dans les pages qui en ont besoin )

<?php
/*
 * Fichier cnxBdd.php
 * Permet la connexion à la bdd.
 * Fichie à inclure ( require_once) dans les pages devant effectuer des requêtes SQL PDO.
 */

$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'nomdemabase';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';

try {
  $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd . ';charset=utf8', $PARAM_utilisateur, $PARAM_mot_passe);
  // Activation des erreurs PDO
  $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
  $connexion->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
  echo 'Erreur : ' . $e->getMessage() . '<br />';
  echo 'N° : ' . $e->getCode();
}
?> 


Ensuite, plutôt que de placer ton code php dans pleins de fichiers .. autant juste en faire des fonctions... même mieux ... une CLASS contenant les différentes fonctionnalités

Par exemple, un fichier user.class.php contenant
<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of user
 *
 * @author jreynet
 */
class user {

  //put your code here
  private $bdd = null;

  function __construct($connexion) {
    $this->bdd = $connexion;
  }

  public function getUserByMail($email_user) {
    $sql = "SELECT * FROM membersbase WHERE email_corresp = :email_user AND active = '1'";
    $datas = [':email_user' => $email_user];

    //Execution de la requete
    try {
      $requete = $this->bdd->prepare($sql);
      $requete->execute($datas);
      return $requete->fetch();
    } catch (Exception $e) {
      // en cas d'erreur :
      echo " Erreur ! " . $e->getMessage();
      echo " Les datas : ";
      print_r($datas);
    }
  }
  
  
  public function getUserByCode($code){
    $sql = "SELECT * FROM membersbase WHERE code = :code";
	$datas = [':code'=>$code];
     //Execution de la requete
    try {
      $requete = $this->bdd->prepare($sql);
      $requete->execute($datas);
      return $requete->fetch();
    } catch (Exception $e) {
      // en cas d'erreur :
      echo " Erreur ! " . $e->getMessage();
      echo " Les datas : ";
      print_r($datas);
    }
  }

  public function setUserCode($Rk_members, $code) {
    $sql = "UPDATE membersbase SET code = :code WHERE Rk_members = :Rk_members";
    $datas = [':code' => $code, ':Rk_members' => $Rk_members];
    //Execution de la requete
    try {
      $requete = $this->bdd->prepare($sql);
      $requete->execute($datas);
    } catch (Exception $e) {
      // en cas d'erreur :
      echo " Erreur ! " . $e->getMessage();
      echo " Les datas : ";
      print_r($datas);
    }
  }

  public function reset_password($password, $code) {
    if (!empty($code)) {
      $min = 7;
      $max = 16;
      return strlen($password) < 7 || strlen($password) > 16 ? "<p>Invalid length password (" . $min . " - " . $max . ")</p>" : false;

      $new_password = password_hash(trim($password), PASSWORD_DEFAULT);
      $sql = "UPDATE membersbase SET password = :new_password, code = '' WHERE code = :code";
      $datas = [':new_password' => $new_password, ':code' => $code];

      //Execution de la requete
      try {
        $requete = $this->bdd->prepare($sql);
        $requete->execute($datas);
      } catch (Exception $e) {
        // en cas d'erreur :
        echo " Erreur ! " . $e->getMessage();
        echo " Les datas : ";
        print_r($datas);
      }
    }
  }

  public function renew_password($email_user) {
    /******************Config***********************/
    $v_editor_name = "aaaaa";
    $v_editor_email = "bbbbbb";
    $v_url = "cccccc";
   
    $user = $this->getUserByMail($email_user);
    if (!empty($user)) {

      $Rk_members = $user['Rk_members'];
      $code = uniqid();
      //on met à jour le code
      $this->setUserCode($Rk_members, $code);

      // Email for reset password
      $from = $v_editor_name . " <" . $v_editor_email . ">";
      $subject = "Reset password";
      $url_reset_password = $v_url . "/reset_password.php?code=" . $code;

      $headers = "Mime-Version: 1.0\r\n";
      $headers .= "Content-type: text/html; charset=UTF-8\r\n";
      $headers .= "Content-Transfer-Encoding: 7bit\r\n";
      $headers .= "From: " . $from;

      $text = "Hello " . $user['first_name'] . " " . $user['last_name'] . "<br><br>";
      $text .= "To reset your password, you must click on following link, thank you.<br><br>";
      $text .= "<a href='" . $url_reset_password . "'>Reset password</a><br><br>";
      $text .= "Best regards<br>";
      $text .= $from;

      if(!mail($email_user, $subject, $text, $headers)){
        return " Erreur lors de l'envoi du mail !! ";
      }

      return  "Sent Email to $email_user";
    }else{
      return "Email $email_user does not exist or is not active";
    }
  }
  
  
  public function save_new_email($Rk_members,$new_email){
    $sql = "UPDATE membersbase 
            SET email_corresp = :new_email
           WHERE Rk_members = :Rk_members";
    
	$datas = [':new_email' => $new_email, ':Rk_members' => $Rk_members];

      //Execution de la requete
      try {
        $requete = $this->bdd->prepare($sql);
        $requete->execute($datas);
      } catch (Exception $e) {
        // en cas d'erreur :
        echo " Erreur ! " . $e->getMessage();
        echo " Les datas : ";
        print_r($datas);
      }	
  }
  
  
  public function getUserByUserName($userName){
     $sql = "SELECT * 
       FROM membersbase 
       WHERE user = :userName 
       AND active = '1'";
     
	$datas = [':userName'=>$userName];
     //Execution de la requete
    try {
      $requete = $this->bdd->prepare($sql);
      $requete->execute($datas);
      return $requete->fetch();
    } catch (Exception $e) {
      // en cas d'erreur :
      echo " Erreur ! " . $e->getMessage();
      echo " Les datas : ";
      print_r($datas);
    }
  }


  public function login($userName,$password){
    $user = $this->getUserByUserName($userName);
    if(!empty($user)){
      $pass = $user['password'];
      if(!password_verify($password, $pass)){
        return "Password is incorrect";
      }else{
        return $user;
      }
    }else{
      return "User does not exists or user is not active";
    }
    
  }

  // FIN DE LA CLASS
}



Pour l'utiliser, par exemple dans ton fichier reset_password.php
<<?php
//Démarrage des sessions
session_start();

//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//on inclus le fichier de connexion à la bdd et la class user
require_once "cnxBdd.php";
require_once "user.class.php";
//on instancie la class user, avec, en paramètre, la variable de connexion à la bdd
$oUser = new user($connexion);



//On traite le formulaire si il a été submit
if ($_POST['action'] == "validation") {
  //Récupération PROPRE des variables AVANT de les utiliser
  $post_password = !empty($_POST['password']) ? trim($_POST['password']) : NULL;
  $code = !empty($_POST['code']) ? $_POST['code'] : NULL;

  $oUser->reset_password($post_password, $post_code);
} else {

//Récupération PROPRE des variables AVANT de les utiliser
  $code = !empty($_GET['code']) ? trim($_GET['code']) : NULL;
}
//On récupère le user en fonction du code
$row = $oUser->getUserByCode($code);

// Header seulemnt html5
require_once 'headermysql.php';


if ($row) {

  // Exists code
  //probable error for if ($row['active'] == 1) {
  if ($row['active'] == 2) {

    // Active
    ?>
    <form method="post" action="">
      <input type="hidden" name="code" value="<?php echo $code; ?>">
      <div class="input-group">
        <div class="input-group-prepend">
          <span class="input-group-text">New Password</span>
        </div>
        <input type="text" placeholder="8-12 Characters" class="form-control col-4" name="new_password" value="<?php echo $post_password; ?>">
      </div>
      <br>
      <button type="submit" name="action" value="validation" class="btn btn-primary centro">Submit</button>
      <br>

    </form>
    <?php
  } else {
    // Not active
    echo "<p>Member not active</p>";
  }
} else {
// Incorrect code
  echo "<p>Incorrect code received</p>";
}


Autre exemple, ta page check_user.php
<?php


//--------------------------------------------------------------------------------------------------//
//
// TOUTE LA PARTIE session_start,  require_once ...  new user() ..
// n'est pas necessaire si cette page est incluse (require..) depuis ta page depart
// Par contre, si c'est bien une page à part ouverte, par exemple par : http://tonsite.fr/check_user.php  ... il faut le mettre
//
//--------------------------------------------------------------------------------------------------//
//Démarrage des sessions
session_start();

//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//on inclus le fichier de connexion à la bdd et la class user
require_once "cnxBdd.php";
require_once "user.class.php";
//on instancie la class user, avec, en paramètre, la variable de connexion à la bdd
$oUser = new user($connexion);

//--------------------------------------------------------------------------------------------------//

//Récupération PROPRE des variables AVANT de les utiliser
$userName = !empty($_POST['user']) ? $_POST['user'] : NULL;
$password = !empty($_POST['password']) ? $_POST['password'] : NULL;

$row = $oUser->login($userName, $password);

//si la connexion n'est pas bonne.. affichage du message d'erreur
if (is_string($row)) {
  echo $user;
} else {
  //ici on créé les variables de session
  // Password correct -> // Store data in session
  foreach ($row as $col => $value) {
    $_SESSION['user'][$col] = $value;
  }

  // Access log
  $file_log_access = "log_authorized_visitor.txt";

  // 2020-12-31 23:59:59	217.56.78.123	Internet Explorer	127	Manuel López (Spain)

  $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'] . ")";

  file_put_contents($file_log_access, $register, FILE_APPEND);

  header("Location: " . $_SERVER['PHP_SELF']);
  exit;
}




bref, avec un découpage comme ça.. et l'écriture PROPRE des requpetes et des variables.. ça devrait faciliter la création de ton site et le debogage des éventuelles erreurs...


0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
14 janv. 2021 à 11:52
Bonjour,

Et merci de ces conseils qui me seront utiles lorsque le ou les bugs seront identifiés et corrigés, notamment sur la page-de-depart.php qui conditionne tout le reste.
Comme en cliquant sur ce fichier dans localhost je suis transféré directement à la page de 'failed access' sans message d'erreur, je pense que le problème vient d'abord de page-de-depart.php

En tous cas les codes de tous mes fichiers sont ici ouverts aux experts qui seraient tentés de les pointer.

Un point mineur: j'ai déjà expliqué ce qu'était le fichier connexionBDD.php et donc dans les codes je l'ai mis sous la forme directe sans require:
$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'nomdemabase';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';

à la place de:
require ("connexionBDD");

mais quand j'utilise localhost bien sûr c'est le codage avec require qui est utilisé.

Je ne sais pas et je ne sais plus aller plus loin.

A nouveau, merci et bonne continuation,

bien cordialement,

jh_kd

PS: dans le message il est écrit pour check_user.php

<<<Par contre, si c'est bien une page à part ouverte, par exemple par : http://tonsite.fr ... il faut le mettre>>>

et c'est bien le cas : j'ai bien indiqué que toutes les pages citées étaient accessibles de façon indépendante (notamment via localhost... ce qui m'a permis de détecter certaines erreurs au début dans l'adaptation du modèle (pas les erreurs qui impliquent d'autres pages du processus login-inscription-PWchange avec post ou get)
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
14 janv. 2021 à 12:01

Comme en cliquant sur ce fichier dans localhost je suis transféré directement à la page de 'failed access' sans message d'erreur, je pense que le problème vient d'abord de page-de-depart.php

Ben.. la redirection est due à ton fichier securite.php ....
Regarde.. dans le else ...

D'où l'importance de correctement réorganiser/écrire ton code.. pour t'y retrouver

et c'est bien le cas : j'ai bien indiqué que toutes les pages citées étaient accessibles de façon indépendante (notamment via localhost... ce qui m'a permis de détecter certaines erreurs au début dans l'adaptation du modèle (pas les erreurs qui impliquent d'autres pages du processus login-inscription-PWchange avec post ou get)

Sauf, que dans le fonctionnement de ton code... tu ne les appelle pas depuis l"url ... mais via des require dans ton fichier de départ ...
Donc .. si utilisées dans un require ( ou un include.. )... = pas "indépendantes"
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
16 janv. 2021 à 15:47
Bonjour,

Merci de ton aide.

Je vois. Tu as raison!
Comme sur mon modèle de securite.php j'ai la même chose, je suis démuni.
J'ai pensé que le point était de trop à:
header('Location: '.$page_no_login);
Voire l'apostrophe mal placée (en lisant un fil sur stackoverflow à propos de header location)
J'ai testé
header("Location: '$page_no_login'");
header("Location : login_failed.php");
header("Location:$page_no_login");

Le 1er: il faut enlever les guillemets simples, sinon erreur, si oui le résultat est le même qu'avec 2 et 3, ou qu'avec le point et la formule originale.
Le 2ème et le 3ème donnent le même résultat depuis platform-members.php...

Si je clique sur platform-members.php dans localhost, la page ne s'affiche pas (comme toujours) et elle passe tout de suite (comme toujours) sur:
login_failed.php

Pourquoi n'affiche-t-il jamais la page platform-members.php?

Le problème semble ailleurs qu'après le else de securite.php

Cordialement,

jh_kd

PS: pour check_user.php mon fichier est identique au modèle y compris pour la requête:
$sql = "SELECT * FROM membersbase WHERE user LIKE '".trim($_POST['user'])."' AND active = '1'";
suite à test dans phpmyadmin j'ai corrigé en:
$sql = "SELECT * FROM membersbase WHERE user LIKE '.trim($_POST["user"]).' AND active = '1'";
mais c'est pareil pour l'affichage de la page platform-members.php comme indiqué plus haut

PPS: dans plaform-members.php il y a aussi un else qui, lui, manque d'info pour case "Validation"::
Mais si j'ajoute, après //success, le code:
soit,
require('index.php');
soit,
echo 'congratulations';
c'est pareil!
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
16 janv. 2021 à 16:16
Déjà... faudrait que tu saches comment on concatène des variables en php ... c'est le minimum à connaitre quand on commence à apprendre un langage !!

Donc :

header('Location: '.$page_no_login);
header("Location : login_failed.php");
header("Location: $page_no_login");

Ces trois écritures sont correctes....
La première... fait de la concaténation
La seconde .. ce n'est qu'une string que tu envois dans la fonction header
La troisième... utilise le fait que les variables php sont interprétées lorsqu'elles sont entre simple quotes...

Pour comprendre :
$toto = "jh_kd";
echo "Bonjour jh_kd";  // Affichera Bonjour jh_kd
echo "Bonjour $toto"; // Affichera Bonjour jh_kd
echo 'Bonjour ' . $toto; // Affichera Bonjour jh_kd
echo 'Bonjour $toto'; // Affichera Bonjour $toto


Ensuite, en ce qui concerne ta redirection...
.... Si dans le premier fichier que tu ouvres... tu vérifies que la variable de session existe ... et qu'elle n'existe pas.... tu es redirigés vers ta page no_login ...
if (isset($_SESSION['member'])) {

} else {
	// Si l'utilisateur n'est pas connecté... il est redirigé  vers la page  No login
	header('Location: '.$page_no_login);
	exit;
}


Donc.. tant que tu n'es pas authentifié... tu seras toujours redirigé vers cette page ...
Aucun bug au niveau du code.. il fait bien ce que tu lui as demandé ...
Mais à mon avis.. c'est une erreur de ta part .. car cette vérification ne devrait pas se faire dès ta première page...
A moins que ta page no_login soit celle qui permette de se loguer ??

Comme je le disais..tu as surtout un gros souci d'organisation de ton code ( en plus d'une mauvaise .. très mauvaise.. connaissance du langage ... )
Je t'invite donc à
- Apprendre à programmer en PHP ( en suivant des tutoriels un peu plus à ton niveau )
- A revoir l'organisation de ton code

Pour ma part je m'arrête là, le souci initiale étant traité.






0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
17 janv. 2021 à 10:14
Bonjour,

Pas de problème.
C'est un forum donc si d'autres contributeurs veulent dire leur avis ils sont les bienvenus, mais y-en-a-t'il?
Juste un point, le souci ne concerne pas la 1ère page, mais la page de destination et cela indirectement (et cette page-de-destination commence maintenant par : <?php require_once __DIR__ ."/../security.php";?> et plus par: <?php require_once ("../security.php");?>)

Quand je clique dans localhost sur page-de-depart, il va chercher d'emblée la page-de-destination (seul endroit où il y a l'appel à la page securite.php dans le dossier racine) et arrivé à la fin du code securite.php, il n'a pas d'autre option que de passer à no_login.

C'est là qu'est le souci. C'est un souci de code, pas d'organisation, ou de connaissance de base du php (que je n'ai pas, c'est évident, mais je l'ai écrit dès le début).
Et là tu aurais pu vraiment aider, c'est ce que j'attendais ici, mais je peux m'être trompé de forum.

Bonne continuation, et encore merci de tout ce suivi régulier et assidu.
jh_kd
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
17 janv. 2021 à 10:23

connaissance de base du php (que je n'ai pas, c'est évident, mais je l'ai écrit dès le début).

Non. au début tu nous as parlé de Mysql .... et tu avais, d'ailleurs posté ta question dans le mauvais forum...



Quand je clique dans localhost sur page-de-depart, il va chercher d'emblée la page-de-destination (seul endroit où il y a l'appel à la page securite.php dans le dossier racine) et arrivé à la fin du code securite.php, il n'a pas d'autre option que de passer à no_login.


Je vais essayer de reformuler autrement ... vu qu'il semble qu'on ne se comprenne pas....

Tu arrives sur ta page de départ ...
Comme tu le dis,.. d'emblée.. tu inclus la page page-de-destination ... page qui .. elle même .. inclus la page securité.
Page sécurité qui contient le code que j'ai mentionné juste avant ...

Donc....
A quel moment ... as tu authentifié ton utilisateur ? ( renseigné les variables de session ???? )
Par ce que... TANT que la variable de session $_SESSION['member'] n'est pas créée .... tu seras TOUJOURS redirigé vers la page no_login ...



Je te rappelle également que ta question de départ... concernait des messages d'erreurs pour l'inclusion de fichiers ....
Chose qui devrait être résolu désormais...
Si tu as encore des messages d'erreur.. il va falloir les donner .. n'ayant pas encore le dont de divination...

Et dernière chose... si si .. j'insiste .. ton code est foutrement bordélique...
Et tant que tu ne l'auras pas un peu revu en t'appuyant sur ce que je t'ai déjà donné... il sera compliqué d'avancer.
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
Modifié le 19 janv. 2021 à 11:23
Bonjour,

Merci des explications.
Puis-je commencer par une parenthèse humoristique pour mieux éclairer (pas d'ironie, pas de sarcasme!)?

Comme je l'ai dit, mes connaissances en php sont limitées. Le codage a été réalisé bénévolement par un professionnel (quelqu'un qui est payé pour des sites clé en main et leur hébergement), mon grain de sel ne concerne que du html et des codages simples en php et les tests sur mon phpmyadmin des requêtes ou sur localhost.
Ton opinion sur son codage ne lui parviendra pas car il ne parle pas le Français et il habite très loin!
Autre culture, autre codage.
Il m'avait mis son projet sur son serveur Internet à l'époque et il fonctionnait selon lui... le seul souci (me semblait-il) était le langage des requêtes en sqli, pas en PDO et donc il a essayé d'adapter... d'où ma 1ère inquiétude (fausse) sur un problème Mysql dans ce fil.
Fin de parenthèse.

Il y avait une erreur (sûr?) avec dans le fichier-de-destination avec initialement (ligne 1)
<?php require ("../security.php");?> ou <?php require_once ("../security.php");?>
que tu as corrigé (?) par
<?php require_once __DIR__ ."/../security.php";?>
En tout cas il n'y a plus de message d'erreur mais le fichier-de-destination passe direct à login_failed.
C'est bien là le problème car cela ne nous aide pas sauf à des hypothèses ("devinations").
Comme je fais ce que je peux (cad peu) et que le codeur ne peut aider, c'est bien difficile.
En tout cas je n'ai pas finassé.
J'ai mis tout le codage que j'ai reçu. Il ne manque rien.
Si ce codage produisait des erreurs, tu pourrais avancer (moi aussi).
Mais non.
Tu écrit: TANT que la variable de session $_SESSION['member'] n'est pas créée...
J'ai regardé (modestement) et je vois :
/************************************************************************/
if (isset($_SESSION['action'])) {
 $_POST['action'] = $_SESSION['action'];
 unset($_SESSION['action']);
}
/************************************************************************/
if (isset($_POST['action'])) {
 switch ($_POST['action']) {

  case


puis, plus loin:
default:
   // Print & delete messages
   if (isset($_SESSION['message'])) {
    echo $_SESSION['message']."<br />";
    unset($_SESSION['message']);
   }

   break;
 }
}

/********************************************************************************************************/
if (isset($_SESSION['user']['user'])) {


Chez le codeur (distant), cela marche, chez moi, non, et pour toi, c'est insuffisant (il manque $_SESSION['member']).

Un casse tête!

Voilà,

Bien cordialement (et re-modestement)

jh_kd
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
19 janv. 2021 à 11:45
parmii les fichiers "include" .. il y en a un que tu ne nous as pas montré ... c'est le fichier login.php
je suppose que c'est celui-ci qui permet de faire la connexion...

Et donc, dans le fichier securite.php .. c'est vers ce fichier qu'il faudrait rediriger au lieu du no_login
(ou l'inclure dans le fichier no_login éventuellement )
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
Modifié le 21 janv. 2021 à 10:44
Bonjour,

Facile... j'avais dit que c'était que du html (le classique log-in avec submit), mais on ne sait jamais:
Voici le code

<h3>Login processes</h3>

<form class="dropdown-menu dropdown-menu-right p-4" method="post">

 <div class="form-group">
     <label for="exampleDropdownFormEmail2">User (ID)</label>
     <input type="text" name="user" class="form-control" id="exampleDropdownFormEmail2" placeholder="e.g., Smith4925">
 </div>

 <div class="form-group">
     <label for="exampleDropdownFormEmail2">Password (PW)</label>
     <input type="password" name="password" class="form-control" id="exampleDropdownFormEmail2" placeholder="e.g., 11GreatKD20">
 </div>

 <button type="submit" name="action" value="Login" class="btn btn-primary">Sign in</button>

 <br><br>

 <div class="dropdown-divider"></div>
 New around here ? <button type="submit" name="action" value="Registration" class="btn btn-primary">Sign up</button>
 <div class="dropdown-divider"></div>
 Forgot password ? <button type="submit" name="action" value="Password_forgotten" class="btn btn-primary">Reset PW</button>

</form>


En ce qui concerne le fichier securite.php:
j'ai ajouté en haut la ligne:
$page_login = "login.php";


puis en bas, j'ai modifié comme suit:
else {
 
 // No login
 header('Location: '.$page_login);
 //header('Location: '.$page_no_login);
 // header("Location : login_failed.php");
 //header("Location:$page_no_login");
 exit;



Après ces changements, si dans localhost je clique sur page-de-depart.php, la page passe d'emblée à login.php (pas de surprise, c'est demandé à la place de login_failed, c'est comme si je cliquais direct sur login.php) et j'ai mes 3 options qui s'affichent (sign in, sign up, reset pW) et par exemple si pour sign in je tape mes ID-PW (valides, de la table MySql) ou sur sign up ou sur resetPW, cela ne fait rien du tout, je reste sur la page login.php.

Il y a quand même des infos à tirer:
1- le log des sign in en php fonctionne car mon passage a été tracé, mais le même log dans la table de la BDD est vide, donc j'en conclus que la BDD n'est pas "accrochée" (nous avvons un double système de logs).
2- pour pousser le bouchon jusqu'au bout, j'ai mis tous les fichiers concernés (après ces corrections) sur Internet et j'ai tapé www.xxx.org/page-de-depart.php
Et là (enfin) j'ai une erreur:
Warning: Cannot modify header information - headers already sent by (output started at /homepages/1/d31515812/htdocs/xxxxxx/headermysql.php:1) in /homepages/1/d31515812/htdocs/xxxxxx/check_user.php on line 32
note: la ligne 32 de check_user.php est:
file_put_contents($file_log_access, $register, FILE_APPEND);

3- cela me donne l'idée de tester, cette fois en localhost, directement les fichiers individuels dans l'ordre des 'case' de fichier-de-depart.php (même si je ne sais pas si c'est toujours pertinent):

pour check_user.php,, j'ai deux petites erreurs (undefined index et undefined variable), mais surtout un failure:
Fatal error: Uncaught Error: Call to a member function query() on null in
D:\wamp64\www\xxxxxxxx\check_user.php on line 8
( ! ) Error: Call to a member function query() on null in D:\wamp64\www\xxxxxxxx\check_user.php on line 8
et la ligne 8 est:
$row = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);

le souci est (semble-t-il) lié à MySql PDO


pour form_registration.php:
le fichier s'affiche bien jusqu'à la première requête impliquant la BDD qui est censée ouvrir les options de la liste des pays:
<?php
    $sql = "SELECT country_full_english FROM countryform ORDER BY country_full_english";
    $rows = $pdo->query($sql);
    foreach ($rows as $row) {
     echo '<option value="'.$row['country_full_english'].'" ';
     if ($_SESSION['registration']['country'] == $row['country_full_english']) echo 'selected';
     echo '>'.$row['country_full_english'].'</option>';
    }
   ?>

je teste dans phpmyadmin la requête sql, elle fonctionne, est-ce la ligne d'après avec PDO?

pour validation_inscription, j'ai plein de petites erreurs, mais surtout un failure:
Fatal error: Uncaught Error: Call to a member function query() on null in D:\wamp64\www\xxxxxxxx\validation_inscription.php on line 45
( ! ) Error: Call to a member function query() on null in D:\wamp64\www\xxxxxxxx\validation_inscription.php on line 45
et la ligne 45 est:
$number = $pdo->query($sql)->fetchColumn();

le souci est encore (?) lié à PDO

pour renew_password.php, c'est pareil:
Fatal error: Uncaught Error: Call to a member function query() on null in D:\wamp64\www\xxxxxx\renew_password.php on line 6
( ! ) Error: Call to a member function query() on null in D:\wamp64\www\xxxxxxxx\renew_password.php on line 6
et la ligne 6 est:
$row = $pdo->query($sql)->fetch();

le souci est encore (?) lié à PDO

Est-ce que cela t'aide? (je l'espère car j'ai travaillé dur)

Bien cordialement (et encore merci!)

jh_kd
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
21 janv. 2021 à 11:19

2- pour pousser le bouchon jusqu'au bout, j'ai mis tous les fichiers concernés (après ces corrections) sur Internet et j'ai tapé www.xxx.org/page-de-depart.php

Oui.. car sur le serveur.. je suppose que l'affichage des erreurs PHP est activé ..... chose que je t'avais déjà conseillé
Voir le lien :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code


Je t'invite également à appliquer ( pour CHAQUE REQUETE EN PDO ) les consignes données ici
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

A savoir : Avoir activé l'affichage des erreurs PDO dans ta connexion
Placer CHAQUE requête dans un bloc TRY/CATCH

Je te conseille aussi de "couper" les instructions ( surtout que tu ne peux pas, il me semble, faire de fetch directement sur l'intruction query...)
Au lieu de
$row = $pdo->query($sql)->fetch();

faire
try{
  $sth = $dbh->prepare($sql);
  $sth->execute();
  $row = $sth->fetch();
}catch(Exception $e){
  echo "ERREUR dans la requête <br>".$sql;
  echo "<br> ". $e->getMessage();
}





pour validation_inscription, j'ai plein de petites erreurs, mais surtout un failure:
Fatal error: Uncaught Error: Call to a member function query() on null in

Cela signifie que la variable $pdo est null ....
As tu bien mis la connexion à la bdd dans ce fichier ?

le souci est encore (?) lié à PDO

Non... à l'interface clavier-chaise ... :-)
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
22 janv. 2021 à 10:33
Bonjour,

Je crois qu'il faut que je commence par une précision.
Le site existe et la base de données est opérationnelle sur Internet depuis 2014... le présent projet consiste à rendre le processus sign in, sign up et reset PW automatique et avec une nouvelle table des membres dans la BDD qui a été remplie avec les membres exostants pour les tests (alors qu'aujourd'hui les 3 opérations sign in, sign up et reset PW sont traitées mannuellement, hors BDD).

Bon pour dire qu'il n'y a pas de souci côté BDD... apparemment... restons prudents.

Pour l'autre proposition, à savoir:
$row = $pdo->query($sql)->fetch();

remplacé par:
try{
  $sth = $dbh->prepare($sql);
  $sth->execute();
  $row = $sth->fetch();
}catch(Exception $e){
  echo "ERREUR dans la requête <br>".$sql;
  echo "<br> ". $e->getMessage();
}


Si je fais cela et que je clique en localhost sur check_user.php, j'ai immédiatement l'erreur:

( ! ) Fatal error: Uncaught Error: Call to a member function prepare() on null in D:\wamp64\www\xxxxxxxx\check_user.php on line 10
( ! ) Error: Call to a member function prepare() on null in D:\wamp64\www\xxxxxxxx\check_user.php on line 10
Call Stack
# Time Memory Function Location
1 0.0001 406240 {main}( ) ...\check_user.php:0

Pour la première proposition, je ne comprend pas!
Tu veux que j'ajoute le code suivant au début de tous les 12 fichiers mentionnés sur ce fil qui contiennent du code php (sauf fichier-de-depart.php qui a déjà cet ajout):

/******************Config***********************/
$v_editor_name = "aaaaa";
$v_editor_email = "bbbbb";
$url = "cccccc";
$v_web_name = "dddddd";
/**********************************************/
session_start();
error_reporting(E_ALL);
require ("connexionBDD.php");

try {
  $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
   // Activation des erreurs PDO
  $connexion ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
 $connexion ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}


sachant que connexionBDD.php a pour code:
<?php
$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'maBDDD';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';

try {
  $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd . ';charset=utf8', $PARAM_utilisateur, $PARAM_mot_passe);
  // Activation des erreurs PDO
  $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
  $connexion->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
  echo 'Erreur : ' . $e->getMessage() . '<br />';
  echo 'N° : ' . $e->getCode();
}
?>


Je ne comprend pas mais je teste quand même (les 12 fichiers ont maintenant le code ci-dessus après <?php)...

Si je fais cela et que je clique en localhost sur fichier-de-depart.php, j'ai immédiatement l'erreur:
Notice: session_start(): A session had already been started - ignoring in D:\wamp64\www\xxxxxxxx\securite.php on line 8
Call Stack
# Time Memory Function Location
1 0.0000 406288 {main}( ) ...\fichier-de-depart.php:0
2 0.0095 465192 include( 'D:\wamp64\www\xxxxxxxx\membre\fichier-de-destination.php' ) ...\platform-members.php:107
3 0.0095 465544 require_once( 'D:\wamp64\www\xxxxxxxx\securite.php' ) ...\fichier-de-destination.php:1
4 0.0095 465544 session_start ( ) ...\securite.php:8

( ! ) Warning: Cannot modify header information - headers already sent by (output started at D:\wamp64\www\xxxxxxxx\securite.php:8) in D:\wamp64\www\xxxxxxxx\securite.php on line 61
Call Stack
# Time Memory Function Location
1 0.0000 406288 {main}( ) ...\fichier-de-depart.php:0
2 0.0095 465192 include( 'D:\wamp64\www\xxxxxxxx\membre\fichier-de-destination.php' ) ...\fichier-de-depart.php:107
3 0.0095 465544 require_once( 'D:\wamp64\www\xxxxxxxx\securite.php' ) ...\fichier-de-destination.php:1
4 0.0457 465704 header ( ) ...\securite.php:61

Note: c'est la même erreur qui vient si dans le code de connexionBDD.php, j'enlève la partie try {etc.}

Il fallait sans doute faire autre chose?

(humour : oui, je dois avoir un problème d'interface cerveau-codage... à moins que ce soit ce satané corona)

Cordialement et merci,

jh_kd
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
22 janv. 2021 à 11:00
oui,
bien entendu, il faut corriger les codes que je t'ai donné...
Ta connexion à ta bdd ne se nomme pas $dbh mais $connexion
try{
  $sth = $connexion->prepare($sql);
  $sth->execute();
  $row = $sth->fetch();
}catch(Exception $e){
  echo "ERREUR dans la requête <br>".$sql;
  echo "<br> ". $e->getMessage();
}


et non, je ne veux pas que tu mettes le code de connexion dans toutes tes pages... mais juste le require
require ("connexionBDD.php");


Require.. qu'il faut sur TOUTES les PAGES ( à moins qu'elles ne soit en INCLUDE dans ta page de départ )
Mais comme tu m'as dit qu'elles sont toutes accessibles individuellement ... c'est qu'il faut bien la connexion sur CHAQUE page ...
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
23 janv. 2021 à 10:35
Bonjour,

J'ai fait toutes les corrections.
Maintenant en localhost si je clique sur:

page-de-depart.php, je passe d'emblée à login.php, et j'ai mes 3 options qui s'affichent (sign in, sign up, reset pW) et par exemple si pour sign in je tape mes ID-PW (valides, de la table MySql) ou sur sign up ou sur resetPW, cela ne fait rien du tout, je reste sur la page login.php

securite.php, je passe d'emblée à login.php

compliance.php, j'ai des erreurs minimes seulement:
Notice: Undefined index: accept in D:\wamp64\xxxxxxxxxx\compliance.php on line 21
Notice: Undefined index: code in D:\wamp64\xxxxxxxxxx\compliance.php on line 43
et les lignes 21 et 43 sont respectivement:
if ($_POST['accept'] == "Sign") {
$sql = "SELECT * FROM membersbase WHERE code = '".$_GET['code']."'";
(a parte dans phpmyadmin la requête ci-dessus donne une erreur #1064 - Erreur de syntaxe près de 'code']."' LIMIT 0, 25' à la ligne 1,
mais je ne suis pas sûr que je puisse tester avec un get)

check_user.php, j'ai des erreurs minimes et une erreur fatale:
Fatal error: Uncaught Error: Call to a member function prepare() on null in D:\wamp64\xxxxxxxxxx\check_user.php on line 11
( ! ) Error: Call to a member function prepare() on null in D:\wamp64\xxxxxxxxxx\check_user.php on line 11
la ligne 11 est:
$sth = $connexion->prepare($sql);
et la requête sql au-dessus est
$sql = "SELECT * FROM membersbase WHERE user LIKE '".trim($_POST['user'])."' AND active = '1'";
comme indiqué dans un post d'avant cette requête est celle initiale... avec phpmyadmin je l'avais corrigée (pour qu'elle marche) en
$sql = "SELECT * FROM membersbase WHERE user LIKE '.trim($_POST["user"]).' AND active = '1'";
Mais alors dans localhost, j'ai un erreur de parse:
Parse error: syntax error, unexpected '"', expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in D:\wamp64\xxxxxxxxxx\check_user.php on line 6 (qui est la requête en question)

form_registration.php, pas d'erreur mais pas de changement: le formulaire s'arrête à country (= il ne sait pas accrocher la table countryform)
pourtant dans phpmyadmin la requête pour la liste déroulante des pays avec
SELECT country_full_english FROM countryform ORDER BY country_full_english
fonctionne bien.

form_conditions.php, j'ai juste une erreur minime :
Notice: Undefined index: code in D:\wamp64\xxxxxxxxxx\form_conditions.php on line 19 Call Stack #TimeMemoryFunctionLocation 10.0004407416{main}( )...\form_conditions.php:0 ">
la ligne 19 est:
<input type="hidden" name="code" value="<?php echo $_GET['code']; ?>">
Si je coche les 3 case et clique sur "confirm", il ne se passe rien

validation_inscription.php, j'ai plein d'erreurs listées ci-dessous une par une suivi du code de la ligne concernée et à proximité:
( ! ) Notice: Undefined index: registration in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 25
Call Stack
# Time Memory Function Location
1 0.0012 407856 {main}( ) ...\validation_inscription.php:0
( ! ) Warning: Invalid argument supplied for foreach() in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 25
Call Stack
# Time Memory Function Location
1 0.0012 407856 {main}( ) ...\validation_inscription.php:0
// Trim all values and save in session
foreach ($_POST['registration'] as $variable => $value) {
$_SESSION['registration'][$variable] = trim($value);
}
pour l'erreur: Invalid argument supplied for foreach, j'ai cherché sur le web et je trouve dans https://thisinterestsme.com/invalid-argument-supplied-for-foreach/
The error is caused when the variable that foreach is attempting to iterate over is not an array
je ne vois pas le problème!

( ! ) Notice: Undefined variable: _SESSION in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 30
Call Stack
# Time Memory Function Location
1 0.0012 407856 {main}( ) ...\validation_inscription.php:0
// First Name
if (strlen($_SESSION['registration']['first_name']) < 2) {
$_SESSION['message'] = "First Name too short<br>";
}
( ! ) Notice: Undefined index: registration in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 35
Call Stack
# Time Memory Function Location
1 0.0012 407856 {main}( ) ...\validation_inscription.php:0
// Last Name
if (strlen($_SESSION['registration']['last_name']) < 2) {
$_SESSION['message'] .= "Last Name too short<br>";
}
( ! ) Notice: Undefined index: registration in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 40
Call Stack
# Time Memory Function Location
1 0.0012 407856 {main}( ) ...\validation_inscription.php:0
// check E-mail for registration
if (!filter_var($_SESSION['registration']['email_regis'], FILTER_VALIDATE_EMAIL)) {
$_SESSION['message'] .= "Invalid registration e-mail<br>";
}
( ! ) Notice: Undefined index: registration in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 45
Call Stack
# Time Memory Function Location
1 0.0012 407856 {main}( ) ...\validation_inscription.php:0
// E-mail for registration already used
$sql = "SELECT COUNT(1) FROM membersbase WHERE email_regis LIKE '".strtolower($_SESSION['registration']['email_regis'])."'";
$number = $pdo->query($sql)->fetchColumn();
if ($number == 1) {
$_SESSION['message'] .= "E-mail registration already used<br>";
}
( ! ) Notice: Undefined variable: pdo in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 46
Call Stack
# Time Memory Function Location
1 0.0012 407856 {main}( ) ...\validation_inscription.php:0
( ! ) Fatal error: Uncaught Error: Call to a member function query() on null in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 46
( ! ) Error: Call to a member function query() on null in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 46
Call Stack
# Time Memory Function Location
1 0.0012 407856 {main}( ) ...\validation_inscription.php:0
ligne 46:
$number = $pdo->query($sql)->fetchColumn();
là c'est encore une erreur "on null"

pour reset_password.php, j'ai 2 petites erreurs (undefined) et le texte suivant s'affiche:
Member not active
ce qui montre que l'on se trouve dans la partie suivante du code, par défaut:
if ($row['active'] == 2)

pour renew_password.php, j'ai 2 petites erreurs (undefined) et une erreur fatale
Fatal error: Uncaught Error: Call to a member function prepare() on null in D:\wamp64\xxxxxxxxxx\renew_password.php on line 9
( ! ) Error: Call to a member function prepare() on null in D:\wamp64\xxxxxxxxxx\renew_password.php on line 9
Call Stack
# Time Memory Function Location
1 0.0007 407536 {main}( ) ...\renew_password.php:0
la ligne 9 est:
$sth = $connexion->prepare($sql);
la requête sql visée est au dessus:
$email_user = trim(strtolower($_POST['email']));
$sql = "SELECT * FROM membersbase WHERE email_corresp LIKE '".$email_user."' AND active = '1'";
je l'ai testée dans phpmyadmin: elle fonctionne mais retourne un résultat nul:
MySQL a retourné un résultat vide (c'est à dire aucune ligne). (traitement en 0,0015 seconde(s).)
(mais email_user est défini par un $_post)

pour save_new_email.php, j'ai 2 petites erreurs (undefined) et le texte suivant s'affiche:
Email invalid
le code est dans la branche else:
echo "Email ".$new_email." invalid";

pour save_new_email.php, j'ai 2 petites erreurs (undefined) et le texte suivant s'affiche:
New password is invalid. Its length must be between 7 and 16 characters
le code est dans la branche else:
c'est un echo simple!

De tout ceci, je vois seulement mais je me trompe sans doute:
-l'absence d'accrochage de la BDD
-des variables qui ne sont pas définies (ou des index)

Je tente de mettre tous les fichiers concernés sur Internet via filezilla pour voir les erreurs:

si je clique sur http://www.xxxx.org/page-de-depart.php, il reste sur la page page-de-depart.php avec les 3 options (sign in, sign uo et reset PW) mais en plus en dessous il ajoute la page login_failed.php (comme un include)
si je tape mes ID/PW, alors j'ai l'erreur:
Warning: Cannot modify header information - headers already sent by (output started at /homepages/1/d31515812/htdocs/xxxxxx/headermysql.php:1) in /homepages/1/d31515812/htdocs/xxxxxx/check_user.php on line 44
et la ligne 44 de check_user.php est:
header("Location: ".$_SERVER['PHP_SELF']);

si je clique sur http://www.xxxx.org/login.php, j'ai seulement la page avec les 3 options et si je tape dans sign in mes ID et PW il reste inactif (mais il enregistre mon 'passage' dans les log-access txt!)

si je clique sur http://www.xxxx.org/form_registration.php, le formulaire s'arrête à country comme dans localhost, incompréhensible


Voilà, j'espère que cela peut t'aider.

Bon WE!

Bien cordialement,

jh_kd
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
23 janv. 2021 à 11:08
On va prendre les problèmes les uns après les autres.
Sinon on ne va pas s'en sortir.

Donc, première chose à corriger ... les undefined index...

Pour ça, il faut éviter d'utiliser directement les variables provenant des super globales ( $_POST, $_GET ... ) directement...
Il faut, récupérer PROPREMENT les variables AVANT de les utiliser.

Par exemple
Fichier validation_inscription.php,
Remplacer :
foreach ($_POST['registration'] as $variable => $value) {
$_SESSION['registration'][$variable] = trim($value);
}


//On récupère proprement la variable AVANT de l'utiliser
$registration = !empty($_POST['registration']) ? $_POST['registration'] : NULL;

//on vérifie qu'elle n'est pas null avant de l'utiliser dans une boucle
if($registration ){
  foreach ($registration as $variable => $value) {
     $_SESSION['registration'][$variable] = trim($value);
   }
}


ou encore

compliance.php, j'ai des erreurs minimes seulement:
Notice: Undefined index: accept in D:\wamp64\xxxxxxxxxx\compliance.php on line 21
Notice: Undefined index: code in D:\wamp64\xxxxxxxxxx\compliance.php on line 43
et les lignes 21 et 43 sont respectivement:
if ($_POST['accept'] == "Sign") {
$sql = "SELECT * FROM membersbase WHERE code = '".$_GET['code']."'";

Code à remplacer par :
$accept = !empty($_POST['accept']) ? $_POST['accept'] : NULL;
if ($accept == "Sign") {
  $sql = "SELECT * FROM membersbase WHERE code = '".$accept."'";

D'ailleurs, pour ce genre de requête.. il serait préférable de passer par des requêtes préparées...

$sql = "SELECT * FROM membersbase WHERE code = :accept ";
$datas = array(':accept '=>$accept);
try{
  $sth = $connexion->prepare($sql);
  $sth->execute($datas);
  $row = $sth->fetch();
}catch(Exception $e){
  echo "ERREUR dans la requête <br>".$sql;
  echo "<br> ". $e->getMessage();
}


Pour le message
Undefined variable: _SESSION in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 30

Cela semble indiquer que tu n'as pas de
 session_start(); 
au début du fichier

Pour le message
Notice: Undefined variable: pdo in D:\wamp64\xxxxxxxxxx\validation_inscription.php on line 46

La variable de connexion à ta bdd n'est pas, $pdo .. mais $connexion

Et bien entendu.. il faut bien avoir chargé la connexion à ta bdd dans tous tes fichiers...

Pour le message du genre

Warning: Cannot modify header information - headers already sent by

Cela indique que tu essais d'utiliser une fonction
 header( ... 
(comme une redirection par exemple...) alors que tu as déjà généré de l'affichage ( soit du code html, soit les éventuels messages d'erreurs que tu rencontres..)
Donc commence par corriger les erreurs ( y compris les undefined ) .. puis si le souci persiste, assure toi que tu n'as aucun code html ou echo AVANT l'instruction header.


Je t'invite fortement à lire ( et à appliquer) ce qui est indiqué ici :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
et là
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Ainsi qu'un tuto sur les requêtes préarées
https://www.pierre-giraud.com/php-mysql-apprendre-coder-cours/requete-preparee/


Je te rappelle également que te j'ai donné un exemple pour utiliser des CLASS
cela rend le code plus propre et plus facile à maintenir ...
Il serait bien de te servir de cet exemple pour créer, si besoin, des class qui se chargement de faire les requêtes au lieu de les noyer un peu partout dans ton code php
Pour rappel, l'exemple était à cette réponse : https://forums.commentcamarche.net/forum/affich-37037912-un-probleme-possible-dans-une-requete-mysql-pdo#17


Et sincèrement ... un code aussi bordélique que celui que tu as actuellement mériterait d'être totalement réécrit au lieu d'essayer de mettre des bouts de ficèles pour le réparer.
Surtout si un jour tu dois le faire évoluer.. tu vas y perdre tes cheveux.

Pur ma part, je continuerai à t'aider que lorsque tu auras fait ce travail de réécriture...
0
jh_kd Messages postés 41 Date d'inscription lundi 11 janvier 2021 Statut Membre Dernière intervention 2 mars 2024
Modifié le 23 janv. 2021 à 19:14
Bonjour,

Tu as raison. C'était une erreur de tester tous les fichiers à chaque fois (à l'origine dans les fichiers il n'y avait qu'une seule fois le require connexionBDD.php et $connexion = new PDO etc., et j'avais compris que le processus avait été intégré par le codeur à partir de fichier-de-depart.php).

Donc je ne vais traiter qu'un seul fichier!

Mais avant je voudrais te montrer le code qui marche chez moi pour "accrocher" la base de données (les données scientifiques dans d'autres tables, pas celle des membres!).
Un exemple (qui marche):

<?php
 error_reporting(E_ALL);
    require ("connexionBDD.php");
    try {
        $connexion = 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();
    }

echo //etc.


puis plus loin la requête proprement dite:
$requete = $connexion->prepare("SELECT Used_names, Correct_names, Current_trinom_name, Current_status FROM taxabase1 left outer join taxabase2 on (taxabase1.Rk_Hist = taxabase2.Rk_Hist) left outer join taxabase3 on (taxabase3.Rk_Hist = taxabase2.Rk_Hist) WHERE taxabase1.Rk_Hist and Used_names is not null and trim(Used_names) != '' ORDER BY Used_names, Correct_names");
 $requete->bindParam(':Rk_Hist', $Rk_Hist, PDO::PARAM_INT);
 
    $requete->execute();
    $result[1] = $requete->fetchAll();
 $plan7 = '';
 $tabUsed_by_Current_trinom_name = array();
 
 foreach  ($result[1] as $row) {//etc.


Comme tu le vois le codeur "lointain" (ou "bordélique"... private joke) ne traduit peut-être pas bien ses propres requêtes sqli en PDO.

Qu'en penses-tu?

par exemple dans validation_inscription.php, j'ai avant tes dernières corrections seulement:

require ("connexionBDD.php");
//puis plus loin, la première requête qui plante
$sql = "SELECT COUNT(1) FROM membersbase WHERE email_regis LIKE '".strtolower($_SESSION['registration']['email_regis'])."'";


et alors j'ai plein de petites erreurs et l'erreur fatale
Fatal error: Uncaught Error: Call to a member function query() on null in D:\wamp64\xxxxxx\validation_inscription.php on line 46
( ! ) Error: Call to a member function query() on null in D:\wamp64\xxxxxx\validation_inscription.php on line 46
autour de la ligne 46:
// E-mail for registration already used
$sql = "SELECT COUNT(1) FROM membersbase WHERE email_regis LIKE '".strtolower($_SESSION['registration']['email_regis'])."'";
$number = $pdo->query($sql)->fetchColumn();
if ($number == 1) {
 $_SESSION['message'] .= "E-mail registration already used<br>";
}


Tu vois, la façon de coder la requête est bien différente de celle qui marche chez moi et qui accroche la BDD.

Et si j'ajoute le code avec session start et la connexion:
session_start();
error_reporting(E_ALL);
require ("connexionBDD.php");

try {
  $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
   // Activation des erreurs PDO
  $connexion ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
  $connexion ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}


alors l'erreur fatale est la même, pour le même code de requête.
j'ai peut-être tort d'insister mais si on n'accroche pas la BDD cela ne viendrait-il pas de la requête du codeur qui l'a adaptée de son sqli???

Bien cordialement,

jh_kd

PS: je suis chauve en grande partie depuis très jeune et, je parie, bien plus vieux que toi!
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
23 janv. 2021 à 19:47
Plus vieux c'est possible... mais beaucoup ça l'est moins.

Afin d'alleger le code de tes pages, tel que je te l'ai déjà indiqué dans mes premières réponses.... il faudrait que ton fichier connexionBDD.php contienne la connexion à la bdd.

donc
<?php
//Fichier : connexionBDD.php
//---------------------------------------//
$PARAM_hote = 'localhost';
$PARAM_port = '3306';
$PARAM_nom_bd = 'maBDDD';
$PARAM_utilisateur = 'root';
$PARAM_mot_passe = '';

try {
  $connexion = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
   // Activation des erreurs PDO
  $connexion ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
  $connexion ->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}

En faisant cela, dans tes différentes pages, tu n'auras besoin que de la ligne
require_once "connexionBDD.php";


Tu remarqueras aussi que le nom de la variable qui contient la connexion à ta bdd c'est
$connexion

De ce fait, lorsque tu dois faire des requêtes, c'est bien cette variable qu'il faut utiliser ( et non pas $pdo !! )

Donc :
// récupération PROPRE de la variable AVANT de l'utiliser
$email_regis = !empty($_SESSION['registration']['email_regis']) ? strtolower($_SESSION['registration']['email_regis']) : NULL;

// E-mail for registration already used
$sql = "SELECT COUNT(1) FROM membersbase WHERE email_regis = '$email_regis' ";
$number = $pdo->query($sql)->fetchColumn();


Qu'il serait préférable d'utiliser avec une requête préparée :

// récupération PROPRE de la variable AVANT de l'utiliser
$email_regis = !empty($_SESSION['registration']['email_regis']) ? strtolower($_SESSION['registration']['email_regis']) : NULL;

//préparation de la requête et des variables
 $sql = "SELECT COUNT(*) FROM membersbase WHERE email_regis = :email_regis";
 $datas = array(':email_regis'=>$email_regis);
//Execution de la requete
try{
  $requete = $connexion->prepare($sql) ;
  $requete->execute($datas) ;
  $number = $requete->fetchColumn();
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($datas);
}
0