Uncaught Error: Call to undefined method Database::prepare()
Résolu
chabinot
Messages postés
322
Date d'inscription
Statut
Membre
Dernière intervention
-
chabinot Messages postés 322 Date d'inscription Statut Membre Dernière intervention -
chabinot Messages postés 322 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Call to undefined function mysql_error()
- Cmos checksum error ✓ - Forum Carte-mère/mémoire
- Playback error reconnect in 3s (1/5) francais - Forum Box et Streaming vidéo
- Error 1962 ✓ - Forum PC fixe
- Whea error occt - Forum Processeur
- A javascript error occurred in the main process - Forum Matériel & Système
2 réponses
Bonjour
Comme le dit le message, ta classe Database n'a pas de méthode prepare. Dans ton code, je ne vois que le constructeur et is_already_in_use.
Tu peux appeler directement $bdd->pdo.prepare(... puisque ta connexion PDO, c'est la propriété $pdo (pas définie, d'ailleurs) de ta classe. Mais tant qu'à définir une classe, tu peux aussi lui définir sa méthode prepare (qui se contentera d'appeler celle de PDO) et appeler ainsi $bdd->prepare(... sans provoquer d'erreur.
Comme le dit le message, ta classe Database n'a pas de méthode prepare. Dans ton code, je ne vois que le constructeur et is_already_in_use.
Tu peux appeler directement $bdd->pdo.prepare(... puisque ta connexion PDO, c'est la propriété $pdo (pas définie, d'ailleurs) de ta classe. Mais tant qu'à définir une classe, tu peux aussi lui définir sa méthode prepare (qui se contentera d'appeler celle de PDO) et appeler ainsi $bdd->prepare(... sans provoquer d'erreur.
Merci beaucoup, maintenant cela marche comme je veux, je te montre ce que j'ai fait :
1 - Source Database.php
J'ai ajouté la fonction "prepare".
2 - Source register.php
Cordialement,
1 - Source Database.php
<?php class Database { private $db_host = 'localhost'; private $db_name = 'boom'; private $db_port = 3309; private $db_charset = 'utf8'; private $db_user = 'root'; private $db_password = ''; private $dsn; private $pdo; private $error; public function __construct() { $this->dsn = "mysql:host={$this->db_host};dbname={$this->db_name};port={$this->db_port};charset={$this->db_charset}"; try { $this->pdo = new PDO($this->dsn, $this->db_user, $this->db_password); $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { echo $this->error = 'Erreur: ' . $e->getMessage(); } } public function prepare(String $stmt, Array $fields = []):bool { $req = $this->pdo->prepare($stmt); $req->execute($fields); return $req; } public function is_already_in_use(String $field, String $value, String $table):bool { $req = $this->pdo->prepare("SELECT id FROM $table WHERE $field = ?"); $req->execute([$value]); $count = $req->rowCount(); $req->closeCursor(); return $count; } }
J'ai ajouté la fonction "prepare".
2 - Source register.php
<?php // Ouverture de la session session_start(); // URL $host = $_SERVER['HTTP_HOST']; $uri = $_SERVER['REQUEST_URI']; $url = sprintf("%s%s%s", "http://", $host, $uri); $http = explode('/', $url); $http = $http[0] . '//' . $http[2] . '/' . $http[3]; // Autoloading require __DIR__ . '/vendor/autoload.php'; // Envoi du courriel via PHPMailer use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; $mail = new PHPMailer(true); // Accès à la base de données $bdd = new Database(); // Gestion des erreurs $errors = new Errors(); // Traitement du formulaire soumis if (isset($_POST['register'])) { // Tous les champs ont été remplis ? if (not_empty(['name', 'pseudo', 'email', 'password', 'password_confirm'])) { extract($_POST); if (mb_strlen($name) < 3) { $error = $errors->setError('Nom trop court (minimum 3 caractères)'); } if (mb_strlen($pseudo) < 3) { $error = $errors->setError('Pseudonyme trop court (minimum 3 caractères)'); } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $error = $errors->setError('Adresse courriel invalide'); } if (mb_strlen($password) < 6) { $error = $errors->setError('Mot de passe trop court (minimum 6 caractères)'); } else { if ($password != $password_confirm) { $error = $errors->setError('Les deux mots de passe ne concordent pas'); } } if ($bdd->is_already_in_use('pseudo', $pseudo, 'users')) { $error = $errors->setError('Pseudonyme déjà utilisé'); } if ($bdd->is_already_in_use('email', $email, 'users')) { $error = $errors->setError('Adresse courriel déjà utilisée'); } if ($errors->countError() == 0) { $token = sha1($pseudo . $email . $password); // Envoi d'un courriel d'activation try { //Server settings $mail->CharSet = 'UTF-8'; //Recipients $mail->setFrom('contact@boom.com', 'Boom Social Network'); $mail->addAddress($email, $name); //Content $mail->isHTML(true); $mail->Subject = 'Boom Social Network - ACTIVATION DE COMPTE'; // Message HTML ob_start(); require __DIR__ . '/templates/emails/activation.tmpl.php'; $content = ob_get_clean(); $mail->Body = $content; $saveIsOk = $bdd->prepare('INSERT INTO users(name, pseudo, email, password) VALUE(:name, :pseudo, :email, :password)', [ 'name' => $name, 'pseudo' => $pseudo, 'email' => $email, 'password' => sha1($password) ]); if ($saveIsOk) { // Informer l'utilisateur de vérifier sa boîte de réception set_flash('Un courriel d\'activation de votre compte vous a été envoyé', 'success'); $mail->send(); // Redirection vers sa page de profil redirect('index.php'); } } catch (Exception $e) { echo 'Le courriel n\'a pas pu été envoyé.'; echo 'Erreur: ' . $mail->ErrorInfo; } } else { save_input_data(); } } else { $error = $errors->setError('Veuillez remplir tous les champs.'); save_input_data(); } } else { clear_input_data(); } // Titre $title = 'Inscription'; // Page register.view.php require __DIR__ . '/views/register.view.php';
Cordialement,