Erreur fatale sur PDO

Résolu/Fermé
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 - 5 déc. 2017 à 06:46
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 - 5 déc. 2017 à 11:41
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
<?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

2 réponses

yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
5 déc. 2017 à 11:21
bonjour, tu dois d'abord te connecter à ta base de données.
$bdd = new PDO(...);

https://www.php.net/manual/fr/pdo.connections.php
0
chabinot Messages postés 321 Date d'inscription mardi 10 novembre 2015 Statut Membre Dernière intervention 22 mars 2024 15
5 déc. 2017 à 11:41
Merci,
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
0