Bonjour,

Voila je rencontre un petit problème avec mon code.
Je cherche à afficher des messages d'erreurs à coté des inputs le probleme c'est que quand on remplit les champs avec des information incorrect j'ai bien les messages d'erreurs, mais des que je remplit les champs avec des information correct j'ai cet erreur la

Notice: Undefined index: title in C:\xampp\htdocs\emploi\v2\assets\includes\settings\class\form.php on line 72

Ce que je fais

Fichier creat.php

<?php 

    $db = App::getDatabase();

    $validator = new form($_POST);

    $validator->str('title', "Vous devez renseigner un titre valide");

    $validator->str('name', "Vous devez renseigner votre nom valide");

    $validator->str('address', "Vous devez renseigner votr adresse valide");

    $validator->str('prenom', "Vous devez renseigner votre prénom valide");

    $validator->email('email', "Vous devez renseigner une adresse mail valide");

    $validator->str('label', "Les espaces et les caractères spéciaux ne sont pas autorisés");   

    $validator->description('description', "Vous ne pouvez pas soumettre une annonce sans description");    

    if($validator->valide()) {

    } else { 

        if(isset($_POST['submit'])) {

            $title = $validator->getError('title');
            $name = $validator->getError('name');
            $address = $validator->getError('adresse');
            $prenom = $validator->getError('prenom');
            $email = $validator->getError('email');
            $label = $validator->getError('label');
            $description = $validator->getError('description');
        }

    }

Fichier form.php

<?php 

    class form {

        private $data;
        private $errors = [];

        public function __construct($data) {

            $this->data = $data;

        }

        private function getField($field) {

            if(!isset($this->data[$field])) {

                return null;

            }

            return $this->data[$field];

        }

        public function str($field, $error) {

            if(!preg_match('/^[a-zA-Z0-9]+$/', $this->getField($field))) {

               $this->errors[$field] = $error;

            }

        }

        public function email($field, $error) {

             if(!filter_var($this->getField($field), FILTER_VALIDATE_EMAIL)) {

                 $this->errors[$field] = $error;

            }

        }

        public function description($field, $error) {

            if(!empty($field)) {

                $this->errors[$field] = $error;
            }

        }

        public function valide() {

            return empty($this->errors);
        }

        public function getError($field) {
        // C'est la ligne 72
            return $this->errors[$field];
        }

    }

code html

    <div class="input-margin">
        <input type="text" name="title">
        <i class="material-icons input-icon">format_quote</i>
    </div>
    <?php if(isset($title)) { echo $title; } ?>

    <div class="input-margin">
        <input type="text" name="name">
        <i class="material-icons input-icon">format_quote</i>
    </div>
    <?php if(isset($name)) { echo $name; } ?>

    <div class="input-margin">
        <input type="text" name="address">
        <i class="material-icons input-icon">format_quote</i>
    </div>
    <?php if(isset($address)) { echo $address; } ?>

    <div class="input-margin">
        <input type="text" name="prenom">
        <i class="material-icons input-icon">format_quote</i>
    </div>
    <?php if(isset($prenom)) { echo $prenom; } ?>

    <div class="input-margin">
        <input type="text" name="email">
        <i class="material-icons input-icon">format_quote</i>
    </div>
    <?php if(isset($email)) { echo $email; } ?>

    <div class="input-margin">
        <input type="text" name="label">
        <i class="material-icons input-icon">format_quote</i>
    </div>
    <?php if(isset($label)) { echo $label; } ?>

    <div class="input-margin">
        <input type="text" name="description">
        <i class="material-icons input-icon">format_quote</i>
    </div>
    <?php if(isset($description)) { echo $description; } ?>

8 réponses


Carouge10
Réponse acceptée

Bonjour,

Il serait plus judicieux de modifier la fonction ainsi pour éviter d'avoir des champs inexistants

public function getError($field) {
        // C'est la ligne 72
            return isset($this->errors[$field]) ? $this->errors[$field] : null;
        }
Motel
Auteur
Réponse acceptée

Merci beaucoup pour votre aide mon problème et résolu :D

Salut,

au début "errors" est vide :
private $errors = [];

Ensuite,
si tu fais une erreur (disons sur le titre par exemple),
alors errors[title] existera,
sinon il n'existera toujours pas.

Pourtant, avec ce code, si tu fais au moins une erreur,
alors tu essaies d'accéder à toutes les erreurs,
or elles n'existent pas forcément.

Essaie en modifiant un peu, comme ça ?

$title = $validator->getError('title') ?? '';
$name = $validator->getError('name') ?? '';
$address = $validator->getError('adresse') ?? ''; // attention à "address" / "adresse"
$prenom = $validator->getError('prenom') ?? '';
$email = $validator->getError('email') ?? '';
$label = $validator->getError('label') ?? '';
$description = $validator->getError('description') ?? '';

Attention,
tu n'as pas écrit "address" partout de la même façon
tu as un input name="address" (en Anglais),
$validator->str('address' (en Anglais),
et $validator->getError('adresse') (en Français)

Motel
Auteur

Salut SLK, merci beaucoup pour ta réponse alors j'ai essayer de faire $title = $validator->getError('title') ?? ''; mais cela me retourn cet erreur

Parse error: syntax error, unexpected '?' 

Ah mince,
est-ce que tu as une version de PHP inférieure à 7 ?
Parce-que c'est une nouvelle façon d'écrire qui est venue avec PHP 7.

Si oui, ce n'est pas grave,
écris-la simplement avec l'ancienne façon :

$title = isset($validator->getError('title')) ? $validator->getError('title') : '';
// ... faire la même chose pour les autres (name, address...)

@SLK: Tu as fais une petite erreur dans le code que tu lui montre, tu ne refermes pas le isset:p

oops xD

c'est corrigé, merci ^^

Motel
Auteur

Salut,

ça veut pas fonctionner ça me donne cette erreur Fatal error: Cannot use isset() on the result of a function call (you can use "null !== func()" instead)

j'ai essayer avec $title = !empty($validator->getError('title')) ? $validator->getError('title') : ''; j'ai pas d'erreur qui apparaît mais par contre
j'ai toujours ce message Notice: Undefined index: title in

J'ai la version 5.5.35 de php je travaill en local avec xampp.