Erreur fatale sur PDO
Résolu
chabinot
Messages postés
322
Date d'inscription
Statut
Membre
Dernière intervention
-
chabinot Messages postés 322 Date d'inscription Statut Membre Dernière intervention -
chabinot Messages postés 322 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis en train de suivre une formation création d'un réseau social sur youtube.
Je suis sur la partie Inscription. Au moment du test, il me renvoie une erreur fatale :
"Uncaught Error: Call to a member function prepare() on null in D:\serveur\www\boom\includes\functions.php on line 20".
Pour bien comprendre mon problème je mets les sources suivant:
1 - register.php
2 - register.view.php
3 - functions.php
4 - composer.json
Merci de m'aider, quand je pose la question à la personne qui a fait cette vidéo, je n'ai aucune réponse.
Cordialement
Je suis en train de suivre une formation création d'un réseau social sur youtube.
Je suis sur la partie Inscription. Au moment du test, il me renvoie une erreur fatale :
"Uncaught Error: Call to a member function prepare() on null in D:\serveur\www\boom\includes\functions.php on line 20".
Pour bien comprendre mon problème je mets les sources suivant:
1 - register.php
<?php require __DIR__ . '/vendor/autoload.php'; // Traitement du formulaire soumis if (isset($_POST['register'])) { // Tous les champs ont été remplis ? if (not_empty(['name', 'pseudo', 'email', 'password', 'password_confirm'])) { $errors = []; extract($_POST); if (mb_strlen($name) < 3) { $errors[] = 'Nom trop court (minimum 3 caractères)'; } if (mb_strlen($pseudo) < 3) { $errors[] = 'Pseudonyme trop court (minimum 3 caractères)'; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'Adresse courriel trop court'; } if (mb_strlen($password) < 6) { $errors[] = 'Mot de passe trop court (minimum 6 caractères)'; } else { if ($password != $password_confirm) { $errors[] = 'Les deux mots de passe ne concordent pas'; } } if (is_already_in_use('pseudo', $pseudo, 'users')) { $errors = 'Pseudonyme déjà utilisé'; } if (is_already_in_use('email', $email, 'users')) { $errors = 'Adresse courriel déjà utilisée'; } if (count($errors) == 0) { // Envoi d'un courriel d'activation $to = $email; $subject = WEBSITE_NAME . " - ACTIVATION DE COMPTE"; $token = sha1($pseudo . $email . $password); ob_start(); require __DIR__ . '/templates/emails/activation.tmpl.php'; $content = ob_get_clean(); $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; mail($to, $subject, $content, $headers); // Informer l'utilisateur de vérifier sa boîte de réception echo 'Courriel d\'activation envoyé'; // Redirection vers sa page de profil } } else { $errors[] = 'Veuillez remplir tous les champs.'; } } // Titre $title = 'Inscription'; // Afficher la pge HTML require __DIR__ . '/views/register.view.php';
2 - register.view.php
<?php include 'partials/_header.php'; ?> <div id="main-content"> <div class="container-fluid"> <h1>Devenez dès à présent membre</h1> <form method="post" class="well col-md-6"> <!-- Name field --> <div class="form-group"> <label class="control-label" for="name">Nom <span>*</span></label> <input type="text" class="form-control" id="name" name="name" placeholder="Votre nom"> </div> <!-- Pseudo field --> <div class="form-group"> <label class="control-label" for="pseudo">Pseudo <span>*</span></label> <input type="text" class="form-control" id="pseudo" name="pseudo" placeholder="Votre pseudo"> </div> <!-- Email field --> <div class="form-group"> <label class="control-label" for="email">Adresse Courriel <span>*</span></label> <input type="email" class="form-control" id="email" name="email" placeholder="email@domaine.com"> </div> <!-- Password field --> <div class="form-group"> <label class="control-label" for="password">Mot de passe <span>*</span></label> <input type="password" class="form-control" id="password" name="password" placeholder="Votre mot de passe"> </div> <!-- Password confirmation field --> <div class="form-group"> <label class="control-label" for="password_confirm">Confirmer votre mot de passe <span>*</span></label> <input type="password" class="form-control" id="password_confirm" name="password_confirm"> </div> <!-- Bouton enregistrer --> <input type="submit" class="btn btn-primary" name="register" value="Inscription"> </form> </div><!-- /.container --> </div> <?php include 'partials/_footer.php'; ?>
3 - functions.php
<?php if (!defined('not_empty')) { function not_empty($fields = []):bool { if (count($fields) != 0) { foreach ($fields as $key => $field) { if (empty($_POST[$field]) || trim($_POST[$field]) == '') { return false; } } return true; } } } if (!defined('is_already_in_use')) { function is_already_in_use($field, $value, $table):bool { global $bdd; $req = $bdd->prepare("SELECT id FROM $table WHERE $field = ?"); $req->execute([$value]); $count = $req->rowCount(); $req->closeCursor(); return $count; } } if (!defined('dump')) { function dump($value) { echo '<pre>'; print_r($value); echo '</pre>'; die(); } }
4 - composer.json
{ "autoload": { "classmap": [ "Classe" ], "files": [ "config/database.php", "includes/constants.php", "includes/functions.php" ] }, "psr-4": { "App\\": "app" }, "require-dev": { "fzaninotto/faker": "^1.7" } }
Merci de m'aider, quand je pose la question à la personne qui a fait cette vidéo, je n'ai aucune réponse.
Cordialement
A voir également:
- Erreur fatale sur PDO
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
2 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour, tu dois d'abord te connecter à ta base de données.
https://www.php.net/manual/fr/pdo.connections.php
$bdd = new PDO(...);
https://www.php.net/manual/fr/pdo.connections.php
Merci,
Mais je me connecte déjà à la base de donnée via composer.
Je te mets le code de config/database.php ici:
J'ai débogué à plusieurs endroit, et la connexion se fait bien
Merci pour ton aide
Mais je me connecte déjà à la base de donnée via composer.
{ "autoload": { "classmap": [ "Classe" ], "files": [ <gras> "config/database.php",</gras> "includes/constants.php", "includes/functions.php" ] }, "psr-4": { "App\\": "app" }, "require-dev": { "fzaninotto/faker": "^1.7" } }
Je te mets le code de config/database.php ici:
<?php // Variables de connexion - initialisation $db_host = 'localhost'; $db_name = 'boom'; $db_port = 3309; $db_charset = 'utf8'; $db_username = 'root'; $db_password = ''; // Data Source Name $dsn $dsn = "mysql:host={$db_host};dbname={$db_name};port={$db_port};charset={$db_charset}"; // Accès à la base de données try { $bdd = new PDO($dsn, $db_username, $db_password); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die('Erreur :' . $e->getMessage()); }
J'ai débogué à plusieurs endroit, et la connexion se fait bien
Merci pour ton aide