Erreur fatale sur PDO
Résolu
chabinot
Messages postés
391
Statut
Membre
-
chabinot Messages postés 391 Statut Membre -
chabinot Messages postés 391 Statut Membre -
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 t32 ✓ - Forum Livebox
- 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
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
2 réponses
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
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