Bonjour,
j'ai une erreur où je cherche la solution mais sans succès...

Voici en gros le problème:
J'ai cette erreur: Fatal error: Call to a member function prepare() on a non-object in ***** on line 58
La ligne 58 correspond à:

                                                $req = $pdo->prepare('INSERT INTO        grades SET nom = :name,
                                                can_rapport = :can_rapport,
                                                can_msg = :can_msg,
                                                see_members = :see_members,
                                                edit_members = :edit_members,
                                                can_ban = :can_ban,
                                                can_website = :can_website,
                                                can_rank = :can_rank');

Mais mes variables sont ainsi:

                                                if(isset($_POST['can_rapport_oui'])): $can_rapport = 1; else: $can_rapport = 0; endif;
                                                if(isset($_POST['can_msg_oui'])): $can_msg = 1; else: $can_msg = 0; endif;
                                                if(isset($_POST['see_members_oui'])): $see_members = 1; else: $see_members = 0; endif;
                                                if(isset($_POST['edit_members_oui'])): $edit_members = 1; else: $edit_members = 0; endif;
                                                if(isset($_POST['can_ban_oui'])): $can_ban = 1; else: $can_ban = 0; endif;
                                                if(isset($_POST['can_website_oui'])): $can_website = 1; else: $can_website = 0; endif;
                                                if(isset($_POST['can_rank_oui'])): $can_rank = 1; else: $can_rank = 0; endif;

Donc je ne vois pas d'où vient le problème... SI quelqu'un serait m'aider sur ce sujet... :x

Et m'expliquer d'où vient le problème aussi svp.

11 réponses


Alex
Auteur
Réponse acceptée

Bien... Je vais de trouver la solution, j'ai pas tout compris mais en gros:

J'avais fais un require_once 'inc/sql.php', mais maintenant je fais un include à la place et ça marche.

Donc enfaite si, je crois avoir compris, le inc/sql.php est appelé dans une fonction, en require_once... Et dans ce cas je pense que ça a dit "INC/SQL.PHP est déjà appelé, donc pas besoin de ré-appeler le fichier".

En gros ma conclusion c'est ça.

Bonjour,

est-ce que tu peux nous donner du code situé avant ta ligne 58, surtout celle ou tu créer ton instance de ta variable PDO ?

Alex
Auteur

Avant la ligne de prepare, je demande de include le fichier SQL.PHP, qui contient:

<?php
    $pdo = new PDO('mysql:dbname=***********************************');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

Mais encore avant, j'ai mis le code avec les if(isset($_POST....))

Mais je doûte que ça vienne de SQL.PHP puisque $pdo marche dans mes autres code (de la page)

Tu suis bien cette disposition du code dans ton fichier ?

<?php
$pdo = new PDO(/* [...] */);
$stmt = $pdo->prepare('Requête');
// bindValue
$stmt->execute();

EDIT: Ton SQL.php corrigé, il manquait un simple quote, ça vient peut être de là

<?php
    $pdo = new PDO('mysql:dbname=***********************************');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
Alex
Auteur

Le quote je l'ai enlevé en mettant les étoiles :x

Si tu fais un var_dump($pdo);die(); avant de faire ton $req = $pdo->prepare('...');, tu obtiens quoi ?

Alex
Auteur

Bien, ça me renvoie NULL, donc ça vient enfaite du include, la destination du fichier est pas bonne.... Mais le truc c'est ... que je sais pas je vais voir

Voici aussi l'arborescense de mon site:

index.php - Include SQL.PHP, et fait la fonction... SQL.PHP se trouve dans le dossier inc...
Et le require est: "require_once 'inc/sql.php"... Se qui marche sur mes autres pages.

Ton erreur signifie que l'objet PDO n'est pas passé à ta page. As tu vérifié l'ordre des requires dans tes fichiers ?
Si tu est dans une fonction à tu pensé a faire un
global $pdo

Si tu as inclus dans d'autres fichiers ton sql.php le require_once ne va pas l'inclure donc effectivement un require seul suffit, mais tu risques d'initialiser PDO plusieurs fois

Alex
Auteur

Non, car $pdo est mis dans le fichier fonction, et non index

Au pire, tu peux créer une classe statique qui se chargera de gérer l'initialisation de PDO

Après il suffit de faire (C'est un exemple et une suggestion, t'est pas obligé de faire ça)

// Ta classe Database
require_once 'Database.php'; 
// Ici il faut le once sinon tout va bugger

/* Ton code... */

$pdo = Database::PDO();

/* Ton code... */

Après si t'est pas à l'aise avec la POO tu peux toujours te débrouiller avec des requires