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. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut Débogage en ligne
    Bonjour,

    J'ai une application qui fonctionne parfaitement en local avec un hôte virtuel sur Wampserver version php 7.0.23.
    Une partie de cette application ne fonctionne pas en ligne chez 1&1. J'ai fait des essais avec php 7.0 et 7.2.
    L'application comprend une page ParentPage.php qui inclut alternativement une autre page parmi plusieurs possibles.
    La plupart des pages incluses s'affichent correctement, mais je n'arrive pas à afficher la page 3=>'editPers.php'.
    J'ai fait de nombreux essais d'affichage du numéro de page avec des var_dump, suivis ou non d'un exit.
    Chaque fois, le numéro de page reste à 2 et le contenu inclus est vide.
    Je ne sais plus comment faire pour trouver ce qui ne va pas.
    La seule chose certaine est que la page incluse à afficher (3=>'editPers.php') n'est pas appelée puisque son code commence par
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(__file__, __line__); exit;
    et que rien ne s'affiche.

    Vous pouvez observer ce qui se passe sur http://genealium.proginet.eu avec ademo comme identifiant et comme mot de passe.

    Code de la page parentPage.php
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    <?php
     
    // Portail Proginet
    // Application Genealium
    // Version 2.1
    // Page mère parentPage.php
     
    ##################################################################### SECTION TETE : PARAMETRAGE AUTORISATION ##########################################################
     
    require_once('libraries/defines.php');
    require_once(COMMON_HEAD_PHP); // Début commun aux pages mères
     
    if ( !isset($_SESSION['user'])) {
    	header('location: ' .  INDEX_PAGE);
    	exit;
    }
     
    $isIncluded = true;
     
    $clockData = array_merge(CLOCK_TEXTES, ['language'=>$language]);
     
    ##################################################################### Fin SECTION TETE : PARAMETRAGE AUTORISATION ######################################################
     
    ##################################################################### SECTION MODELE ###################################################################################
     
    ##################################################################### FIN section MODELE ###############################################################################
     
    ##################################################################### SECTION CONTROLE #################################################################################
     
    if (isset($_GET['childPageKey']))
    {
    	$_SESSION['childPageKey'] = (int) $_GET['childPageKey'];
    }
     
    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',
    ]);
     
    // Si la page est inexistante, sélection de la page par défaut
    if (! file_exists(CHILDS[$_SESSION['childPageKey']]))
    {
    	$_SESSION['childPageKey'] = 0;
    }
    // Effacement des variables de session inutiles
    $childPageFile = CHILDS[$_SESSION['childPageKey']];
    if ($_SESSION['childPageKey'] != 3) {
    	unset($_SESSION['editPerson']);
    }
    // Voir pour les autres variables de session
     
    ##################################################################### FIN section CONTROLE #############################################################################
     
    ##################################################################### SECTION VUE ######################################################################################
     
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8" />
    	<title><?= H_TITLE ?></title>
    	<meta name="keywords" content="<?= H_KEYWORDS ?>" />
    	<meta name="description" content="<?= H_DESCRIPTION ?>" />
    	<meta http-equiv="Pragma" content="no-cache" />
    	<meta http-equiv="Expires" content="-1" />
    	<base href="<?= URL_SITE ?>" />
     
    	<link rel="stylesheet" media="all" type="text/css" href="css/structure.css" /> <!-- Dimensions et positions -->
    	<link rel="stylesheet" media="screen" type="text/css" href="css/style0.css" /> <!-- Apparence -->
    	<!-- <link rel="stylesheet" media="print" type="text/css" href="css/print.css" /> --> <!-- Documents imprimés -->
    	<link rel="stylesheet" type="text/css" href="css/default_blue.css" /> <!-- Calendrier -->
    </head>
     
    <body>
    <!-- <?php var_dump($_SESSION['childPageKey'], '<br/><br/>', $childPageFile, '<br/><br/>'); ?> -->
     
    	<header>
    		<div id="headerCalendar">
    			<span id="calendarSpan"></span> <!-- Cette ligne sert à l'affichage de l'horloge -->
    		</div>
     
    		<h1><?= H1 ?><br /></h1>
     
    	</header>
     
    	<section id="main">
    		<div id="left">
    			<nav>
    				<?php require_once('includes/menuV.php') ?>
    			</nav>
    		</div>
    		<article id="right">
     
    			<?php include($childPageFile); ?>
     
    		</article>
    	</section>
     
    	<footer class="footer">
    		<br/>&nbsp;
    		<hr/>
    		* <?= FOOT_NOTE; ?>
    	</footer>
     
    	<script>
    		var clockData	= <?= json_encode($clockData) ?>;
    	</script>
    	<script src="<?= COMMON_CLOCK_JS ?>"></script>
    	<script src="<?= COMMON_COMMON_JS ?>"></script>
    	<?php
    	if (isset($jsFiles)) {
    		foreach ($jsFiles as $jsFile) {
    			echo "<script src='$jsFile'></script>";
    		}
    	}
    	?>
    </body>
     
    </html>
     
    <?php
     
    ##################################################################### FIN section VUE ##################################################################################

    EDIT: J'ajoute le code de la page displMain.php, car c'est à partir de cette page incluse dans parentPage.php que les liens ne fonctionnent pas (lignes 258, 265, 272). J'ai testé avec & ou &amp;. Si je recopie l'URL du code dans la barre d'adresse du navigateur ma page est appelée.
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    <?php
     
    // Portail Proginet
    // Application Genealium
    // Version 2.1
    // Affichage principal d'une personne
     
    ##################################################################### SECTION TETE : PARAMETRAGE AUTORISATION ##########################################################
     
    if (!isset($isIncluded)) {
    	header('location: ' .  INDEX_PAGE);
    	exit;
    }
     
    ##################################################################### Fin SECTION TETE : PARAMETRAGE AUTORISATION ######################################################
     
    ##################################################################### SECTION MODELE ###################################################################################
     
    connect();
     
    function getDefaultPersonId($idAbo) {
    	global $db;
     
    	$query = "
    		SELECT id
    		FROM dat_persons
    		WHERE id_abo=:id_abo
    		ORDER BY id
    		LIMIT 1
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id_abo', $_SESSION['user']['id_abo']);
    	$result->execute();
    	return $result->fetch();
    }
     
    function getPerson($id) {
    	global $db;
     
    	$dateFormat = LOCAL_DATE_FORMAT;
    	$query = "
    		SELECT id, gender, last_name, first_name, middle_name, DATE_FORMAT(birth_date, '$dateFormat') AS birth_date, birth_place,
    			DATE_FORMAT(christening_date, '$dateFormat') AS christening_date, DATE_FORMAT(death_date, '$dateFormat') AS death_date, death_place,
    			profession, comment, father_id, mother_id, birth_order
    		FROM dat_persons
    		WHERE id=:id
    		LIMIT 1
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id', $id);
    	$result->execute();
    	return $result->fetch();
    }
     
    function idExists($id) {
    	global $db;
     
    	$query = "
    		SELECT count(*) AS counter
    		FROM dat_persons
    		WHERE id=:id
    		LIMIT 1
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id', $id);
    	$result->execute();
    	return $result->fetch()->counter;
    }
     
    function getSearchData($criteria) {
    	global $db;
     
    	$criteriaEqual = $criteria;
    	$criteriaLike = "%$criteria%";
     
    	$dateFormat = LOCAL_DATE_FORMAT;
    	$query = "
    		SELECT id, first_name, last_name, DATE_FORMAT(birth_date, '$dateFormat') AS birthdate
    		FROM dat_persons
    		WHERE id_abo=:id_abo
    			AND (
    				id=:criteriaEqual
    				OR first_name LIKE :criteriaLike
    				OR last_name LIKE :criteriaLike
    				OR birth_date LIKE :criteriaLike
    				OR death_date LIKE :criteriaLike
    			)
    		ORDER BY last_name, first_name, birth_date
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id_abo', $_SESSION['user']['id_abo']);
    	$result->bindParam('criteriaEqual', $criteriaEqual);
    	$result->bindParam('criteriaLike', $criteriaLike);
    	$result->execute();
    	return $result->fetchAll();
    }
     
    function getOptionsContent($arrIds, $list) {
    	global $db;
     
    	$dateFormat = LOCAL_DATE_FORMAT;
    	$strIds	= implode(', ', $arrIds);
    	switch ($list) {
    		case 'latest':		$order = "ORDER BY FIELD(id, $strIds)"; break;
    		case 'favourites':	$order = "ORDER BY name"; break;
    	}
    	$query = "
    		SELECT id, CONCAT(COALESCE(last_name, ''), ' ', COALESCE(first_name, '')) AS name, DATE_FORMAT(birth_date, '$dateFormat') AS birthdate
    		FROM dat_persons
    		WHERE id_abo=:id_abo AND id IN($strIds)
    		$order
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id_abo', $_SESSION['user']['id_abo']);
    	$result->execute();
    	return $result->fetchAll();
    }
     
    ##################################################################### FIN section MODELE ###############################################################################
     
    ##################################################################### SECTION CONTROLE #################################################################################
     
    // .....................................................................
    // Code amélioré selon proposition de jreaux62 à https://www.developpez.net/forums/d1841533/php/langage/creation-d-liste-favoris-cookie/#post10179861
    // Génère les listes de cookies pour les listes d'options d'accès rapide
    // (Récents et favoris)
    function refreshCookies($list, $idMain, $max)
    {
    	$cook_array = ['latest','favourites']; // liste des noms de cookies
    	if( in_array($list, $cook_array) )
    	{
    		// ------------
    		// Lecture et décomposition du cookie
    		$cookieName = $_SESSION['user']['id_abo'];
    		$cookies	= ( !empty($_COOKIE[$cookieName]))? unserialize($_COOKIE[$cookieName]) : []; // array
    		foreach( $cook_array as $cook_name )
    		{
    			${$cook_name} = ( !empty($cookies[$cook_name]) )?	$cookies[$cook_name] : []; // array
    		}
    		// ------------
    		// Mise à jour de la liste $list
    		$tmp = ${$list};
    		if (empty($tmp)){
    			$tmp[0] = $idMain;
    		} else {
    			array_unshift($tmp, $idMain);
    			$tmp = array_unique($tmp);
    			foreach ($tmp as $key=>&$id)
    			{
    				if (!idExists($id)){ unset($tmp[$key]); }
    			}
    			if (count($tmp) >$max){ array_pop($tmp); }
    		}
    		$tmp = array_values($tmp); // Mise en ordre consécutifs des clefs numériques
    		${$list} = $tmp;
    		// ------------
    		// Enregistrement du cookie
    		$cookies_array = [];
    		foreach( $cook_array as $cook_name )
    		{
    			$cookies_array[$cook_name]	= ${$cook_name};
    		}
    		setcookie($cookieName, serialize($cookies_array), COOKIE_HOLDTIME);
    	}
    }
    // .....................................................................
     
     
    define('THIS', 'parentPage.php?childPageKey=2'); // Ceci permet de changer le nom du script parent
     
    // Effacement des variables de session
    if ($_SESSION['childPageKey'] != 3)
    	unset($_SESSION['editPerson']);
     
    $abo 	= $_SESSION['user']['id_abo'];
    if (isset($_COOKIE)) {
    	if (isset($_COOKIE[$abo])) {
    		$arrCookies		= unserialize($_COOKIE[$abo]);
    		if (isset($arrCookies['latest'])) {
    			$arrLatest		= $arrCookies['latest'];
    		}
    		if (isset($arrCookies['favourites'])) {
    			$arrFavourites	= $arrCookies['favourites'];
    		}
    	}
    }
     
    // Recherche de l'id de la personne à afficher
    $loop	= false;
    redo:
    $idMain = 0;
     
    if (isset($_GET['idMain'])) {
    	$idMain = $_GET['idMain'];
    }
    elseif (isset($arrLatest)) {
    	foreach ($arrLatest as $key=>$id) {
    		if (idExists($id)) {
    			$idMain = $id;
    			break;
    		}
    	}
    }
    elseif ($defaultPers = getDefaultPersonId($_SESSION['user']['id_abo'])) {
    	if ($defaultPers) {
    		$idMain = (int)$defaultPers->id;
    	}
    }
    elseif (empty(getDefaultPersonId($_SESSION['user']['id_abo']))) {
    	header('location: parentPage.php?childPageKey=1');
    	exit;
    }
    if (! (int) $idMain) {
    	header('location: '.DEFAULT_PAGE);
    	exit;
    }
     
    // Collecte des données de la personne à afficher
    $mainPerson = getPerson($idMain);
    // La personne n'existe pas (ou plus)
    if (empty($mainPerson)) {
    	unset($_GET['idMain']);
    	unset($arrLatest[array_search($idMain, $arrLatest)]);
    	$arrLatest = array_unique($arrLatest);
    	$arrLatest = array_values($arrLatest);
    	$arrCookies = [$arrLatest, $arrFavourites];
    	setcookie($abo, serialize($arrCookies), COOKIE_HOLDTIME);
    	if (!$loop) {
    		$loop = true;
    		goto redo;
    	}
    }
     
    // Mise à jour des récents
    refreshCookies('latest', $idMain, 15);
     
    // Gestion des encarts
    // Liste des encarts
    define('INSERTS', [
    	'children.php',
    	'parents.php',
    	'marriages.php',
    	'complement.php',
    ]);
    // Recherche de l'encart en mémoire
    if (isset($_GET['insert']))
    	$insertId = $_GET['insert'];
    elseif (isset($_SESSION['main']['insert']))
    	$insertId = $_SESSION['main']['insert'];
    else
    	$insertId = 0; // Valeur par défaut
    // Mise en mémoire du nouvel encart
    $_SESSION['main']['insert'] = $insertId;
     
    // Action du bouton edit
    if (isset($_POST['edit'])) {
    	unset($_POST['edit']);
    	header("location: parentPage.php?childPageKey=3&idMain=$idMain");
    	exit;
    }
    // Action du bouton del
    if (isset($_POST['del'])) {
    	unset($_POST['del']);
    	$_SESSION['toDel'] = $idMain;
    	header("location: parentPage.php?childPageKey=4");
    	exit;
    }
     
    // Action du bouton new
    if (isset($_POST['new'])) {
    	unset($_POST['new']);
    	header("location: parentPage.php?childPageKey=3&idMain=0");
    	exit;
    }
     
    // Action du bouton q (q = appelation habituelle des boutons de recherche)
    // Génère une liste de liens
    if (!empty($_POST['q'])) {
    	$result = getSearchData($_POST['q']);
    	if ($result) {
    		$searchResult = '';
    		$pattern = "<a href='%s'>%s, %s, %s, %s</a><br/>";
    		foreach ($result as $item) {
    			$searchResult .= sprintf($pattern, "parentPage.php?childPageKey=2&idMain=$item->id", $item->id, $item->last_name, $item->first_name, $item->birthdate);
    		}
    		unset($item);
    	}
    	$_POST['q'] = '';
    }
     
    $chkFavourite = ((!empty($arrFavourites) and in_array($idMain, $arrFavourites))) ? ' checked': '';
     
    // Action de la liste d'options 'latest'
    if (!empty($_POST['latest'])) {
    	header("location: parentPage.php?childPageKey=2&idMain={$_POST['latest']}");
    	exit;
    }
     
    // Action de la liste d'options 'favourites'
    if (!empty($_POST['favourites'])) {
    	header("location: parentPage.php?childPageKey=2&idMain={$_POST['favourites']}");
    	exit;
    }
     
    // Traitement de la case à cocher 'favourite'
    if (isset($_POST['flag'])) {
    	unset($_POST['flag']);
     
    	// Ajout à la liste des favoris
    	if (isset($_POST['favourite'])) {
    		refreshCookies('favourites', $idMain, 15);
    	}
    	// Retrait de la liste des favoris
    	else {
    		if (isset($arrFavourites)) {
    			unset($arrFavourites[array_search($idMain, $arrFavourites)]);
    			$arrFavourites = array_unique($arrFavourites);
    			$arrFavourites = array_values($arrFavourites);
    			$arrCookies = ['latest'=>$arrLatest, 'favourites'=>$arrFavourites];
    			setcookie($abo, serialize($arrCookies), COOKIE_HOLDTIME);
    		}
    	}
    	header("location: parentPage.php?childPageKey=2&idMain=$idMain");
    	exit;
    }
     
    // Création de la liste d'options 'latest'
    $lstLatest = new optListSelect('latest');
    $lstLatest->addOption(new optListOption('', ''));
    if (!empty($arrLatest)) {
    	$latest = getOptionsContent($arrLatest, 'latest');
    	foreach ($latest as $item) {
    		$lstLatest->addOption(new optListOption($item->id.', '.$item->name.', '.$item->birthdate, $item->id));
    	}
    	unset($item);
    }
    // Création de la liste d'options 'favourites'
    $lstFavourites = new optListSelect('favourites');
    $lstFavourites->addOption(new optListOption('', ''));
    if (!empty($arrFavourites)) {
    	$favourites = getOptionsContent($arrFavourites, 'favourites');
    	foreach ($favourites as $item) {
    		$lstFavourites->addOption(new optListOption($item->id.', '.$item->name.', '.$item->birthdate, $item->id));
    	}
    	unset($item);
    }
     
    // Création du tableau principal
    // Remplacement des valeurs nulles
    foreach ($mainPerson as &$value) {
    	$value = setDefaultValue($value, '');
    }
    unset($value);
    // Composition du tableau
    $lines = '';
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_ID));
    $line->addCell(new tabCell($mainPerson->id));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_GENDER));
    $line->addCell(new tabCell($mainPerson->gender));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_LAST_NAME));
    $line->addCell(new tabCell($mainPerson->last_name));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_FIRST_NAME));
    $line->addCell(new tabCell($mainPerson->first_name));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_MIDDLE_NAME));
    $line->addCell(new tabCell($mainPerson->middle_name));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_BIRTH_DATE));
    $line->addCell(new tabCell($mainPerson->birth_date));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_BIRTH_PLACE));
    $line->addCell(new tabCell($mainPerson->birth_place));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_CHRIST_DATE));
    $line->addCell(new tabCell($mainPerson->christening_date));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_DEATH_DATE));
    $line->addCell(new tabCell($mainPerson->death_date));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_DEATH_PLACE));
    $line->addCell(new tabCell($mainPerson->death_place));
    $lines .= $line;
    $line = new tabLine();
    $line->addCell(new tabCell(AFF_MAIN_PROF));
    $line->addCell(new tabCell($mainPerson->profession));
    $lines .= $line;
    unset($line);
     
    ##################################################################### FIN section CONTROLE #############################################################################
     
    ##################################################################### SECTION VUE ######################################################################################
     
    ?>
     
    <h2><?= AFF_MAIN_H2; ?></h2>
     
    <?php
    // Affichage des erreurs
    if (isset($errors)) {
    	echo displayErrors($errors);
    	unset($errors);
    }
    ?>
     
    <form method="post" class="search">
    	<div><input type="search" name="q" /> <button name="qBtn"><img src="<?= DIR_IMAGES.'glass.png' ?>" /></button> <button name="helpMark"><strong>&nbsp;?&nbsp;</strong></button></div>
    	<div><label for="latest"><?= AFF_LBL_LATEST ?></label> <?= $lstLatest ?></div>
    	<div><label for="favourites"><?= AFF_LBL_FAVOURITE ?></label> <?= $lstFavourites ?></div>
    </form>
    <p class="help"><?= nl2br(insertFrSpace(AFF_MAIN_SEARCH_NOTE))."<br/><span>".MSG_MASK_HELP.'</span>' ?></p>
     
    <?php if(!empty($searchResult))
    	echo "<p style='margin-left:15px'>".$searchResult."</p>";
    ?>
     
    <div id="mainDisplay">
    	<?php if ($mainPerson): ?>
    	<div id="mainPerson">
    		<h3><?= AFF_MAIN_H3_1; ?></h3>
    		<table>
    			<?= $lines ?>
    		</table>
     
    		<!-- Affichage des notes si elles existent -->
    		<?php if ($mainPerson->comment): ?>
    			<p><?= insertFrSpace(AFF_MAIN_COMMENT) ?></p>
    			<div id="comment">
    				<?= $mainPerson->comment ?>
    			</div>
    		<?php endif ?>
     
    		<p class="size09">
    			<a href="treeUp.php?idMain=<?= $idMain ?>"><?= AFF_MAIN_TREE_UP ?></a><br/>
    			<a href="parentPage.php?childPageKey=9&amp;idMain=<?= $idMain ?>"><?= AFF_MAIN_TREE_DOWN ?></a>
    		</p>
    		<!-- Formulaire d'affectation de la personne à la liste des favoris -->
    		<form method="post" id="favourite" class="bottomFormMain">
    			<input type="hidden" name="flag" />
    			<p><?= insertFrSpace(AFF_LBL_CHECKBOX) ?> <input type="checkbox" name="favourite"<?= $chkFavourite ?> /></p>
    		</form>
    		<!-- Accès aux formulaires d'édition de la personne affichée -->
    		<form method="post" class="bottomFormMain">
    			<?php if (allowEdit()): ?>
    				<p><input type="submit" name="edit" value="<?= AFF_BTN_UPDATE; ?>" /> <input type="submit" name="del" value ="<?= AFF_BTN_ERASE; ?>" />
    				<?= AFF_BTN_TXT; ?></p>
    			<?php endif ?>
    		</form>
    	</div>
     
    	<div id="insert">
    		<div id="insert_nav">
    			<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>	
    		</div>
    		<?php
    			$toInclude = 'includes/'.INSERTS[$insertId];
    			if (file_exists($toInclude))
    				include($toInclude);
    		?>
    	</div>
    	<?php endif ?>
    </div>
     
    <?php if (allowEdit()): ?>
    <!-- Accès au formulaire d'édition pour la création d'une nouvelle personne -->
    <form method="post" style="margin-left:25px" class="bottomFormMain">
    	<input type="submit" name="new" value="<?= AFF_BTN_CREATE; ?>" /> <?= AFF_BTN_TXT2; ?>
    </form>
    <p>&nbsp;</p>
    <?php endif ?>
     
    <script src="displMain.js"></script>
     
    <?php
     
    ##################################################################### FIN section VUE ##################################################################################

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    ...mais je n'arrive pas à afficher la page 3=>'editPers.php'...
    OK, mais on est censé cliquer où pour y accéder "normalement" ?


    Car si je tape /parentPage.php?childPageKey=3, ça affiche bien quelque chose !

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Si tu accèdes à la version démo avec l'identifiant et le mot de passe 'ademo' que je j'ai indiqué, que tu cliques sur 'Affichage individuel' (j'aurais du le préciser, mea culpa), tu as des boutons 'modifier', supprimer' et 'créer' qui sont traités par la portion de code lignes 255 à 274 du fichier displMain.php inclus dans parentPage.php avec le code de page 'childPageKey'=>2.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Essais d'être plus clair, précis et concis.

    Ce n'est quand même pas compliqué d'ISOLER les lignes concernées...

    1- Formulaire dans displMain.php (childPageKey=2) (ligne 454) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!-- Accès aux formulaires d édition de la personne affichée -->
    <form method="post" class="bottomFormMain">
    	<p><input name="edit" value="Modifier..." type="submit"> <input name="del" value="Supprimer..." type="submit">...les informations sur cette personne.</p>
    </form>
    <form method="post" .....> : il n'y a pas d'action="...", donc il redirige (par défaut) vers la même page, qui est parentPage.php?childPageKey=2 (donc displMain.php)

    2- Traitement dans displMain.php (childPageKey=2) (ligne 454) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Action du bouton edit
    if (isset($_POST['edit'])) {
    	unset($_POST['edit']);
    	header("location: parentPage.php?childPageKey=3&idMain=$idMain");
    	exit;
    }
    header("location: parentPage.php?childPageKey=3&idMain=$idMain");Donc, on fait une redirection !
    • le lien de redirection contient le paramètre idMain...
    • ...qu'on ne retrouve pas dans parentPage.php (après la redirection)
    • Est-il au moins repris dans editPers.php (childPageKey=3) ?

    -> Je pense que tu perds idMain en route !
    Car si je tape "/parentPage.php?childPageKey=3&idMain=1" dans l'URL, ça marche !

    -> Montre le (début du) code du fichier editPers.php.


    Bon.
    Dans l'ensemble, c'est quand même le gros b...del une grosse usine à gaz !!



    La méthode la plus conventionnelle est quand même de :
    • passer le paramètre idMain directement dans un input hidden du formulaire
    • NE PAS faire de redirections intempestives !
    • mettre une action dans le formulaire pour diriger vers la BONNE page tout de


    Code : 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
    	<!-- Accès aux formulaires d édition de la personne affichée -->
    	<?php if (allowEdit()): ?>
    	<p>
    		<!-- éditer (childPageKey=3) -->
    		<form method="post" class="bottomFormMain" action="?childPageKey=3" style="display:inline-block;">
    			<input type="hidden" name="idMain" value="<?= $idMain; ?>" />
    			<input type="submit" name="edit" value="<?= AFF_BTN_UPDATE; ?>" />
    		</form>
    		<!-- supprimer (childPageKey=4) -->
    		<form method="post" class="bottomFormMain" action="?childPageKey=4" style="display:inline-block;">
    			<input type="hidden" name="idMain" value="<?= $idMain; ?>" />
    			<input type="submit" name="del" value ="<?= AFF_BTN_ERASE; ?>" />
    		</form>
    			<?= AFF_BTN_TXT; ?>
    	</p>
    	<?php endif ?>
    Dans editPers.php OU dans delPers.php, on récupère alors idMain par $_POST :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $idMain = ( !empty($_POST['idMain']) )? $_POST['idMain'] : 0;
    Ca évite d'afficher idMain dans l'URL, et de le récupérer facilement là où c'est nécessaire (comme tout autre paramètre passé dans le formulaire !)
    Dernière modification par Invité ; 28/06/2018 à 20h29.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Citation Envoyé par jreaux62 Voir le message

    header("location: parentPage.php?childPageKey=3&idMain=$idMain");Donc, on fait une redirection !
    • le lien de redirection contient le paramètre idMain...
    • ...qu'on ne retrouve pas dans parentPage.php (après la redirection)
    • Est-il au moins repris dans editPers.php (childPageKey=3) ?

    -> Je pense que tu perds idMain en route !
    Car si je tape "/parentPage.php?childPageKey=3&idMain=1" dans l'URL, ça marche !
    Je pense aussi qu'on perd childPageKey=3 qui devient childPageKey=2 dans l'URL et c'est ce qui me gêne le plus et apparemment ce qui empêche d'accéder à la page.


    -> Montre le (début du) code du fichier editPers.php.
    Voici la première ligne:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump('Page 3');exit;
    Cette ligne montre que la page n'est pas appelée.

    Bon.
    Dans l'ensemble, c'est quand même le gros b...del une grosse usine à gaz !!
    Je structure toujours mes codes en quatre sections: La première est une section Tête: paramétrage, autorisations. Les suivantes tentent de se rapprocher d'une architecture MVC en réunissant les 3 fichiers en un seul. Bon? Pas Bon?

    La méthode la plus conventionnelle est quand même de :
    • passer le paramètre idMain directement dans un input hidden du formulaire
    • NE PAS faire de redirections intempestives !
    • mettre une action dans le formulaire pour diriger vers la BONNE page tout de
    Je vais essayer d'adapter le code en fonction de tes conseils.
    Mais je ne comprends toujours pas pourquoi mon code fonctionne en local et pas chez mon hébergeur.

  6. #6
    Invité
    Invité(e)
    Par défaut
    ... se rapprocher d'une architecture MVC en réunissant les 3 fichiers en un seul.
    donc plus rien à voir avec du MVC.


    Je pense aussi qu'on perd childPageKey=3 qui devient childPageKey=2
    Je crois plutôt qu'il arrive sur la page 3, où se trouve une erreur, et qu'on est redirigé vers la page 2

    Montre le vrai code de la page 3 !! (Traitement des données reçues, au début)


    je ne comprends toujours pas pourquoi mon code fonctionne en local et pas chez mon hébergeur.
    Parce que les fichiers ne sont pas les mêmes !
    Tu n'as pas transféré les derniers fichiers sur le serveur ?


    Ensuite, mets des echo '...'; et des exit; par ci par là, jusqu'à trouver où et pourquoi le code bug.

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Comme je l'ai dit, je vais d'abord essayer de reprendre mon code selon tes recommandations. Lorsque ce sera fait je reviendrai vers toi si nécessaire.
    Pour info, mes fichiers devraient être les mêmes puisque je les ai transférés en bloc depuis le répertoire racine après avoir pris soin de tout effacer sur le répertoire de destination.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Tape "http://genealium.proginet.eu/parentPage.php?childPageKey=3&idMain=1" dans la barre d'adresse, et tu verras qu'on voit la page complète.

    Et pas le résultat de var_dump('Page 3');exit;.
    Dernière modification par Invité ; 30/06/2018 à 12h38.

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    La méthode la plus conventionnelle est quand même de :
    • passer le paramètre idMain directement dans un input hidden du formulaire
    • NE PAS faire de redirections intempestives !
    • mettre une action dans le formulaire pour diriger vers la BONNE page tout de
    En appliquant tes conseils en #4, j'ai réussi à régler la première partie du problème.

    Pour la suite, dans editPers.php, je gère un formulaire multipage et j'ai adopté mon ancienne méthode qui, comme précédemment fonctionne en local et pas en ligne malgré des fichiers strictement identiques. J'ai conservé cette méthode avec des header('Location: ...') pour assurer le contrôle de saisie avant de passer à la page suivante car je ne vois pas comment y arriver autrement (voir ligne 223).
    Je joins le fichier editPers.php et la première page de formulaire.
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    <?php
     
    // Edition d'une personne editPers.php
     
    ##################################################################### SECTION TETE : PARAMETRAGE AUTORISATION ##########################################################
     
    if (!isset($isIncluded)) { // isIncluded est mis à true dans ParentPage.php
    	header('location: ' .  INDEX_PAGE);
    	exit;
    }
     
    // Autorisation d'accès à cette page
    if (! allowEdit() ) { // retourne true
    	header('location: '.DISPLAY_PAGE);
    	exit;
    }
     
    ##################################################################### Fin SECTION TETE : PARAMETRAGE AUTORISATION ######################################################
     
    ##################################################################### SECTION MODELE ###################################################################################
     
    connect();
     
    function getPerson($id) {
    	global $db;
     
    	$dateFormat = LOCAL_DATE_FORMAT;
    	$query = "
    		SELECT id, gender, last_name, first_name, middle_name, DATE_FORMAT(birth_date, '$dateFormat') AS birth_date, birth_place,
    			DATE_FORMAT(christening_date, '$dateFormat') AS christening_date, DATE_FORMAT(death_date, '$dateFormat') AS death_date, death_place,
    			profession, comment, father_id, mother_id, birth_order
    		FROM dat_persons
    		WHERE id=:id
    		LIMIT 1
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id', $id);
    	$result->execute();
    	return $result->fetch(PDO::FETCH_ASSOC);
    }
     
    function savePerson($toSave) {
    	global $db;
     
    	$id = $toSave['id'];
     
    	// Cas de la création d'une personne
    	if ($id == 0) {
    		unset($toSave['id']);
    		$toSave['create_date'] = date('Y-m-d');
     
    		$query = "
    			INSERT IGNORE INTO dat_persons (
    				id_abo, gender, last_name, first_name, middle_name, birth_date, birth_place, christening_date, death_date, death_place, 
    				profession, comment, father_id, mother_id, birth_order, create_date
    			)
    			VALUES (
    				:id_abo, :gender, :last_name, :first_name, :middle_name, :birth_date, :birth_place, :christening_date, :death_date, :death_place, 
    				:profession, :comment, :father_id, :mother_id, :birth_order, :create_date
    			)
    		;";
    		$result = $db->prepare($query);
    		$result->execute($toSave);
    		if ($result->rowCount() == 1)
    			return $db->lastInsertId();
    		return false; // ajout du 19/05/2018 non testé
    	}
     
    	// Cas de la modification d'une personne
    	else {
    		$query = "
    			UPDATE dat_persons
    			SET id_abo=:id_abo, gender=:gender, last_name=:last_name, first_name=:first_name, middle_name=:middle_name, 
    				birth_date=:birth_date, birth_place=:birth_place, christening_date=:christening_date, death_date=:death_date, death_place=:death_place, 
    				profession=:profession, comment=:comment, father_id=:father_id, mother_id=:mother_id, birth_order=:birth_order
    			WHERE id=:id
    		;";
    		$result = $db->prepare($query);
    		$result->execute($toSave);
    		return $result->rowCount();
    	}
    }
     
    ##################################################################### FIN section MODELE ###############################################################################
     
    ##################################################################### SECTION CONTROLE #################################################################################
     
    define('CFG_FORM_ACTION', 'parentPage.php?childPageKey=3');
     
    // Récupération et contrôle de l'id de la personne à éditer
    // Cas de la première entrée sur le formulaire
    if ( isset($_POST['edit']) or isset($_POST['new']) ) {
    	$idMain = filter_input(INPUT_POST, 'idMain', FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>0]]);
    	if ($idMain and !checkIfIdIsInAbo($idMain)) {
    		header('location: '.DISPLAY_PAGE);
    		exit;
    	}
    	unset($_POST);
    }
     
    if (empty($idMain) and isset($_SESSION['editPerson']['idMain'])) {
    	$idMain = $_SESSION['editPerson']['idMain'];
    }
    $_SESSION['editPerson']['idMain'] = $idMain;
     
    $person = getPerson($idMain);
     
    // Remplacement des valeurs nulles
    if ($person) {
    	foreach ($person as &$value) {
    		$value = setDefaultValue($value, '');
    	}
    	unset($value);
    }
     
    // Création d'une personne par défaut
    if (empty($person))
    	$person = [
    		'id'			=>$idMain,
    		'id_abo'		=>$_SESSION['user']['id_abo'],
    		'gender'		=>'',
    		'last_name'		=>'',
    		'first_name'	=>'',
    		'middle_name'	=>'',
    		'birth_date'	=>'',
    		'birth_place'	=>'',
    		'christening_date'=>'',
    		'death_date'	=>'',
    		'death_place'	=>'',
    		'profession'	=>'',
    		'comment'		=>'',
    		'father_id'		=>'',
    		'mother_id'		=>'',
    		'birth_order'	=>'',
    	];
     
    // Titre de la page
    $h2 = ($idMain) ? sprintf(PER_UPDATE_H2, "{$person['first_name']} {$person['last_name']}"): PER_CREATE_H2;
     
    // Récupération du numéro de l'étape en cours
    if (empty($_GET['stage']) or !is_numeric($_GET['stage']) or $_GET['stage'] < 1 or $_GET['stage'] > count(PERS_EDIT_NAVH)+1)
    	define('CFG_STAGE_ID', 1);
    elseif (file_exists('includes/forms/'.$_GET['stage'].'_PersEditForm.php'))
    	define('CFG_STAGE_ID', intval($_GET['stage']));
     
    // Déclaration de la variable de session
    if(empty($_SESSION['editPerson']['forms']))
    	$_SESSION['editPerson']['forms'] = [];
     
    // Affichage du menu en haut de la page
    $items = [];
    $lnk = "<a href='".CFG_FORM_ACTION."&stage=%d'>%d - %s</a>";
    foreach(PERS_EDIT_NAVH as $formId => $formName) {
    	if (empty($_SESSION['editPerson']['forms'][$formId])) {
    		$items[] = "<span>$formId - $formName</span>";
    	}
    	else {
    		$items[] = sprintf($lnk, $formId, $formId, $formName);
    	}
    }
    $max = count(PERS_EDIT_NAVH)+1;
    $items[] = sprintf($lnk, $max, $max, 'Résumé');
    $navigH = implode('</li><li>', $items);
    $navigH = '<ul class="menuH"><li>'.$navigH.'</li></ul>';
     
    // Nettoyage des données envoyées par le $_POST
    if (!empty($_POST)) {
    	foreach ($_POST as &$value) {
    		if (is_string($value)) $value = strip_tags($value);
    	}
    }
     
    // Récupération des informations, affichage du formulaire
    switch(CFG_STAGE_ID) {
     
    	case 4:
     
    		// Résumé et enregistrement en base de données
     
    	break;
     
    	case 3:
     
    		// Traitement similaire à étape 1
     
    	break;
     
    	case 2:
     
    			// Traitement similaire à étape 1
     
    	break;
     
    	case 1:
    	default:
    		// Valeurs par défaut
    		if (empty($_SESSION['editPerson']['forms'][CFG_STAGE_ID])) {
    			$_SESSION['editPerson']['forms'][CFG_STAGE_ID] = $person;
    		}
     
    		// Récupération des informations du formulaire
    		if(! empty($_POST)) {
    			// Vérification des saisies puis affectation à la variable de session
    			$errors = [];
    			unset($_POST['next']);
     
    			if (empty($_POST['gender']))
    				$errors[] = PER_ERR_GENDER;
    			if (empty($_POST['last_name']))
    				$errors[] = PER_ERR_LAST_NAME;
    			if (empty($_POST['first_name']))
    				$errors[] = PER_ERR_FIRST_NAME;
    			if ($_POST['birth_date'] and !(strlen($_POST['birth_date']) === 10 and ctl_dateEur($_POST['birth_date'])))
    				$errors[] = PER_ERR_BIRTH_DATE;
    			if ($_POST['christening_date'] and !(strlen($_POST['christening_date']) === 10 and ctl_dateEur($_POST['christening_date'])))
    				$errors[] = PER_ERR_CHRIST_DATE;
    			if ($_POST['death_date'] and !(strlen($_POST['death_date']) === 10 and ctl_dateEur($_POST['death_date'])))
    				$errors[] = PER_ERR_DEATH_DATE;
     
    			// En l'absence d'erreur: Enregistrement en session, passage à l'étape 2
    			if (empty($errors)) {
    				$_SESSION['editPerson']['forms'][CFG_STAGE_ID] = $_POST;
    				header('location: '.CFG_FORM_ACTION.'&stage='.strval(CFG_STAGE_ID+1));
    			}
    		}
     
    		break;
    }
     
    $form = 'includes/forms/'.strval(CFG_STAGE_ID).'_PersEditForm.php';
     
    ##################################################################### FIN section CONTROLE #############################################################################
     
    ##################################################################### SECTION VUE ######################################################################################
     
    ?>
     
    <h2><?= $h2 ?></h2>
     
    <?php
    // Affichage des erreurs
    if (isset($errors)) {
    	echo '<p>'.displayErrors($errors).'</p>';
    	unset($errors);
    }
    ?>
     
    <?= $navigH; ?>
     
    <p class="note"><?= MUST_FIELD ?></p>
     
    <?php
    if (file_exists($form))
    	require_once($form);
    ?>
     
    <?php
     
    ##################################################################### FIN section VUE ##################################################################################

    Première page de formulaire
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?php
     
    ##################################################################### SECTION TETE : PARAMETRAGE AUTORISATION ##########################################################
     
    ##################################################################### SECTION TETE : PARAMETRAGE AUTORISATION ##########################################################
     
    if (!isset($isIncluded)) {
    	header('location: ' .  INDEX_PAGE);
    	exit;
    }
     
    ##################################################################### Fin SECTION TETE : PARAMETRAGE AUTORISATION ######################################################
     
    ##################################################################### SECTION MODELE ###################################################################################
     
    ##################################################################### FIN section MODELE ###############################################################################
     
    ##################################################################### SECTION CONTROLE #################################################################################
     
    if ($_SESSION['editPerson']['forms'][CFG_STAGE_ID]) {
    	$_POST = $_SESSION['editPerson']['forms'][CFG_STAGE_ID];
    }
     
    // Liste des variables à transmettre au script JavaScript
    $dateMask = str_replace(['%d', '%m', '%Y'], ['JJ', 'MM', 'AAAA'], LOCAL_DATE_FORMAT);
    $fromPHPtoJS = ['monthes'=>CLOCK_TEXTES['monthes'], 'shortDays'=>CLOCK_TEXTES['shortDays'], 'dateMask'=>$dateMask, 'genderError'=>PER_MSG_GENDER, 'dateError'=>ERR_DATE];
     
    // Liste des fichiers de scripts JS
    $jsFiles = ['libraries/jsSimpleDatePickr.2.1.js', 'includes/forms/1_PersEditForm.js'];
     
    ##################################################################### FIN section CONTROLE #############################################################################
     
    ##################################################################### SECTION VUE ######################################################################################
     
    var_dump(CFG_FORM_ACTION.'&stage='.CFG_STAGE_ID);
    ?>
     
    <form method="post" class="L" action="<?= CFG_FORM_ACTION ?>&stage=<?= CFG_STAGE_ID ?>">
    	<fieldset><legend><?= PERS_EDIT_NAVH[substr(basename(__file__, '.php'), 0, 1)] ?></legend>
    		<label for="id"><?= PER_LBL_ID ?></label><input type="text" name="id" id="id" value="<?= setPostValue('id') ?>" readonly /><br/>
    		<label for="" class="mustField"><?= PER_LBL_GENDER ?></label><input type="radio" name="gender" id="F" value="F" <?= setPostValue('gender', 'radio', 'F') ?> required /><label for="F"><?= PER_LBL_F ?></label><br/>
    		<label for=""></label><input type="radio" name="gender" id="M" value="M" <?= setPostValue('gender', 'radio', 'M') ?> /><label for="M"><?= PER_LBL_M ?></label><br/>
    		<label for="last_name" class="mustField"><?= PER_LBL_LAST_NAME ?></label><input type="text" name="last_name" id="last_name" value="<?= setPostValue('last_name') ?>" required /><br/>
    		<label for="first_name" class="mustField"><?= PER_LBL_FIRST_NAME ?></label><input type="text" name="first_name" id="first_name" value="<?= setPostValue('first_name') ?>" required /><br/>
    		<label for="middle_name"><?= PER_LBL_MIDDLE_NAME ?></label><input type="text" name="middle_name" id="middle_name" value="<?= setPostValue('middle_name') ?>" /><br/>
    		<label for="birth_date"><?= PER_LBL_BIRTH_DATE ?></label><!--
    			--><input type="text" name="birth_date" id="birth_date" value="<?= setPostValue('birth_date') ?>" placeholder="<?= TODAY_EUR ?>" />
    			<div id="calendarBirth" class="calendarMain calendarInLine"></div><br/>
    		<label for="birth_place"><?= PER_LBL_BIRTH_PLACE ?></label><input type="text" name="birth_place" id="birth_place" value="<?= setPostValue('birth_place') ?>" /><br/>
    		<label for="christening_date"><?= PER_LBL_CHRISTENING_DATE ?> *</label><!--
    			--><input type="text" name="christening_date" id="christening_date" value="<?= setPostValue('christening_date') ?>" placeholder="<?= TODAY_EUR ?>" />
    			<div id="calendarChrist" class="calendarMain calendarInLine"></div><br/>
    		<label for="death_date"><?= PER_LBL_DEATH_DATE ?></label><!--
    			--><input type="text" name="death_date" id="death_date" value="<?= setPostValue('death_date') ?>" placeholder="<?= TODAY_EUR ?>" />
    			<div id="calendarDeath" class="calendarMain calendarInLine"></div><br/>
    		<label for="death_place"><?= PER_LBL_DEATH_PLACE ?></label><input type="text" name="death_place" id="death_place" value="<?= setPostValue('death_place') ?>" /><br/>
    	</fieldset>
     
    	<p><input type="submit" name="next" value="<?= BTN_NEXT ?>" /></p>
    </form>
    <p class="note">* <?= PER_NOTE_F1 ?></p>
     
    <script>
    	var fromPHPtoJS = <?= json_encode($fromPHPtoJS) ?>;
    </script>
    <script src="libraries/common.js"></script>
     
    <?php
     
    ##################################################################### FIN section VUE ##################################################################################

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1-
    ...malgré des fichiers strictement identiques...
    Vérifie :
    • les majuscules/minuscules dans les noms des dossiers/fichiers (nom "réel" par rapport à ceux inscrits dans le code) : sur serveur, c'est généralement sensible à la casse.
    • la version de PHP utilisée (?)


    2-
    ...J'ai conservé cette méthode avec des header('Location: ...') pour assurer le contrôle de saisie avant de passer à la page suivante...
    Non.
    Il suffit de passer un AUTRE paramètre dans l'URL, comme "action" par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    parentPage.php?childPageKey=3&idMain=1&action=etape1
    parentPage.php?childPageKey=3&idMain=1&action=etape2
    ...
    childPageKey=3 -> inclus le fichier editPers.php

    dans editPers.php, on dispatche les actions à effectuer avec des if, ou un switch case :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $action = ( !empty($_GET['action']) )? $_GET['action'] : '';
    switch( $action )
    {
       case 'etape1':
          // ............
          break;
       case 'etape2':
          // ............
          break;
       default:
          // ............
    }
    (évidemment, on peut mettre des numériques 1,2,... au lieu de 'etape1', 'etape2',... !)

    "action" peut aussi être passé en $_POST dans le(s) formulaire(s) (dans un <input type="hidden" .../>, comme "idMain")


    N.B. Pour ma part, je passe mes paramètres dans les formulaires.
    J'en ai généralement 1 ou 2 :
    • traiter : Voir / Modifier / Ajouter / Supprimer (voir un exemple ici)
    • action : Afficher / Enregistrer / ...

    Après.... chacun gère ça à sa manière
    Dernière modification par Invité ; 30/06/2018 à 12h48.

  11. #11
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Vérifie :
    • les majuscules/minuscules dans les noms des dossiers/fichiers (nom "réel" par rapport à ceux inscrits dans le code) : sur serveur, c'est généralement sensible à la casse.
    • la version de PHP utilisée (?)
    Dans la mesure où à chaque mise à jour, j'efface tout le contenu du répertoire racine du site distant (1&1) et où je transferts tout le contenu du répertoire racine local, je ne vois pas comment, il pourrait y avoir des différences de noms ou de casses.
    La version PHP que j'utilise en développement est 7.0.23, celle du site distant est 7.0. Il ne devrait donc pas y avoir de différences.

    Pour la suite, je ne te suis pas vraiment. Dans le fichier que j'ai joint correspondant à la première page de formulaire, j'ai ligne 38 <form method="post" class="L" action="<?= CFG_FORM_ACTION ?>&stage=<?= CFG_STAGE_ID ?>"> où stage correspond à l'étape (la page de formulaire). Ici je renvoie déjà à une sélection switch (par exemple ligne 194 du fichier editPers.php) où s'effectuent les contrôles de saisie et c'est à la fin de chacun de ces contrôles (ligne 223 par exemple) que je ne vois pas comment passer à l'étape suivante sans passer par header.

  12. #12
    Invité
    Invité(e)
    Par défaut
    1-
    • Si le fichier s'appelle "machinchose.php",
    • Et que dans ton code tu écris "machinChose.php" :

    Ça ne fonctionnera pas. Le fichier ne sera pas trouvé.

    Et télécharger le tout à chaque fois n'y changera rien.

    N.B. c'est une erreur très courante, à partir du moment où on met des majuscules dans les noms de fichiers !
    Et ça vaut aussi pour les noms de variables ou colonnes (en BDD).


    2- pour la suite, en effet, je n'ai pas lu ton code (je n'allais pas tout décortiquer...)
    Je t'ai fourni une méthode... Que tu sembles déjà utiliser !

    Concernant les header location,... Je n'ai pas trop regardé non plus.
    Soit c'est effectivement nécessaire, soit une erreur de conception/logique.
    Dernière modification par Invité ; 30/06/2018 à 19h34.

  13. #13
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    1-
    • Si le fichier s'appelle "machinchose.php",
    • Et que dans ton code tu écris "machinChose.php" :

    Ça ne fonctionnera pas. Le fichier ne sera pas trouvé.
    Ça, je sais. Ce que je veux dire est que ce genre d'erreur est détecté dès le développement et si ça marche en développement, le meilleur moyen que j'ai trouvé pour éviter d'introduire de nouvelles erreurs est de tout transférer en bloc.

    C'est justement pour ça que je ne comprends pas pourquoi mon code fonctionne en local et pas en ligne avec exactement le même code.

  14. #14
    Invité
    Invité(e)
    Par défaut
    C'est FAUX.

    Chez moi en local (wamp), c'est insensible à la casse.
    Alors que sur le serveur distant (OVH), c'est sensible à la casse.

    Du coup, j'ai eu des codes, fonctionnels en local, qui buguaient sur serveur.


    Mais, bon. Si tu veux rester avec tes certitudes...

  15. #15
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Je souvent constaté la sensibilité à la casse sur les variables. Est-ce que c'est bien vrai pour les noms de fichiers? Est-ce que ça dépendrait des versions wamp ou de sa configuration ini? ça vaut le coup de vérifier demain. Si ça pouvait être ça.

    En tous cas, mille mercis pour ton aide.

  16. #16
    Invité
    Invité(e)
    Par défaut
    À voir :


    Le système Windows lui-même étant « case insensitive », il n'y a aucun moyen de le rendre « case sensitive » de manière fiable et pérenne.
    > Ce n'est pas non plus possible de forcer Apache à être plus strict ?
    NON.
    C'est le système qui gère la sensibilité à la casse, pas Apache, ni PHP, ni MySQL.

  17. #17
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Je récapitule.
    Rappels:
    • Mes fichiers sont les mêmes puisqu'à chaque correction, je transferts la totalité des fichiers en une fois.
    • Tout marche bien en local mais pas en ligne.


    1) J'ai résolu une partie de mes difficultés en adaptant mon code selon ta méthode.
    2) Je peux me tromper mais je ne pense pas que mes difficultés soient dues à la casse d'une part parce que j'ai fait quelques vérifications, d'autre part parce que, même en local, php envoie une alerte 'undefined variable' lorsque la casse n'est pas correcte.
    3) Je pense plutôt que mes soucis sont dus à la transmission de variables avec des redirections du type header('Location: fichier.php?variable_1=a&variable_2=b'). Je n'ai pas trouvé de contre-indication dans la doc mais je pense qu'il faut que je trouve une autre solution. Je vais essayer en recopiant les variables en variables de session et de ne mettre que le nom de fichier dans le header mais je crains d'avoir trop de redirections.

  18. #18
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut Je ne m'en sors pas
    Bonjour à nouveau,
    Depuis une semaine que je suis sur ce problème, j'ai avancé mais je ne m'en sors pas.

    En adaptant mon code d'après les indications de jreaux62, j'ai réglé les problèmes apparus initialement.

    Maintenant, j'ai toujours un fonctionnement différent en local et en ligne. En local, tout fonctionne.
    En ligne, le clic sur la case à cocher 'flag' géré en JavaScript déclenche la soumission du formulaire.
    Ceci devrait entraîner le rafraîchissement de la page (redirection header('Location:...') mais il se produit ceci:
    Dans la barre d'adresse du navigateur, l'url est correcte avec les bons paramètres ("http://uri_du_site/parentPage.php?childPageKey=2&idMain=20"), la page parente s'affiche mais le contenu inclus displMain.php ne s'affiche pas.
    Si j'actualise la page, rien ne se passe, mais si, sans rien modifier, je fais un clic sur la barre d'adresse suivi de la touche 'entrée', alors le contenu inclus s'affiche.

    Voici le code de la page parente:
    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
    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',
    ]);
     
    var_dump($_GET); echo '<br/>';
    $_SESSION['childPageKey'] = filter_input(INPUT_GET, 'childPageKey', FILTER_VALIDATE_INT, ['options'=>['default'=>0, 'min_range'=>0, 'max_range'=>count(CHILDS)]]);
    var_dump($_SESSION['childPageKey']); echo '<br/>';
    var_dump(file_exists(CHILDS[$_SESSION['childPageKey']])); echo '<br/>';
     
    // Si la page est inexistante, sélection de la page par défaut
    if (! file_exists(CHILDS[$_SESSION['childPageKey']]))
    {
    	$_SESSION['childPageKey'] = 0;
    }
    $childPageFile = CHILDS[$_SESSION['childPageKey']];
    var_dump($_SESSION['childPageKey']); echo '<br/>';
    var_dump($childPageFile); echo '<br/>';
     
    // Effacement des variables de session inutiles
    if ($_SESSION['childPageKey'] != 3) {
    	unset($_SESSION['editPerson']);
    }
    et le résultat affiché:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    array(2) { ["childPageKey"]=> string(1) "2" ["idMain"]=> string(2) "20" } 
    int(2) 
    bool(true) 
    int(2) 
    string(13) "displMain.php"

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonjour, Bonjour,...

    ...En ligne, le clic sur la case à cocher 'flag' ...
    ...contenu inclus...
    Et soit plus précis !
    • elle est où, cette case ?
    • quel contenu inclus (nom du fichier) ?
    • ...



    Je viens d'aller voir sur ton site en ligne.
    Ca a l'air de fonctionner, non ?
    [EDI]En fait, NON, ça ne fonctionne pas.
    Je dirais même que ça ne doit pas fonctionner correctement en local non plus.

    Tu dois avoir des incohérences dans la transmission des paramètres via l'URL, et aussi dans les SESSION.

    EX. :
    • Affichage individuel -> je clique "Modifier"
    • je clique ensuite "Suivant", à chaque étape jusqu'à la dernière.

    Jusque là, tout va bien.

    • Maintenant, je re-clique sur le lien "1 - Etat-civil",
    • puis sur les 3 autres liens jusqu'à "4 - Résumé"

    Et là, c'est le drame : on a perdu l'idMain en route... !!
    Dernière modification par Invité ; 04/07/2018 à 15h18.

  20. #20
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 590
    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 590
    Points : 813
    Points
    813
    Par défaut
    Ah oui, tu as raison, au temps pour moi! C'est la case du cadre "Personne de référence" intitulée "Mettre cette personne en favori".
    Il y a une autre lacune, dans la partie html de cette même page parente, il y a ceci:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<section id="main">
    		<div id="left">
    			<nav>
    				<?php require_once('includes/menuV.php') ?>
    			</nav>
    		</div>
    		<article id="right">
     
    			<?php include($childPageFile); ?>
     
    		</article>
    	</section>
    Pour ne pas surcharger, je n'ai pas mis le code de la page incluse "displMain.php" que j'ai modifiée en vertu de tes conseils et aussi pour rationaliser le code.
    EDIT: Tu as raison, j'ai plus de chose qui marchent en local mais effectivement pas tout: La case à cocher fonctionne en local, mais la perte d'informations en session sur le formulaire multipage est bien réelle. Pour ce dernier point, j'espère m'en sortir seul.

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