Bonjour !
Excusez moi de vous déranger, je suis un noob complet en php/html/css et aprés avoir lu les cours d'open classroom, j'ai voulu suivre le tuto de création d'espace membres pour comprendre les logiques des codes, et mettre le cerveau dans le camboui.
Je suivais les étapes, et alors que tout marchait, 10 sec avant, quand j'ai voulu déplacer la ligne de code d'accés à la BDD en require_once plus haut dans le code , j'ai eu cette erreur : Notice undefined variable : pdo on line 61.
Je ne sais pas afficher mon code notepad++ sur les forums comme certains font pour que ce soit plus lisible pour vous :-(
(si d'ailleurs vous savez, je prends !!! )
Si quelqu'un à la solution, je vois pas où j'ai merdouillé, mais n'y connaissant pas grand chose, cela ne m'étonne pas !!
Merci beaucoup...(mon fichier db.php est bien dans include, en dessous de register.php). J'ai revérifié mes codes, ils ont l'air bon, je comprends pas pourquoi il ne valide pas pdo alors qu'il est pour moi défini par ce que contient db.php. I'm lost :/
Je m'excuse par avance de la tonne de commentaires présents, c'est par ce que je prends des notes pour moi meme, ca doit etre encore moins facile à lire :/ Désolé
Acces Bdd
Et le code de la ligne 1 à la fin
![
![]![
Salut,
On voit rien sur tes captures d'écran, elles sont trop petite^^.
Mais ton erreur veut dire que la variable pdo n'est pas déclarée avant son utilisation vérifie que tu as bien mis ton include avant toute requète.
Hello,
Idem que shinix, capture illisible ! :)
Pour coller ton code, l'éditeur est en Markdown, donc suffit de faire :
` ` `php
//Ton super code
` ` `
(Sans les espaces au niveaux des ' ` ')
Sinon comme a dit shinix, cette erreur te dit que $pdo
n'est pas défini.
As tu vérifié que db.php
ne soie pas inclus dans un bloc if/else
?
Est que d'autres fichiers essayent d'accéder à db.php
avec require_once ?
Arf désolé....j'ai cru que les photos étaient miniaturisés mais qu'on pouvait cliquer dessus pour agrandir, my bad !
Merci pour l'astuce pour afficher le code. je l'affiche mais je crois que Browser a mis le doigt sur un truc avec l'inclusion dans un bloc if/else.
<?php require 'include/header.php';
?>
<?php
if(!empty($_POST)){
$errors = array(); // Permet de mettre les messages d'erreurs dans un tableau
require_once 'include/db.php'; // Appel la connexion à la BDD du fichier db.php contenant le code pour se connecter. Le _once s'assure que la connexion ne s'effectue qu'une seule fois, meme s'il y a plusieurs fois le require
if(empty($_POST['username']) OR !preg_match('/^[a-zA-Z0-9]+$/', $_POST['username'])){ // Si username est vide ou n'est pas alphanumérique underscore accepté, invalide grâce au regex
$errors['username'] = "Votre identifiant n'est pas valide";
} else {
$req = $pdo->prepare('SELECT id FROM users WHERE username= ?'); // $req = BDD prépare une recherche où ce qu'à rentrer l'utilisateur correpond il à une entrée username dans bdd
$req->execute([$_POST['username']]); // execute la recherche pour éviter l'injection SQL.les trois lignes de code permettent de vérifier qu'un login est unique, sinon il y aura une erreur dans $errors et il faudra que l'utilisateur change de login
$users = $req->fetch(); // $req est malheureusement illisible, c'est une réponse sql, on execute fetch pour recuperer la premiere entrée, il faut faire une boucle s'il ya plusieurs entrées à afficher. ici qu'une seule.
if($users){ // Cela signifie que si $users existe, ie, ne vaut pas 0, alors il ya une erreur
$errors['username'] = "Cet identifiant est déjà utilisé, veuillez en choisir un autre";
}
}
if(empty($_POST['email']) OR !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){ // Permet de vérifier que le champs email est rempli et qu'il respecte la forme d'un email
$errors['email'] = "Veuillez rentrer un email valide";
} else {
$req = $pdo->prepare('SELECT id FROM users WHERE email= ?');
$req->execute([$_POST['email']]);
$users = $req->fetch();
if($users){
$errors['email'] = "Cet email est déjà utilisé par un membre, veuillez en utiliser un autre";
}
}
if(empty($_POST['password']) OR $_POST['password'] != $_POST['password_confirm']){ // Si le password est différent de password_confirm, il ya une erreur, inutile donc de paramètrer password_confirm qui n'ira pas dans la BDD
$errors['password'] = "Votre mot de passe ne correspond pas";
}
if(empty($_POST['poste_pred']) OR $_POST['poste_pred'] == $_POST['postes_sec']){ // Le poste secondaire doit etre différent du poste de prédilection
$errors['postes_sec'] = "Votre poste secondaire ne peut pas être le même que votre poste de prédilection, veuillez choisir 'Aucun'";
}
}
if(empty($errors)){ // la connexion et la sauvegarde des donnees dans la BDD ne s'effectue que si $errors est vide !
$req = $pdo->prepare("INSERT INTO users SET username = ?, password = ?, email = ?, poste_pred = ?, postes_sec = ?, contact_skype= ?"); // On utilise le prepare pour ne pas direction enregistrer des données utilisateurs dans la bdd, on les mets d'abord dans $req
$password = password_hash($_POST['password'], PASSWORD_BCRYPT); // Permet de crypter le password sur la BDD avant d'executer l'écriture sur la BDD
$req->execute([$_POST['username'], $password, $_POST['email'], $_POST['poste_pred'], $_POST['postes_sec'], $_POST['contact_skype']]);
die('Votre postulation a bien été enregistrée');
}
debug($errors); // Affiche les erreurs contenus dans $errors dans un tableau array plus haut grace à la fonction debug. Sert uniquement pour le dev.
?>
<form action="" method="POST"> <! action n'a pas de cible pour reste sur la même page>
<fieldset>
<legend> Identifiants de connexion </legend>
<label for="Identifiant">Identifiant</label> <! Formulaire du login>
<input type="text" name="username" required autofocus /> <! required force à remplir le champs mais il faudra vérifier aprés l'html n'est pas sur autofocus pour mettre la souris directement dans le champs>
<label for="password">Mot de passe</label>
<input type="password" name="password" required /> <! le type password crypte l'écriture du mdp>
<label for="password_confirm">Confirmation du mot de passe</label>
<input type="password" name="password_confirm" required />
</fieldset>
<fieldset>
<legend> Postes maitrisés </legend>
<label for="poste_pred">Poste de Prédilection</label>
<select name="poste_pred" />
<optgroup label="Attaquants">
<option value="BU">BUteur</option>
<option value="9.5">9.5</option>
<option value="Ailier">AIlier</option>
<optgroup label="Milieux">
<option value="Meneur de jeu">Meneur de jeu</option>
<option value="Box to Box">Box to Box</option>
<option value="Milieu latéral"> Milieu latéral</option>
<option value="Milieu défensif">Milieu défensif</option>
<optgroup label="Défenseurs">
<option value="Défenseur latéral">Défenseur latéral</option>
<option value="Défenseur central">Défenseur central</option>
<optgroup label="Gardien de but">
<option value="Gardien de but">Gardien de but</option>
</optgroup>
</select>
<label for="Postes_sec">Postes secondaires</label>
<select name="postes_sec" />
<option value="Aucun">Aucun</option>
<optgroup label="Attaquants">
<option value="BU" selected>BUteur</option>
<option value="9.5">9.5</option>
<option value="Ailier">AIlier</option>
<optgroup label="Milieux">
<option value="Meneur de jeu">Meneur de jeu</option>
<option value="Box to Box">Box to Box</option>
<option value="Milieu latéral"> Milieu latéral</option>
<option value="Milieu défensif">Milieu défensif</option>
<optgroup label="Défenseurs">
<option value="Défenseur latéral">Défenseur latéral</option>
<option value="Défenseur central">Défenseur central</option>
<optgroup label="Gardien de but">
<option value="Gardien de but">Gardien de but</option>
</optgroup>
</select>
</fieldset>
<fieldset>
<legend> Correspondance </legend>
<label for="email">E-mail</label>
<input type="text" name="email" required />
<label for="contact_skype">Skype</label>
<input type="text" name="contact_skype" />
</fieldset>
<button type="submit">Postuler</button>
<?php require 'include/footer.php'; ?>
C'est fait !
Je crois que j'ai trouvé mon erreur, mon code d'insertion dans la BDD est en dehors du bloc if(!empty($_POST)), j'ai décalé mon accolade de fin pour inclure l'écriture sur la bdd et je n'ai plus d'erreur, c'était bien un soucis de If/else !
Merci !