Bonjour,

j'ai un soucis avec la création de mon espace membre.
quand je valide le formulaire d'inscription j'obtiens l'erreur suivante:

Fatal error: Uncaught Error: Call to a member function prepare() on null in G:\Fred\Programmes_files\wamp64\www\social\model\functions.php:17 Stack trace: #0 G:\Fred\Programmes_files\wamp64\www\social\model\register.php(27): is_already_in_use('pseudo', 'alf233', 'users') #1 G:\Fred\Programmes_files\wamp64\www\social\controller\frontend.php(5): require('G:\Fred\Program...') #2 G:\Fred\Programmes_files\wamp64\www\social\index.php(12): home() #3 {main} thrown in G:\Fred\Programmes_files\wamp64\www\social\model\functions.php on line 17

donc je vous met ma page register:

<?php
require ('model/functions.php');
require ('config/db_connect.php');

//Si le formulaire a été soumis
if (isset($_POST['register'])) {
    //Si tous les champs ont été remplis
    if (not_empty(['pseudo', 'genre', 'email', 'password', 'confirm'])) {
        $errors = [];
        extract($_POST);

        if (mb_strlen($pseudo) < 3) {
            $errors[] = 'Pseudo trop court! (Minimum 3 caractères)';
        }
        if (empty($genre)) {
            $errors[] = 'Veuillez préciser votre genre!';
        }
        if (! filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $errors[] = 'Adresse email invalide!';
        }
        if (mb_strlen($password) < 3) {
            $errors[] = 'mot de passe trop court! (Minimum 3 caractères)';
        }
        if ($password != $confirm) {
            $errors[] = 'Les deux mots de passe ne concordent pas!';
        }
        if (is_already_in_use('pseudo', $pseudo, 'users')) {
            $errors[] = 'Pseudo déjà utilisé!';
        }
        if (is_already_in_use('email', $email, 'users')) {
            $errors[] = 'Adresse email déjà utilisé!';
        }
        if (count($errors) == 0) {
            //envoie du mail d'actvation
            $to = $email;
            $subject = WEBSITE_NAME." - ACTIVATION DE COMPTE";
            $token = sha1($pseudo.$email.$password);

            ob_start();
            require ('/view/frontend/template/email/activation.tmpl.php');
            $activation = ob_get_clean();

            $headers = 'MIME-Version: 1.0' . "\r\n";
            $headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

            mail($to, $subject, $activation, $headers);

            echo "Mail d'activation envoyé!";

        }

    }
    else {
        $errors[] = 'Veuillez remplir tous les champs';
    }
}

et mon fichier functions.php

<?php
if (!function_exists('not_empty')) {
    function not_empty ($fields = []) {
        if (count($fields != 0)) {
            foreach ($fields as $field) {
                if (empty($_POST[$field]) || trim($_POST[$field]) == "") {
                    return false;
                }
            }
            return true;
        }
    }
}
if (!function_exists('is_already_in_use')) {
    function is_already_in_use($field, $value, $table) {
        global $db;
        $q = $db->prepare("SELECT id from $table WHERE $field = ?");
        $q->execute([$value]);
        $count = $q->rowCount();
        $q->closeCursor();
        return $count;
    }
}

si quelqu'un à une solution

5 réponses


AaFrederic Husson
Auteur
Réponse acceptée

bon ben en fait ça ne venais pas de là
le problème venais de la variable global
voir ci-dessous...

if (!function_exists('is_already_in_use')) {
    function is_already_in_use($field, $value, $table) {
        global $db;
        $q = $db->prepare("SELECT id from $table WHERE $field = ?");
        $q->execute([$value]);
        $count = $q->rowCount();
        $q->closeCursor();
        return $count;
    }
}

j'ai donc supprimé db_connect.php et rajouter une fonction dbConnect au début de mon fichier functions.php

<?php
function dbConnect() {
    try {
        $db = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USERNAME, DB_PASSWORD);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $db;
    } catch (PDOException $e) {
        die('Erreur: '.$e->getMessage());
    }
}
if (!function_exists('not_empty')) {
    function not_empty ($fields = []) {
        if (count($fields != 0)) {
            foreach ($fields as $field) {
                if (empty($_POST[$field]) || trim($_POST[$field]) == "") {
                    return false;
                }
            }
            return true;
        }
    }
}
if (!function_exists('is_already_in_use')) {
    function is_already_in_use($field, $value, $table) {
        $db = dbConnect();
        $q = $db->prepare("SELECT id from $table WHERE $field = ?");
        $q->execute([$value]);
        $count = $q->rowCount();
        $q->closeCursor();
        return $count;
    }
}

et donc mon fichier register.php

<?php
require ('config/constants.php');
require ('model/functions.php');

//Si le formulaire a été soumis
if (isset($_POST['register'])) {
    extract($_POST);
    //Si tous les champs ont été remplis
    if (not_empty(['pseudo', 'genre', 'email', 'password', 'confirm'])) {
        $errors = [];

        if (mb_strlen($pseudo) < 3) {
            $errors[] = 'Pseudo trop court! (Minimum 3 caractères)';
        }
        if (empty($genre)) {
            $errors[] = 'Veuillez préciser votre genre!';
        }
        if (! filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $errors[] = 'Adresse email invalide!';
        }
        if (mb_strlen($password) < 3) {
            $errors[] = 'mot de passe trop court! (Minimum 3 caractères)';
        }
        if ($password != $confirm) {
            $errors[] = 'Les deux mots de passe ne concordent pas!';
        }
        if (is_already_in_use('pseudo', $pseudo, 'users')) {
            $errors[] = 'Pseudo déjà utilisé!';
        }
        if (is_already_in_use('email', $email, 'users')) {
            $errors[] = 'Adresse email déjà utilisé!';
        }
        if (count($errors) == 0) {
            //envoie du mail d'actvation
            $to = $email;
            $subject = WEBSITE_NAME." - ACTIVATION DE COMPTE";
            $token = sha1($pseudo.$email.$password);

            ob_start();
            require ('view/frontend/template/emails/activation.tmpl.php');
            $activation = ob_get_clean();

            $headers = 'MIME-Version: 1.0' . "\r\n";
            $headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

            mail($to, $subject, $activation, $headers);

            echo "Mail d'activation envoyé!";

        }

    }
    else {
        $errors[] = 'Veuillez remplir tous les champs';
    }
}

salut

a mon avis le pb vient d'ici

$q->execute([$value])

enlève les crochets car $value est déjà un tableau de valeur.

le message indique que l'une de tes valeurs que tu passes a ta fonction est vide

non ça ne change rien
pourtant j'ai bien toutes les valeurs:

is_already_in_use('pseudo', 'alf233', 'users')

donc ma fonction demande d'aller vérifier si le pseudo est déjà utilisé

SELECT id from users WHERE pseudo = alf233"

mais je vois pas ou ça cloche

Bonjour,
$db est null comme l'indique le message d'erreur.
Donc je pencherai pour inverser les 2 requires du début afin de faire la connexion avant les fonctions.
Peut-on voir le fichier db_connect ?

j'ai inversé et mis db_connect en premier mais ça change rien

voici son contenu

<?php

require ('constants.php');

try {
    $db = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USERNAME, DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //$db->query('SELECT * FROM users');
} catch (PDOException $e) {
    die('Erreur: '.$e->getMessage());
}