Bonjour , voila depuis 2 jours j'ai c'est erreur qui apparaissent
( ! ) Notice: Undefined variable: categorie in D:\wamp64\www_forum\creer-topic.php on line 21
( ! ) Notice: Undefined variable: titre in D:\wamp64\www_forum\creer-topic.php on line 20

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

        $titre = (string) ucfirst(trim($titre));
        $categorie = (int) $categorie;
        $contenu = (string) trim($contenu);

        if (empty($titre)){
            $valid = false;
            $err_titre = "ce champ n'est pas valide";

        }elseif(grapheme_strlen($titre) < 5){
            $valid = false;
            $err_titre = "le titre doit faire plus de 5 caractere";
        }elseif(grapheme_strlen($titre) >= 25){
            $valid = false;
            $err_titre = "le titre doit faire moins de 26 caractere (" . grapheme_strlen($titre) . "/25)";
        }

        $req = $DB->prepare("SELECT id, titre
        FROM forum
        WHERE id = ?");
        $req->execute([$categorie]);

        $req_forum_verif = $req->fetch();

        if(!isset($req_forum_verif['id'])){
            $valid = false;
            $categorie = null;
            $err_cat = "Cette categorie n'existe pas";
        }

6 réponses


Bonjour,

Il faudrait limite donné tout le fichier pour comprendre.
Mais je remarque surtout la ligne suivante :

        $categorie = (int) $categorie;

Tu définis une variable par lui-même.
Comment peut elle exister ? Tu voulais dire ?

        $categorie = $_POST['categorie'];

Même chose pour 'titre' et 'contenue'. Il faut qu'elles aient une valeur. Il y a quoi plus haut, tu les définis par quoi ?

Il semble que les variables $categorie et $titre ne sont pas initialisées avant d'être utilisées dans la condition if(isset($_POST['creation'])). Cela signifie qu'elles ont la valeur undefined, ce qui entraîne l'affichage des messages d'erreur.

Pour résoudre ce problème, vous devriez initialiser ces variables avec une valeur par défaut avant de les utiliser dans la condition. Par exemple, vous pouvez les initialiser à null comme ceci :

$categorie = null;
$titre = null;

if(isset($_POST['creation'])){
// Récupération des valeurs soumises dans le formulaire
// et validation des données ici...
}
Vous pouvez également utiliser la fonction isset() pour vérifier si les variables ont été définies avant de les utiliser dans la condition, comme ceci :

if(isset($_POST['creation']) && isset($categorie) && isset($titre)){
// Récupération des valeurs soumises dans le formulaire
// et validation des données ici...
}

Cela devrait résoudre les messages d'erreur.

aussi, Le code ci-dessus semble contenir des erreurs. Voici comment je le corrigerais :

if (isset($_POST['creation'])) {
$titre = ucfirst(trim((string)$titre));
$categorie = (int)$categorie;
$contenu = trim((string)$contenu);
if (empty($titre)) {
$valid = false;
$err_titre = "ce champ n'est pas valide";
} else if (mb_strlen($titre) < 5) {
$valid = false;
$err_titre = "le titre doit faire plus de 5 caractères";
} else if (mb_strlen($titre) >= 25) {
$valid = false;
$err_titre = "le titre doit faire moins de 26 caractères (".mb_strlen($titre)."/25)";
}
$req = $DB->prepare("SELECT id, titre FROM forum WHERE id = ?");
// ...
}

J'ai remplacé l'utilisation de grapheme_strlen() par mb_strlen(), qui est une fonction PHP plus appropriée pour mesurer la longueur d'une chaîne de caractères en prenant en compte les encodages Unicode.
j'ai aussi ajouté des espaces autour des opérateurs pour améliorer la lisibilité du code.

et ici:

// Vérifier si la catégorie existe
$req = $pdo->prepare('SELECT id FROM categories WHERE id = ?');
$req->execute([$categorie]);
// Récupérer les données du forum
$req_forum_verif = $req->fetch();
// Si la catégorie n'existe pas, mettre les variables en conséquence
if(!isset($req_forum_verif['id'])){
$valid = false;
$categorie = null;
$err_cat = "Cette categorie n'existe pas";
}

Quelques remarques sur les changements effectués :
J'ai ajouté des commentaires pour expliquer ce que fait le code.
J'ai utilisé des noms de variables plus explicites pour clarifier leur utilisation.
J'ai reformulé la requête SQL pour qu'elle vérifie directement si l'ID de la catégorie existe dans la table categories.
J'ai séparé les différentes étapes de la vérification en plusieurs blocs pour améliorer la lisibilité du code.

Oui, tu n'auras pas de message d'erreur. Mais quel est l'utilité de déclarer une variable null ?
Elle le sera toujours.
Quel est ton objectif ?
Tu récupères la catégories où ? Pour récupérer quel information ? Pour en faire quoi ?

Pour résoudre l'erreur "Undefined variable", il faut s'assurer que les variables $categorie et $titre sont bien initialisées avant de les utiliser dans le script. Il y a plusieurs façons de faire cela :

Initialiser les variables avec une valeur par défaut avant de les utiliser dans la condition, comme ceci :
$categorie = null;
$titre = null;

if(isset($_POST['creation'])){
// Récupération des valeurs soumises dans le formulaire
// et validation des données ici...
}

Utiliser la fonction isset() pour vérifier si les variables ont été définies avant de les utiliser dans la condition, comme ceci :
if(isset($_POST['creation']) && isset($categorie) && isset($titre)){
// Récupération des valeurs soumises dans le formulaire
// et validation des données ici...
}

Récupérer les valeurs de $categorie et $titre depuis le formulaire en utilisant la superglobale $_POST. Par exemple :
if(isset($_POST['creation'])){
$categorie = $_POST['categorie'];
$titre = $_POST['titre'];
// Validation des données ici...
}

En utilisant l'une de ces méthodes, vous devriez être en mesure de résoudre l'erreur "Undefined variable".
Initialiser une variable à null signifie lui donner une valeur vide ou "non définie". Cela peut être utile dans le cas où la variable n'a pas encore de valeur définie, ou si la valeur de la variable n'est pas connue à ce stade.

Dans le code donné, initialiser $categorie et $titre à null avant de les utiliser dans la condition if(isset($_POST['creation'])) peut être utile pour éviter les messages d'erreur "Undefined variable" lorsque la condition est exécutée. Cela permet également de s'assurer que ces variables ont une valeur définie avant de les utiliser dans le script.

En ce qui concerne l'objectif de récupérer la catégorie, il s'agit de récupérer l'identifiant de la catégorie sélectionnée dans le formulaire. Cette valeur peut être utilisée pour vérifier si la catégorie sélectionnée existe dans la base de données, en exécutant une requête SQL avec cet identifiant comme paramètre. Si la catégorie existe, le script peut continuer à exécuter le traitement de la requête de création de nouveau sujet de forum. Si la catégorie n'existe pas, le script peut afficher un message d'erreur indiquant que la catégorie sélectionnée n'existe pas.

Récupérer l'identifiant de la catégorie sélectionnée dans le formulaire en utilisant la superglobale $_POST.

Exécuter une requête SQL pour vérifier si la catégorie existe dans la base de données en utilisant l'identifiant comme paramètre. Vous pouvez utiliser une requête de type SELECT pour récupérer les informations de la catégorie correspondante.

Si la catégorie existe, continuer à exécuter le traitement de la requête de création de nouveau sujet de forum.

Si la catégorie n'existe pas, afficher un message d'erreur indiquant que la catégorie sélectionnée n'existe pas. Vous pouvez utiliser une condition if-else pour vérifier si la requête a retourné une ligne de résultat, et afficher le message d'erreur si la condition est vraie.

Un p'ti exemple de code qui illustre cette logique :

if(isset($_POST['creation'])){
$categorie = $_POST['categorie'];

$req = $DB->prepare("SELECT id FROM forum WHERE id = ?");
$req->execute([$categorie]);

$req_cat_verif = $req->fetch();

if(isset($req_cat_verif['id'])){
// Catégorie existe, continuer à exécuter le traitement de la requête de création de nouveau sujet de forum
} else {
// Catégorie n'existe pas, afficher un message d'erreur
$err_cat = "Cette catégorie n'existe pas";
}
}

En t'inspirant de ce codes vérifie d'abord si le formulaire de création de nouveau sujet a été soumis, puis récupère l'identifiant de la catégorie sélectionnée. Ensuite, exécutes une requête SQL pour vérifier si la catégorie existe dans la base de données. Si la catégorie existe, le traitement de la requête de création de nouveau sujet de forum est exécuté. Si la catégorie n'existe pas, un message d'erreur est affiché. Tu peux aussi afficher le message d'erreur en utilisant une balise HTML comme <p> ou <div>, ou en utilisant une fonction de rappel d'erreur dans votre script de présentation.