Uncaught Error: Call to a member function prepare() on null in

Par akkomah, il y a 5 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Voici mon code

<?php session_start(); $hote = "localhost"; $user = "root"; $password = ""; global $pdo; try { $pdo = new pdo('mysql:host='.$hote.';dbname=base', $user,$password); } catch (Exception $e) { $e->getMessage(); } $err = 0; $err1 = 0; $err2 = 0; $err3 = 0; if(isset($_POST['username']) && !empty($_POST['username'])) { $username = $_POST['username']; }else { $username = ''; $err++; } if(isset($_POST['mdp']) && !empty($_POST['mdp'])) { $mdp = $_POST['mdp']; }else { $mdp = ''; $err++; } if (!empty($username) and !empty($mdp)) { $user = $pdo->prepare('SELECT * FROM personne WHERE NOM_PER = ? AND pass = ?'); $user->execute(array($username,$mdp)); $userexist = $user->rowCount(); if ($userexist == 1) { $userdata = $user->fetch(); $_SESSION['u_id'] = $userdata['ID_PER']; $u_id = $_SESSION['u_id'] ; $statut = $userdata['STATUT']; if ($statut == 'DG') { header('location: ../pages/index.php?user='.$u_id.''); }else{ header('location: ../page/index.php?user='.$u_id.''); } }else { if ($userdata == 0) { header('location: ../login.php?cu=1'); }else if($err != 0) { header('location: ../login.php?cu=2'); } } } ?>

Ce que je veux

Je voudrais me connecter via un compte utilisateur créé manuellement dans la bdd.

Ce que j'obtiens

et je recois comme message d'erreur : PHP Fatal error: Uncaught Error: Call to a member function prepare() on null in................................ on line 34.
Merci pour votre aide
Cordiallement

akkomah

18 réponses

Carouge10, il y a 5 ans

Bonsoir,
Activation des erreurs PDO (cf la doc de php) et $e-getmessage c'est bien mais il faut aussi l'afficher
Etonnant d'avoir un nom de champs en majuscules et un en minuscule. (enfin ça ne viens pas de là)
Et c'est Location et non location (fonctionne en local mais en fois en ligne c'est moins sur)

akkomah, il y a 5 ans

Merci pour ta réponse Courage10. je me penche la-dessus et je te reviens

akkomah, il y a 5 ans

Toutes mes excuses pour le dérangement mais je n'y arrive toujours pas. Même après avoir corrigé (location et passé le nom du champs pass en PASS) je reçois toujours la même erreur.
Je débute à peine avec php et mysql ; aidez moi s'il vous plait
Merci une fois encore à la communauté

Carouge10, il y a 5 ans

je disais aussi qu'il faut faire un écho de $e-> getmessage

akkomah, il y a 5 ans

Je viens de corriger mon code côté "erreur" et par surprise le message que je recois maintenant a changé.
Échec de la connexion : SQLSTATE[28000] [1045] Access denied for user 'wwwdomaine_root'@'46.4.210.192' (using password: YES) alors que les informations sont correctes !!! pfffff je sais que je commence par déranger un peu mais.... svp
Voici mon nouveau code:

<?php session_start(); $hote = "www.mondomaine.com"; $user = "wwwdomaine_root"; $password = "90045889652"; global $pdo; try { $pdo = new pdo('mysql:host='.$hote.';dbname=wwwzonepro_base', $user,$password); } catch (PDOException $e) { echo 'Échec de la connexion : ' . $e->getMessage(); exit; } $err = 0; $err1 = 0; $err2 = 0; $err3 = 0; if(isset($_POST['username']) && !empty($_POST['username'])) { $username = $_POST['username']; }else { $username = ''; $err++; } if(isset($_POST['mdp']) && !empty($_POST['mdp'])) { $mdp = $_POST['mdp']; }else { $mdp = ''; $err++; } if (!empty($username) and !empty($mdp)) { $user = $pdo->prepare('SELECT * FROM personne WHERE NOM_PER = ? AND PASS = ?'); $user->execute(array($username,$mdp)); $userexist = $user->rowCount(); if ($userexist == 1) { $userdata = $user->fetch(); $_SESSION['u_id'] = $userdata['ID_PER']; $u_id = $_SESSION['u_id'] ; $statut = $userdata['STATUT']; if ($statut == 'DG') { header('Location: ../pages/index.php?user='.$u_id.''); }else{ header('Location: ../page/index.php?user='.$u_id.''); } }else { if ($userdata == 0) { header('Location: ../login.php?cu=1'); }else if($err != 0) { header('Location: ../login.php?cu=2'); } } } ?>
Carouge10, il y a 5 ans

entre l'erreur et ton code, le user n'est pas le même

Lartak, il y a 5 ans

Bonjour.
L'utilisation de global ne se fait qu'à l'intérieur d'une fonction pour accéder à la variable qui en est externe, tu peux donc commencer par supprimer son utilisation dans ce fichier.
Tu peux également supprimer l'utilisation de la fonction isset si tu utilises la fonction empty par la suite pour la même variable.
Remplaces donc par exemple:

if (isset($_POST['username']) && !empty($_POST['username'])) // Par if (!empty($_POST['username']))

Car la fonction empty ne fais pas que vérifier la valeur de la variable, mais également son existence.

akkomah, il y a 5 ans

bonsoir
Courage10 stp j'ai pas compris.

akkomah, il y a 5 ans

Lartak merci pour ton aide mais lorsque je supprime la fonction global du fichier, je recois comme message d'erreur : class pdo not found !

akkomah, il y a 5 ans

SVP les amis, pouvez vous me corriger le code pour que je puisse avancer un peu? ça fait quasiment une semaine que suis coincé là.
merci d'avance

Carouge10, il y a 5 ans

autant pour moi, j'ai confondus $user et $dbname.
Es-tu de te connecter à la bonne BDD ? il y a surement le port à ajouter dans la connexion. Tu te connectes à mariaDB alors que tu utilises mysql

akkomah, il y a 5 ans

ok je vais ajouter le port voir ce que ça donne

akkomah, il y a 5 ans

Bonjour
toujours besoin de votre aide les pro. j'ai ajouté le port mais l'erreur persiste : Failed to connect to MySQL: Access denied for user 'wwwdomaine_root'@'46.4.210.192' (using password: YES)

Carouge10, il y a 5 ans

montre nous le code avant les modification demandé

akkomah, il y a 5 ans

Suite à de nombreux test infructueux, j'ai jugé bon de tester la connexion vers ma base de données sql pour voir si tout allait bien et à ma grande surprise, même avec mon fichier de test, la connexion est impossible. Toujours le même message d'erreur : Failed to connect to MySQL: Access denied for user 'wwwdomaine_root'@'46.4.210.192' (using password: YES)
voici le code de ma page de test (testconnexion.php)

<!DOCTYPE html> <html> <head> <title>TEST</title> <meta charset="utf-8"> </head> <body> <h1>Test bases de données MySQL</h1> <?php $servername = 'www.mondomaine.com'; $username = 'wwwdomaine_root'; $password = 'monmotdepasse'; $conn = new mysqli($servername, $username, $password); if($conn->connect_error){ die('Erreur : ' .$conn->connect_error); } echo 'Connexion réussie'; ?> </body> </html>
Carouge10, il y a 5 ans

le port est absent comme indiqué et en plus passer de PDO à mysqli ne vas rien changé
est-ce que ton serveur de BDD accepte les connexion extérieur ?

akkomah, il y a 5 ans

Merci courage10. Comme mentionné tout haut, je débute en php et je n'est pas encore une grande connaissance en la matière. Alors dis moi stp, comment faire pour savoir si mon serveur de BDD accepte les connexions extérieur ?

Lartak, il y a 5 ans

Bonjour.

comment faire pour savoir si mon serveur de BDD accepte les connexions extérieur ?

Si le serveur de la base de données est chez un hébergeur et que tu tentes de t'y connecter à distance, il te faut vérifier auprès de l'aide de l'hébergeur en question et selon l'offre que tu détient, afin de savoir si tu peux y accéder à distance ou non.