Bonjour j'ai un soucis sur mon fichier ont m'indique comme erreur ,

  • Attention : Clé de tableau indéfinie 1 dans C:\xampp\htdocs\gra\public\index.php à la ligne 23

Ma clé est "p" .

Je suis le tuto sur le mvc je comprendai jusque la mais la je suis complétement perdu .....

https://grafikart.fr/tutoriels/mvc-model-view-controller-574#autoplay

Meme en prenant le dossier source j'ai la meme erreur ......

Je ne comprend vraiment pas du tout Avez vous une solution ?

Voila le git hub du projet : https://github.com/xavgdt66/bloginexerror

Voila ma page app/public/index.php

define('ROOT', dirname(__DIR__));
require ROOT . '/app/App.php';
App::load();

if(isset($_GET['p'])){
    $page = $_GET['p'];
}else{
    $page = 'posts.index';
}

$page = explode('.', $page);
if($page[0] == 'admin'){
    $controller = '\App\Controller\Admin\\' . ucfirst($page[1]) . 'Controller';
    $action = $page[2];
} else{
    $controller = '\App\Controller\\' . ucfirst($page[0]) . 'Controller';
    $action = $page[1];
}

$controller = new $controller();
$controller->$action();

Voila ou j'ai l"erreur


`if($page[0] == 'admin'){
    $controller = '\App\Controller\Admin\\' . ucfirst($page[1]) . 'Controller';
    $action = $page[2]; 
    print_r($page); 
} else{
    $controller = '\App\Controller\\' . ucfirst($page[0]) . 'Controller';
    $action = $page[1]; // C'est cette ligne oui il y à  l'erreur 
}`

21 réponses


Soundboy39
Réponse acceptée

Hello

Il y a un truc qui ne va pas... si ta valeur === "admin.categories.index ", le resultat de l'explode devrait être Array ( [0] => admin [1] => categories [2] => index )

Est-ce que tu peux stp faire appliquer la modif ci dessous et nous donner le resultat stp ?

$page = explode('.', $page);
-- CODE TO ADD --
print_r($_GET['p']);
print_r($page);
-- /CODE TO ADD --
if($page[0] == 'admin'){

en précisant la valeur du paramètre "p", merci.

Quel valeur a $_GET['p'] ? Suivant ce que tu passes comme valeur tu peux ne pas avoir deux éléments au tableau lorsque tu fais $page = explode('.', $page); et donc l'élément 1 sera indéfini lorsque tu fais $page[1].

Si tu exécutes :

$page = explode(".", "coucou");print_r($page);

tu auras


Array
(
    [0] => coucou
)

La valeur de $_GET['p'] est 'p' non ? à moins que j'ai trés mal compris ......

Hello :)

Nope, p c'est la clé de ta requete, quand tu fais $_GET['p'] ca renvoie la valeur de la clé "p"

En gros si ton url c'est http://tonsite.com?p=toto alors la valeur de $_GET['p'] c'est toto

Merci à vous
Donc voila ma valeur : admin.categories.index

Tu peux ajouter print_r($page); à la ligne 22 et montrer le code que tu as à la ligne où tu as l'erreur ?

J'ai ça qui s'affiche Array ( [0] => admin [1] => posts [2] => index ) Acces interdit

C'est la derniere partie de code que j'ai mis ou il y a l'erreur

Autre chose bizarre : tu dis que l'erreur est à la ligne $action = $page[1];

if($page[0] == 'admin'){
    $controller = '\App\Controller\Admin\\' . ucfirst($page[1]) . 'Controller';
    $action = $page[2]; 
    print_r($page); 
} else{
    $controller = '\App\Controller\\' . ucfirst($page[0]) . 'Controller';
    $action = $page[1]; // C'est cette ligne oui il y à  l'erreur 
}

alors que ta page étant admin.categories.index tu devrais passer dans le if

Le mieux serait de mettre juste ça dans ton script (note que j'ai enlevé le require en début de page) :

<?php
if(isset($_GET['p'])){
    $page = $_GET['p'];
}else{
    $page = 'posts.index';
}

$page = explode('.', $page);
print_r($page);

if($page[0] == 'admin'){
    $controller = '\App\Controller\Admin\\' . ucfirst($page[1]) . 'Controller';
    $action = $page[2];
} else{
    $controller = '\App\Controller\\' . ucfirst($page[0]) . 'Controller';
    $action = $page[1];
}
die("<br>Controlleur : $controller;<br>Action = $action");

et de te rendre sur la page /?p=admin.categories.index

soundBoy maintennat j'ai ça afficher admin.posts.indexArray ( [0] => admin [1] => posts [2] => index ) Array ( [0] => admin [1] => posts [2] => index ) Acces interdit c'est par ce que je ne suis pas connecter avec la valeur admin.posts.index .

Mais mtn j'ai un autre soucis c'est sur ma page login.php j'ia cette erreur :
Warning: Undefined array key 1 in C:\xampp\htdocs\gra\public\index.php on line 30

Mtn j'ai une erreur dans ma page p=login

Warning: Undefined array key 1 in C:\xampp\htdocs\gra\public\index.php on line 24

Voila le résultat de mon navigateur JoolsMcFly pour la page "" http://localhost/gra/public/index.php?p=login ""
https://ibb.co/HrjJZdz

OK mais t'as pas fait ce que je t'ai demandé pour mieux débuguer car mon code a 17 lignes et t'as l'erreur à la ligne 23.

En tout cas en allant sur http://localhost/gra/public/index.php?p=login alors $_GET['p'] sera égal à login et c'est normal que t'aies une erreur quand le code fait $action = $page[1]; car à ce moment ton tableau n'a qu'un élément : login en position 0,

Remplace tout ton script par :

<?php
if(isset($_GET['p'])){
    $page = $_GET['p'];
}else{
    $page = 'posts.index';
}

$page = explode('.', $page);
print_r($page);

if($page[0] == 'admin'){
    $controller = '\App\Controller\Admin\\' . ucfirst($page[1]) . 'Controller';
    $action = $page[2] ?? 'index';
} else{
    $controller = '\App\Controller\\' . ucfirst($page[0]) . 'Controller';
    $action = $page[1] ?? 'index';
}
die("<br>Controlleur : $controller;<br>Action = $action");

et ca devrait fonctionner car j'ai ajouté ?? 'index' qui va être la valeur par défaut au cas où il n'y ait pas $page[1] (ou $page[2] dans le if).

Rends toi sur http://localhost/gra/public/index.php?p=login et tu devrais le controlleur de Login et l'action index.

C'est bon ça me fait ça https://ibb.co/Rgm2D6K mais mon formulaire de login n'apparait pas

Oui, bien sûr, c'était juste pour débuguer avec le minimum de code. Maintenant tu peux remettre

define('ROOT', dirname(__DIR__));
require ROOT . '/app/App.php';
App::load();

puis

$controller = new $controller();
$controller->$action();

à la fin et tu devrais voir ton formulaire.

Je l'ai fait et mon formualire n'apparrait pas

Est-ce que tu peux metre tout le script ici stp ?

T'as bien une méthode login dans LoginController ?
Si oui est-ce que tu mettre le code ici stp ?

Le formulaire n'apparait pas mais est-ce que t'as une erreur ?
Ajoute

ini_set('display_errors', 1);
error_reporting(E_ALL);

en tout début de script pour être sûr que les erreurs s'affichent.

Cela n'affiche rien ...
Oui j'en ai bien une
Regarde mon github https://github.com/xavgdt66/login Peut etre que tu verra quelque chose que je ne verraie pas

Dsl, je n'ai pas trop le temps de regarder plus en détails aujourd'hui mais au passage, loginController devrait être LoginController.

Est-ce que tu as installé xdebug ? Ça permet de faire du pas à pas et c'est l'arme fatale pour débuguer.

Tu as une page blanche ? Pas d'erreur même avec le code que j'ai mis prédemment ?

C'est bon j'ai réussi merci à toi

Cool, à la prochaine :)