Problème de PDO PREPARE

Ce sujet est résolu
Default
,

Bonjour,

Voila je rencontre un petit problème avec mon code.
En appelant ma fonction qui dans celle-ci à une requête préparé, mais malheureusement il y a une erreur quand justement j'essaye d'appelé celle-ci.
Il m'indiquent comme quoi $bdd(ma bdd pdo) est null donc n'existe pas alors que tout est bon au niveau des require

Donc, pour commencer on arrive sur index.php dessus on require le fichier common.php et qui lui charge les différents fichiers comme functions.php puis common_db.php(qui permet la connexion à la bdd)

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire

common.php APPEL > functions.php et common_db.php

// Load the functions script
require PUN_ROOT.'include/functions.php';

// Load DB abstraction layer and connect
require PUN_ROOT.'include/dblayer/common_db.php';

$pun_user = array();
check_cookie($pun_user); // je fait appel à ma fonction

functions.php

function check_cookie(&$pun_user)
{
    // Check if there's a user with the user ID and password hash from the cookie
    if(isset($_SESSION['id'], $_SESSION['username']) && !empty($_SESSION['id']) && !empty($_SESSION['username'])){
        #ligne du problème // connecté
        $result = $bdd->prepare("SELECT s.* FROM `s_accounts` s WHERE s.Username=:username AND s.id=:id");
        $result->execute(array('username' => htmlspecialchars($_SESSION['username']), 'id' => intval($_SESSION['username'])));
        $pun_user = $result->fetch();

        $pun_user['is_guest'] = false; // il est connecté          
    }
    else // il n'est pas connecté
}       set_default_user(); ->> fonction avec la même requête préparé qu'en haut et même erreur

common_db.php

try {   
    $bdd = new PDO('mysql:host=127.0.0.1;dbname=project;charset=utf8', 'root', ''); //LOCAL
  } catch(Exception $e)
{
    die(''.$e->getMessage());
}

Ce que je veux

Je cherche juste à faire en sorte de corriger l'erreur à propos de la base de donnée

Ce que j'obtiens

Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xamp\htdocs\include\functions.php:107(= ligne de ma requête prepare) Stack trace: #0 C:\xamp\htdocs\include\common.php(45): check_cookie(Array) #1 C:\xamp\htdocs\config.php(10): require('C:\\xamp\\htdocs\\...') #2 C:\xamp\htdocs\index.php(1): require_once('C:\\xamp\\htdocs\\...') #3 {main} thrown in C:\xamp\htdocs\include\functions.php on line 107

J'ai déjà regardé si ma requête prepare en était la cause mais non j'ai directement fait la requête dans le fichier ou je charge ma bdd et ça fonctionne parfaitement, donc je pense que c'est un problème de require qui charge pas bien la bdd, ou le fichier functions doit être chargé avant un certain fichiers etc.. bref, je ne vois pas du tout d'où cela pourrais venir

merci d'avance pour votre aide

4 Réponse

40917
,

Bonjour,

  • Vire ce htmlspecialchar qui n'est pas fait pour sécuriser une injections SQL mais la faille XSS donc à l'affichage
  • Active les erreurs PDO
  • Enfin $bdd est null dans ta fonction puisqu'elle n'est pas défini dans cette dernière (il faut la passer en paramètre). C'est ce qu'on appel "la portée des variables"
Default
,

Salut,
Déjà merci pour ta réponse,

  • Pour ce que tu as dit au niveau du htmlspecialchars en effet je l'ai bien supprimé je m'en suis rendu compte qu'il était inutile(il me semble en plus que le 'prepare' réduit aussi la possibilité d'une injections SQL)
  • Pour les erreurs PDO j'ai ajouté un $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); (car je pensais qu'avec le try catch c'était réglé mais apparament non..)
  • J'ai testé avec un global $bdd au début de ma fonction et j'ai l'impression que ça fonctionne cela m'affiche bien qu'il trouve quelque chose grace au var_dump puis la requête s'effectue parfaitement
40917
,

parfait donc tu as ce que tu veux ?
Autre chose, si tu fais un isset + !empty alors tu peux supprimer le isset car il est inclus dans la fonction empty
Et mettre un alias "s" à ta table perso je trouve cela unutile et ajoute des caractères pour rien. C'est surtout utile lors des jointures ou quand tu as plusieurs tables

Default
,

Oui, j'ai eu ce que je voulais.
Effectivement, le !empty + isset est pareil en faisant simplement un !empty, merci de la petite astuce ;)
Par rapport au "s" dans ma requête, c'est normal je le sais bien car plus tard j'en aurai besoin je prévois le coup
Merci pour toutes tes réponses