[RESOLU] undefined index

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] undefined index

Re: undefined index

par blastouille » 25 nov. 2018, 12:05

Coucou, je viens de voir mon erreur au final. Il m'a fallu 48h pour élucider un problème tout simple, je comprend pas comment je n'ai pas pu le voir avant.
dans mon controller ( frontend.php) j'appelle mes fonctions dans ma classe objet du fichier Register.php avant mes conditions. J'me suis garder en tête la POO du javascript avec la déclaration de variable. donc du coup je sais pas pourquoi j'étais encore la dessus en disant je déclare ma variable d'abord et ensuite je l’exécute. voilà :)

PS: un modérateur peut mettre le post en résolu svp? car j'ai fais l'erreur de poster sans etre loggué la 1ere fois. Merci d'avance.

Re: undefined index

par blastouille » 23 nov. 2018, 15:31

Voici mon fichier Routeur, (dsl j'ai voulu mettre un minimum en code, malheureusement je peux pas rééditer mon 1er post étant donné que j'ai fais l'erreur d'avoir posté sans etre loggué au forum, donc je vais mettre toutes les infos sur ce post pour mieux comprendre l'intégralité de mon code.) Désolé par avance, il est assez long.

Fichier "Routeur" donc c'est mon index.php
<?php
require('controller/frontend.php');

try {
        if ($_GET['action'] == 'register') {
            register();
        }
Fichier "controller" donc frontend.php

<?php

// Chargement des classes
require_once('model/Register.php');

function register()
{    
    require('view/frontend/registerView.php');
    $registerManager = new Registers();
    $controlUser = $registerManager->reqUsername();
    $controlEmail = $registerManager->reqEmail();
    $controlRegister = $registerManager->reqRegister();
    $errors = array();

    if(!empty($_POST))
    {
        if (empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) 
        {
            $errors['username'] = "Votre pseudo n'est pas valide";
        } else {
            $controlUser;
            if ($user)
            {
                $errors['username'] = "Ce pseudo est déjà pris";
            }
        }

        if (empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
        {
            $errors['email'] = "Votre email n'est pas valide";
        } else {
            $controlEmail;
            if ($user) 
            {
                $errors['email'] = "Cet email est déjà pris";
            }
        }

        if (empty($_POST['password'])) 
        {
            $errors['password'] = "Votre mot de passe n'est pas valide";
        }

        if ($_POST['password'] != $_POST['password_confirm']) 
        {
            $errors['password'] = "Votre mot de passe est différent de celui de confirmation";
        }

        if(empty($errors))
        {
            $controlRegister;
        }
    }
}

Fichier "model" donc Register.php


<?php
require_once("model/Manager.php");

class Registers extends Manager
{	

	public function reqUsername()
	{	
		$db = $this->dbConnect();
		$req = $db->prepare('SELECT id FROM users WHERE username = ?');
		$req->execute([$_POST['username']]);
		$user = $req->fetch();
	}	
				
	public function reqEmail()
	{	
		$db = $this->dbConnect();
		$req = $db->prepare('SELECT id FROM users WHERE email = ?');
		$req->execute([$_POST['email']]);
		$user = $req->fetch();
	}
				
	public function reqRegister()
	{   
		$db = $this->dbConnect(); 
		$success = "Votre compte a bien été crée";   
		$req = $db->prepare("INSERT INTO users set username = ?, password = ?, email = ?");
		$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
		$req->execute([$_POST['username'], $password, $_POST['email']]);
		die($success);
	}
}	

?> 

Fichier "View" donc registerView.php

<!DOCTYPE html>
<html lang="fr">
<head>
	<!----Meta Tags---->
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

	<!----CSS files---->
	<link rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.css">
	<link rel="stylesheet" type="text/css" href="css/style.css"> 
	<link rel="stylesheet" type="text/css" href="css/signin.css">

	<!----Js Lib---->
	<script src="http://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>

	<title><?= $title ?></title>
</head>

<body>
		

			<?php if(!empty($errors)): ?>
			<div class="alert alert-danger">
				<p>Vous n'avez pas rempli le formulaire correctement</p>
				<ul>
					<?php foreach ($errors as $error): ?>
						<li><?= $error; ?></li>
					<?php endforeach; ?>
				</ul>
			</div>
			<?php endif; ?>

	<form class="form-signin" method="POST">

		<h1>Veuillez remplir le formulaire</h1>

			

			<div class="form-group">
			    <label for="">Pseudo</label>
			    <input type="text" name="username" class="form-control">
			</div>

			<div class="form-group">
			    <label for="">Email</label>
			    <input type="email" name="email" class="form-control">
			</div>

			<div class="form-group">
			    <label for="">Mot de passe</label>
			    <input type="password" name="password" class="form-control">
			</div>

			<div class="form-group">
			    <label for="">Confirmez votre mot de passe</label>
			    <input type="password" name="password_confirm" class="form-control">
			</div>

		<button type="submit" class="btn btn-primary">Enregister</button>
		<button type="button" class="btn btn-secondary"><a href="index.php">Annuler</a></button>

		</form>
	</div>
</body>
En ce qui concerne le fichier Manager.php c'est tou simplement là ou je stock ma fonction dbConnect() pour me connecter à ma base de donnée. Comme le code est très long j'ai voulu mettre jutre un minimum. Mais c'est sur que ça n'aidera pas. donc si on regarde mon HTML côté formulaire. Dans ma balise form, j'indique la méthode POST et les bouton du formulaire sont a l'interieur de ma balise form. je precise que le code en question n'avait aucun probleme lorsque c'était regroupé en 1 seul fichier, c'est depuis que je l'ai passé en MVC que ça ne va plus.

Code du modal qui contient le bouton pour m'envoyer sur la page de register
<form action="index.php?action=login" method="POST">
	<div class="modal-body">
		<div class="form-group">
			<label for="">Email</label>
			<input type="email" name="email" class="form-control" required/>
		</div>
			        	
		<div class="form-group">
      		<label for="">Mot de passe</label>
			   	<input type="password" name="password" class="form-control" required/>
		</div>			        	
	
	</div>
	<div class="modal-footer">
		<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
		<button type="submit" class="btn btn-primary" name="connexion" value="Connexion">Connexion</button>
		<button type="button" class="btn btn-secondary"><a id="create-account" href="index.php?action=register">créer un compte</a></button>
	</div>
</form>

Re: undefined index

par or 1 » 23 nov. 2018, 15:14

si l'erreur s'affiche dans la page qui affiche le formulaire vierge, alors c'est normal, la page n'est pas appelée en méthode post donc $_POST['username'] n'existe pas. il ne faut accéder à $_POST['username'] que lorsqu'on clique sur le bouton pour soumettre le formulaire.

Re: undefined index

par blastouille » 23 nov. 2018, 14:59

Coucou merci de ta reponse,

$controlUser = $registerManager->reqUsername(); // Permet d’appeler la fonction de l'objet crée. (cette fonction se trouve dans mon fichier Register.php d'ou le require_once en début de code. effectivement dans le cas de la lecture du code que j'ai posté, elle ne fait rien tout simplement car j'ai pas tout mis.

PS: je vais rajouter le fichier View (la partie HTML) à la suite de ce message
<!DOCTYPE html>
<html lang="fr">
<head>
	<!----Meta Tags---->
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

	<!----CSS files---->
	<link rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.css">
	<link rel="stylesheet" type="text/css" href="css/style.css"> 
	<link rel="stylesheet" type="text/css" href="css/signin.css">

	<!----Js Lib---->
	<script src="http://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>

	<title><?= $title ?></title>
</head>

<body>
		
[PHP]
			<?php if(!empty($errors)): ?>
			<div class="alert alert-danger">
				<p>Vous n'avez pas rempli le formulaire correctement</p>
				<ul>
					<?php foreach ($errors as $error): ?>
						<li><?= $error; ?></li>
					<?php endforeach; ?>
				</ul>
			</div>
			<?php endif; ?>
[/PHP]

	<form class="form-signin" method="POST">

		<h1>Veuillez remplir le formulaire</h1>

			

			<div class="form-group">
			    <label for="">Pseudo</label>
			    <input type="text" name="username" class="form-control">
			</div>

			<div class="form-group">
			    <label for="">Email</label>
			    <input type="email" name="email" class="form-control">
			</div>

			<div class="form-group">
			    <label for="">Mot de passe</label>
			    <input type="password" name="password" class="form-control">
			</div>

			<div class="form-group">
			    <label for="">Confirmez votre mot de passe</label>
			    <input type="password" name="password_confirm" class="form-control">
			</div>

		<button type="submit" class="btn btn-primary">Enregister</button>
		<button type="button" class="btn btn-secondary"><a href="index.php">Annuler</a></button>

		</form>
	</div>
</body>

Re: undefined index

par or 1 » 23 nov. 2018, 14:40

c'est le code html du formulaire qu'il faudrait.

en passant :
$controlUser = $registerManager->reqUsername();
la fonction reqUsername ne retourne rien. utiliser $_POST['username'] dans une telle fonction me parait être une horreur, mais je ne suis pas spécialiste du MVC.

une telle ligne
$controlRegister;
ne fait rien.

undefined index

par blastounet » 23 nov. 2018, 14:25

Bonjour à tous,

Je suis actuellement en formation développeur web junior et je suis sur un projet en PHP, je rencontre un problème dont je ne trouve pas de solution, j'espère que vous pourrez m'aider a m'éclairer sur le sujet.

Donc avant toute chose, je tiens a préciser que mon projet a été crée dans une architecture MVC. Je rencontre une erreur à la suite de mon formulaire qui me dit Undefined index: username Donc évidement après plusieurs recherche, j'ai pu comprendre qu'il s'agit d'une variable non defini, Hors dans mon cas, elles le sont. cependant cela provient probablement de mon archétype MVC. je vais donc vous partager une partie de mon code avec vous.
//Mon fichier Model/register.php
<?php
require_once("model/Manager.php");

class Registers extends Manager
{	

	public function reqUsername()
	{	
		$db = $this->dbConnect();
		$req = $db->prepare('SELECT id FROM users WHERE username = ?');
		$req->execute([$_POST['username']]);   [b]//l'erreur pointe sur cette ligne[/b]
		$user = $req->fetch();
	}	
} 
Et maintenant voici mon fichier controller
<?php
// Mon fichier controller
// Chargement des classes
require_once('model/Register.php');

function register()
{    
    require('view/frontend/registerView.php');
    $registerManager = new Registers();
    $controlUser = $registerManager->reqUsername();
    $controlEmail = $registerManager->reqEmail();
    $controlRegister = $registerManager->reqRegister();
    $errors = array();

    if(!empty($_POST))
    {
        if (empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) 
        {
            $errors['username'] = "Votre pseudo n'est pas valide";
        } else {
            $controlUser;
            if ($user)
            {
                $errors['username'] = "Ce pseudo est déjà pris";
            }
        }

        if (empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
        {
            $errors['email'] = "Votre email n'est pas valide";
        } else {
            $controlEmail;
            if ($user) 
            {
                $errors['email'] = "Cet email est déjà pris";
            }
        }

        if (empty($_POST['password'])) 
        {
            $errors['password'] = "Votre mot de passe n'est pas valide";
        }

        if ($_POST['password'] != $_POST['password_confirm']) 
        {
            $errors['password'] = "Votre mot de passe est différent de celui de confirmation";
        }

        if(empty($errors))
        {
            $controlRegister;
        }
    }
}

Merci d'avance , si vous avez besoin de + d'infos comme le code de mon fichier view ou le code de mon fichier routeur n'hesitez pas