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
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());
}