IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Débogage en ligne


Sujet :

Langage PHP

  1. #21
    Invité
    Invité(e)
    Par défaut
    1- Peux-tu nous montrer les codes complets des pages concernées ?
    • parentPage.php
    • displMain.php
    • editPers.php

    Sinon, envoie-les moi en MP.

    2- "Modifier" :

    2a- les formulaires multi-pages se gérent normalement avec des SESSION.
    Ca permet de revenir en arrière (si on s'est trompé par exemple), sans perdre d'infos en route.

    2b- comme je te l'ai déjà indiqué, l'id doit être inclus dans un <input type="hidden" /> dans chaque formulaire (à chaque étape)
    En le comparant à celui enregistré en SESSION, on fait une double vérification (ça empêche de le modifier "a mano" dans l'URL !)
    Dernière modification par Invité ; 04/07/2018 à 15h49.

  2. #22
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Point 2:
    Le bogue du formulaire multipage est réglé. Il a bien toujours été traité par des sessions, mais j'ai complètement réécrit le code. L'id n'est pas caché (car il peut être utile à l'utilisateur) mais en readonly. J'ai ajouté un autre contrôle qui vérifie que l'id appartient au groupe utilisateur. Il n'apparaît pas dans l'url.
    Ce point est donc réglé.

    Point 1:
    Je t'envoie les fichiers en MP.

    EDIT:
    Point 3:
    La mise à jour des listes d'options Récents et Favoris fonctionnent en local mais ne fonctionnent pas non plus en ligne.
    EDIT 2:
    Je remarque que c'est souvent (toujours ?) les redirections avec header('Location...') qui fonctionnent en local mais pas pas en ligne. J'ai beau chercher et faire des tests ou espionner avec des va_dump ou lire des forums, je ne vois vraiment pas pourquoi.

  3. #23
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    bien reçu.

    1- Tes pages comportent encore des grosses failles...
    ex. :
    • sur la page "Affichage individuel" (parentPage.php?childPageKey=2)
    • je clique sur un des liens : Ses enfants / Ses parents / Ses conjoints / Complément
    • ex. "Ses enfants" (parentPage.php?childPageKey=2&insert=0&idMain=1)


    Il suffit que je modifie l'idMain dans l'URL pour afficher une AUTRE FICHE !
    • parentPage.php?childPageKey=2&insert=0&idMain=10
    • parentPage.php?childPageKey=2&insert=0&idMain=11
    • ...

    Aucune sécurité !


    2- Le bon usage des SESSION.

    2a- $_SESSION['childPageKey'] (dans le fichier ParentPage.php, ligne 44) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['childPageKey'] = filter_input(INPUT_GET, 'childPageKey', FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>0, 'max_range'=>count(CHILDS)]]);
    Là, on attend systématiquement que 'childPageKey' soit passé dans l'URL.
    Quel intérêt alors de le mettre dans une SESSION ?
    Autant le mettre dans une variable simple : $childPageKey !

    Si on utilise une SESSION, c'est justement pour NE PAS avoir à se le trimbaler dans tous les liens/URL !

    Le bon usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // récupération childPageKey
    if( !empty($_GET['childPageKey']) ) // passé dans l URL ?
    { 
    	$_SESSION['childPageKey'] = filter_input(INPUT_GET, 'childPageKey', FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>0, 'max_range'=>count(CHILDS)]]);
    }
    if( empty($_SESSION['childPageKey']) || !is_numeric($_SESSION['childPageKey']) || $_SESSION['childPageKey']>count(CHILDS) )
    { 
    	$_SESSION['childPageKey'] = 0; 
    }
    // (sinon, $_SESSION['childPageKey'] est inchangé)
    • On ne mettra alors 'childPageKey' dans un lien/URL QUE SI ON CHANGE DE PAGE.


    2b- IDEM pour $idMain (dans le fichier displMain.php, ligne 202) :
    // 1) Est-ce qu'un identifiant a été envoyé dans l'url ?
    $idMain = filter_input(INPUT_GET, 'idMain', FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>0]]);
    Là aussi, 'idMain' DOIT être passer par l'URL !

    Le bon usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // récupération idMain
    if( !empty($_GET['idMain']) ) // passé dans l URL ?
    { 
    	$_SESSION['idMain'] = filter_input(INPUT_GET, 'idMain', FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>0]]);
    } elseif( !empty($_POST['idMain']) ) // passé en POST (via un formulaire,...) ?
    { 
    	$_SESSION['idMain'] = filter_input(INPUT_POST, 'idMain', FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>0]]);
    }
    if( empty($_SESSION['idMain']) || !is_numeric($_SESSION['idMain']) || $_SESSION['idMain']<0 )
    { 
    	$_SESSION['idMain'] = 0; 
    }
    // (sinon, $_SESSION['idMain'] est inchangé)
    $idMain = $_SESSION['idMain'];
    • On ne mettra alors 'idMain' dans un lien/URL QUE SI ON CHANGE DE PERSONNE.


    2c- Par conséquent, pour les liens : Ses enfants / Ses parents / Ses conjoints / Complément (dans le fichier displMain.php, lignes 463-466) :
    au lieu d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			<a href="<?= THIS ?>&amp;insert=0&amp;idMain=<?= $idMain ?>"><?= AFF_NAV_1; ?></a> /
    			<a href="<?= THIS ?>&amp;insert=1&amp;idMain=<?= $idMain ?>"><?= AFF_NAV_2; ?></a> /
    			<a href="<?= THIS ?>&amp;insert=2&amp;idMain=<?= $idMain ?>"><?= AFF_NAV_3; ?></a> /
    			<a href="<?= THIS ?>&amp;insert=3&amp;idMain=<?= $idMain ?>"><?= AFF_NAV_4; ?></a>
    il suffit de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			<a href="?insert=0"><?= AFF_NAV_1; ?></a> /
    			<a href="?insert=1"><?= AFF_NAV_2; ?></a> /
    			<a href="?insert=2"><?= AFF_NAV_3; ?></a> /
    			<a href="?insert=3"><?= AFF_NAV_4; ?></a>
    EN EFFET :
    • on reste sur la MEME page ($_SESSION['childPageKey'] ne change pas)
    • on garde le MEME idMain ($_SESSION['idMain'] ne change pas)


    2d - CONCLUSION :
    dans TOUTE la partie "Affichage individuel",
    • tu n'as pas besoin de trimbaler 'idMain' dans tous tes liens/URL (sauf si tu changes de personne, évidemment) !
    • Ni 'childPageKey' (sauf si tu changes de page, évidemment)



    3- une modification à faire (dans le fichier ParentPage.php, lignes 53-55) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // si on n est pas/plus dans "Affichage individuel - EDITER"
    if ($_SESSION['childPageKey'] != 3) {
    	unset($_SESSION['editPerson']);
    }
    // si on n est pas/plus dans la rubrique "Affichage individuel" (childPageKey de 2 à 8)
    if ( !in_array($_SESSION['childPageKey'], range(2,8)) {
    	unset($_SESSION['idMain']); // on efface idMain
    }
    Il faudra aussi faire pas mal de ménage dans le reste du code...

    4- On peut lire ça en page d'accueil :
    Une seule personne entre les informations mais toute la famille en profite. Grâce aux mots de passe, seule votre famille y a accès.
    Permet-moi d'en douter :
    si on peut changer FACILEMENT idMain dans l'URL, on a accès A TOUTES les FICHES, de n'importe qui, de n'importe quelle généalogie !
    Je me trompe ou pas ?
    Dernière modification par Invité ; 05/07/2018 à 20h39.

  4. #24
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par moimp Voir le message
    EDIT 2:
    Je remarque que c'est souvent (toujours ?) les redirections avec header('Location...') qui fonctionnent en local mais pas pas en ligne...
    Peux-tu être plus précis ?

    Ca ne marche pas :
    • pour QUELLES redirections précisément (quelles URLs dans le header location) ?
    • Vers quelles pages (nom du fichier ciblé) ?



    Ici, tu définis les noms des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    define('CHILDS', [
    	0=>'home.php',
    	1=>'noData.php',
    	2=>'displMain.php',
    	3=>'editPers.php',
    	4=>'delPers.php',
    	5=>'editBiog.php',
    	6=>'uplPicture.php',
    	7=>'editMarriage.php',
    	8=>'delMarriage.php',
    	9=>'treeDown.php',
    	10=>'editHome.php',
    ]);
    AS-TU vérifié que les fichiers portent RÉELLEMENT et PHYSIQUEMENT ces noms-là (EN VÉRIFIANT BIEN les majuscules/minuscules) ??
    -> regarde dans le DOSSIER !

  5. #25
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Dans un premier temps, un ENORME merci.
    Dans un deuxième temps, je me mets au boulot.
    Ca ne marche pas :
    pour QUELLES redirections précisément (quelles URLs dans le header location) ?
    Vers quelles pages (nom du fichier ciblé) ?
    Dans displMain.php, j'ai rencontré le défaut : lignes 284, 290 et 312. Chaque fois on renvoie sur parentPage.php avec childPageKey = 2, c'est à dire displMain.php.

  6. #26
    Invité
    Invité(e)
    Par défaut
    SI ON CHANGE DE PERSONNE : (c'est le cas notamment dans les liens sur les clefs des "enfants", "parents",.... !)

    On ne mettra alors 'idMain' dans un lien/URL QUE SI ON CHANGE DE PERSONNE.
    En fait, on peut très bien NE JAMAIS mettre 'idMain' dans l'URL !

    -> on peut/va/doit récupérer via $_POST !!

    C'est pour ça que dans le code que j'ai proposé, j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // récupération idMain
    ...
    } elseif( !empty($_POST['idMain']) ) // passé en POST (via un formulaire,...) ?
    { 
    	$_SESSION['idMain'] = filter_input(INPUT_POST, 'idMain', FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>0]]);
    }


    il faut alors remplacer les liens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="parentPage.php?childPageKey=2&amp?idMain=xxxx">xxxx</a>
    par des bouton/formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <form method="post" action="" style="display:inline-block;">
      <input type="hidden" name="idMain" value="xxxx" />
      <button type="submit">xxxx</button>
    </form>
    Ainsi, idMain n'apparait pas dans l'URL.

    N.B. action="" : on reste sur la même page.


    Bon courage...

  7. #27
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Citation Envoyé par jreaux62 Voir le message

    1- Tes pages comportent encore des grosses failles...
    ...
    Il suffit que je modifie l'idMain dans l'URL pour afficher une AUTRE FICHE !
    ...
    Aucune sécurité !
    Vrai si l'idMain appartient à la famille abonnée, auquel cas, c'est sans importance. Sinon une fonction 'checkIfIdIsInAbo' (ligne 222) permet de rediriger vers la page d'accueil, sans afficher la fiche.
    De plus, je trouve intéressant de conserver l'affichage des id pour permettre à l'utilisateur de vérifier qu'il s'agit de la bonne personne, notamment dans les cas d'homonymie.

    Pour le reste, je réécris mon code en tenant compte de tes remarques.

  8. #28
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    Bonjour,

    J'ai fini (provisoirement) de modifier mon code d'après tes recommandations.
    Il me reste cependant au moins deux difficultés:
    1)
    Les liens relatifs ne fonctionnent pas. Je suis obligé d'écrire les liens comme ceci:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			<a href="parentPage.php?insert=0"><?= AFF_NAV_1; ?></a> /
    			<a href="parentPage.php?insert=1"><?= AFF_NAV_2; ?></a> /
    			<a href="parentPage.php?insert=2"><?= AFF_NAV_3; ?></a> /
    			<a href="parentPage.php?insert=3"><?= AFF_NAV_4; ?></a>
    2)
    Les redirections par header location ne sont pas prises en compte sur le site distant comme dans cet exemple:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (empty(getDefaultPersonId($abo))) {
    	header('Location: '.URL_SITE.'parentPage.php?childPageKey=1');
    	var_dump(__line__);exit;
    }
    Dans ce cas, la redirection ne se fait pas et le numéro de ligne s'affiche. C'est le problème que j'ai depuis le début.

    Ajout)
    Dans le cas de l'entrée sur le site où aucun idMain n'est défini j'ai repris la partie correspondante de mon ancien code comme ceci:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    // Si $_SESSION['idMain'] est vide, recherche d'un id valide
    if( empty($_SESSION['idMain']) || !is_numeric($_SESSION['idMain']) || $_SESSION['idMain']<0 )
    { 
    	do {
    		// Recherche d'un id valide
    		// Cas n°1 : Récupération de l'id le plus récent, si la liste 'récents' existe
    		if (isset($arrLatest)) {
    			foreach ($arrLatest as $key=>$id) {
    				if (idExists($id)) {
    					$idMain = $id;
    					goto end;
    				}
    			}
    		}
    		// Cas n°2 : A défaut, sélection de la première personne trouvée en bdd pour cette généalogie
    		elseif ($defaultPerson = getDefaultPersonId($_SESSION['user']['id_abo'])) {
    			$idMain = (int) $defaultPerson->id;
    		}
     
    		end:
    		// On vérifie que la personne fait partie de l'abonné
    		if (empty(checkIfIdIsInAbo($idMain))) {
    			$idMain = 0;
    		}
    		// En cas d'échec complet redirection sur la page d'accueil
    		if (empty($idMain)) {
    			header('Location: '.URL_SITE.DEFAULT_PAGE);
    			var_dump(__line__);exit;
    			exit;
    		}
     
    		// Collecte des données de la personne à afficher
    		$mainPerson = getPerson($idMain);
    		// La personne n'existe pas (ou plus) en bdd
    		if (empty($mainPerson)) {
    			unset($arrLatest[array_search($idMain, $arrLatest)]);
    			$arrLatest = array_unique($arrLatest);
    			$arrLatest = array_values($arrLatest);
    			$arrCookies = [$arrLatest, $arrFavourites];
    			setcookie($abo, serialize($arrCookies), COOKIE_HOLDTIME);
    		}
    	} while (empty($mainPerson));
    	$_SESSION['idMain'] = $idMain;
    }

  9. #29
    Invité
    Invité(e)
    Par défaut
    1-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (empty(getDefaultPersonId($abo))) {
    	header('Location: '.URL_SITE.'parentPage.php?childPageKey=1');
    	var_dump(__line__);exit;
    }
    On peut remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (empty(getDefaultPersonId($abo))) {
    	$_SESSION['childPageKey'] = 1;
    	header('Location: '.URL_SITE.'parentPage.php');
    	exit;
    }
    Cela dit, le résultat devrait être le même.


    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		// Cas n° : ...
    ....
    				$idMain = $id;
    ...
    		// Cas n°2 : ...
    ....
    			$idMain = (int) $defaultPerson->id;
    NON : c'est $_SESSION['idMain'] qu'il faut définir !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		// Cas n° : ...
    ....
    				$_SESSION['idMain'] = $id;
    				$idMain = $_SESSION['idMain'];
    ...
    		// Cas n°2 : ...
    ....
    				$_SESSION['idMain'] = (int) $defaultPerson->id;
    				$idMain = $_SESSION['idMain'];
    ...

  10. #30
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 579
    Points : 804
    Points
    804
    Par défaut
    1-
    J'ai réglé le problème des redirections avec header location après une recherche sur le net. Il suffit d'ajouter ob_start et ça marche. Il faut encore que je vois où et quand ajouter un ob_end_fush.
    Ta solution en ajoutant la variable de session n'avait rien changé.

    2- Avant de lire ton dernier post, j'ai d'abord voulu travailler sur la variable de session comme tu le préconises. Mais, je vérifie d'abord si la personne n'aurait pas été effacée entre temps avant de positionner cette variable. C'est la raison de la boucle do-while et de l'affectation ultérieure de la variable de session. Ce n'est peut-être pas la bonne solution, mais il faut que je vérifie si la personne et son id sont bien présentes en base de données.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/02/2012, 10h43
  2. Réponses: 3
    Dernier message: 03/06/2008, 08h50
  3. [Débogage Activé] Ignorer certaines lignes
    Par portu dans le forum EDI
    Réponses: 6
    Dernier message: 23/02/2006, 16h36
  4. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo