probleme espace membre

Par AaFrederic Husson, il y a 6 ans


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

bidule, il y a 6 ans

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

AaFrederic Husson, il y a 6 ans

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

Carouge10, il y a 6 ans

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 ?

AaFrederic Husson, il y a 6 ans

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()); }
AaFrederic Husson, il y a 6 ans

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'; } }