Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1167 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Call to a member function execute() on a non-object

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Call to a member function execute() on a non-object

n°1838498
Gavrinis
Open your mind
Posté le 15-01-2009 à 16:22:04  profilanswer
 

Bonjour,
 
J'ai un petit problème avec un bout de code pompé :whistle:. Bizarrement, il passe sous WAMP mais pas sous Apache/PHP, en bref en dev Ok, en prod pas OK. Je cherche depuis un moment ce qui bloque mais je ne vois pas très bien.
 

Code :
  1. $desired_theme_id = NULL;
  2. if (!empty($_GET['theme']) and is_numeric($_GET['theme']))
  3.  $desired_theme_id = intval($_GET['theme']);
  4. else
  5. {
  6.  if (empty($_SESSION['current_theme']))
  7.   $desired_theme_id = DEFAULT_THEME_ID;
  8. }
  9. if($desired_theme_id)
  10. {
  11.  $sql = 'SELECT id, nom, repertoire FROM themes WHERE id = :id_theme';
  12.  $statement = $db->prepare($sql);
  13.  $statement->execute(array(':id_theme' => $desired_theme_id));
  14.  if (!($theme = $statement->fetch()) or !is_dir(THEMES_ROOT_FOLDER.'/'.$theme['repertoire']))
  15.  {
  16.   $statement->execute(array(':id_theme' => DEFAULT_THEME_ID));
  17.   $theme = $statement->fetch();
  18.  }
  19.  $_SESSION['current_theme'] = $theme['repertoire'];
  20. }


Erreur : "Fatal error: Call to a member function execute() on a non-object in /var/www/common.php on line 62", la ligne 62 correspond à la 16 ici, le tableau GET ne contient rien car c'est la homepage (domaine.net), les constantes sont bien initialisées :

Code :
  1. define('DEFAULT_THEME_ID', 1);
  2. define('THEMES_ROOT_FOLDER', 'themes');


Merci d'éclairer ma lanterne.

mood
Publicité
Posté le 15-01-2009 à 16:22:04  profilanswer
 

n°1838502
macgawel
Posté le 15-01-2009 à 16:28:44  profilanswer
 

Bonjour.
 
Apparemment, ce qui ne lui plait pas c'est ça :

Code :
  1. $statement->execute(array(':id_theme' => $desired_theme_id));


A priori, je dirais que $statement n'est pas défini comme un objet - en prod'.
 
Essaye de faire un

Code :
  1. var_dump($statement);

avant le execute, ça devrait te donner des informations.
A voir :
Créer une page php avec juste  

Code :
  1. <?php
  2. phpinfo();
  3. ?>

Et regarde s'il n'y a pas des différences entre l'environnement de dév' et celui de prod'...

n°1838510
Gavrinis
Open your mind
Posté le 15-01-2009 à 16:47:25  profilanswer
 

Le "var_dump($statement);" retourne ceci :

Code :
  1. object(PDOStatement)#2 (1) { ["queryString"]=>  string(59) "SELECT id, nom, repertoire FROM themes WHERE id = :id_theme" }


Pour phpinfo(), je regarde tout de suite.

n°1838513
macgawel
Posté le 15-01-2009 à 16:52:52  profilanswer
 

Le var_dump te donne la même chose dans les deux environnements ?

n°1838519
Gavrinis
Open your mind
Posté le 15-01-2009 à 17:02:22  profilanswer
 

Oui c'est identiquement la même chose. Du côté de phpinfo aussi mise à part que le prod est configuré pour être sécurisé.

n°1838529
rufo
Pas me confondre avec Lycos!
Posté le 15-01-2009 à 17:26:23  profilanswer
 

par sécurisé, faut comprendre "safe_mode" à On? Parce que je sais que ce genre de mode pose pas mal de pb à de nombreux scripts php...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1838532
Gavrinis
Open your mind
Posté le 15-01-2009 à 17:39:36  profilanswer
 

Non, il est désactivé aussi en prod.

n°1838540
rufo
Pas me confondre avec Lycos!
Posté le 15-01-2009 à 17:50:32  profilanswer
 

question bête : la connexion à la bd est ok? En gros que dans le ficheir de conf, t'as pas laissé le nom de la bd de test? Parce qu'à aucun moment dans ton script tu ne testes ce que contient $statement
 (la ligne $db->prepare($sql) pourrait très bien renvoyer une erreur, mais n'étant pas familier avec PDO...)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1838555
Gavrinis
Open your mind
Posté le 15-01-2009 à 18:16:26  profilanswer
 

Le nom de la base de donnée est la même, login et mot de passe sont adaptés.

n°1838573
Profil sup​primé
Posté le 15-01-2009 à 18:30:45  answer
 

Gavrinis a écrit :

Le "var_dump($statement);" retourne ceci :

Code :
  1. object(PDOStatement)#2 (1) { ["queryString"]=>  string(59) "SELECT id, nom, repertoire FROM themes WHERE id = :id_theme" }


Pour phpinfo(), je regarde tout de suite.


 
à la ligne 61 ?

mood
Publicité
Posté le 15-01-2009 à 18:30:45  profilanswer
 

n°1838575
Gavrinis
Open your mind
Posté le 15-01-2009 à 18:34:59  profilanswer
 

Bon c'est résolu, il y avait bien une erreur (merci Rufo ;)).
Maintenant j'ai droit à une autre ... "Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /var/www/includes/functions.php on line 72 Warning"
 

Code :
  1. $desired_lang_id = NULL;
  2. if (!empty($_GET['lang']) && ($_GET['lang'] == 'fr' || $_GET['lang'] == 'en'))
  3.  $desired_lang_id = $_GET['lang'];
  4. else
  5. {
  6.  if (empty($_SESSION['language_id']) or empty($_SESSION['language_short']))
  7.   $desired_lang_id = DEFAULT_LANG_ID;
  8. }


La ligne 72 correspond ici à la ligne 3, je lui mets une condition "si le paramètre est vide va au else", bien sûr que le paramètre est vide car c'est comme au dessus nous sommes sur la homepage, mais seulement il parcourt quand même le if et après vient se plaindre :sweat:

n°1838578
Gavrinis
Open your mind
Posté le 15-01-2009 à 18:36:55  profilanswer
 


Non mon "var_dump($statement);" était à la ligne 60.

n°1838588
Gavrinis
Open your mind
Posté le 15-01-2009 à 19:15:14  profilanswer
 

J'ai parlé trop vite, il me sort toujours l'erreur précédente mais cette fois en ligne 60 (ligne 14 de mon premier post) en plus de la nouvelle erreur :(

n°1838754
macgawel
Posté le 16-01-2009 à 09:33:03  profilanswer
 

Gavrinis a écrit :

Code :
  1. $desired_lang_id = NULL;
  2. if (!empty($_GET['lang']) && ($_GET['lang'] == 'fr' || $_GET['lang'] == 'en'))
  3.  $desired_lang_id = $_GET['lang'];
  4. else
  5. {
  6.  if (empty($_SESSION['language_id']) or empty($_SESSION['language_short']))
  7.   $desired_lang_id = DEFAULT_LANG_ID;
  8. }


La ligne 72 correspond ici à la ligne 3, je lui mets une condition "si le paramètre est vide va au else", bien sûr que le paramètre est vide car c'est comme au dessus nous sommes sur la homepage, mais seulement il parcourt quand même le if et après vient se plaindre :sweat:


Si le script passe dans ta condition IF, c'est qu'elle est validée...
 
Tu as testé voir s'il y passe effectivement (echo par exemple) ?
Essaye de fractionner ton test. C'est peut-être moins optimisé, mais ce sera plus simple à maintenir :

Code :
  1. // Tableau contenant les langues utilisables
  2. $Tlang = array ( "fr", "en" );
  3. // Langage par défaut : la première du tableau des langues
  4. $desired_lang_id = $Tlang[0];
  5. // On commmence par regarder si un langage est demandé dans la session
  6. // Je n'ai pas tout suivi, dans ton script donc je fais le minimum...
  7. if ( isset ($_SESSION['language_id'] ) && ( ! empty ($_SESSION['language_id'] ) {
  8. // Je pars du principe que le contenu de SESSION est correct. Sinon, faire une vérif.
  9.    $desired_lang_id = $_SESSION['language_id'];
  10. }
  11. // ensuite on regarde si un langage est demandé par le GET
  12. if (isset ( $_GET['lang'] ) ) && ( in_array ( $_GET['lang'], $Tlang ) ) {
  13.    $desired_lang_id = $_GET['lang'];
  14. }


 
 
Ceci-dit, je ne pense pas que ce soit cette ligne qui te génére un Warning: PDOStatement...
 
Sinon, vu que tu utilises PDO - ou une variante :

Code :
  1. $sql = 'SELECT id, nom, repertoire FROM themes WHERE id = :id_theme';
  2. //En cas d'échec du PREPARE, $statement vaudra FALSE...
  3. // Du coup, on teste sa valeur avant de continuer...
  4. if ( $statement = $db -> prepare ( $sql ) ) {
  5. // La fonction execute renvoie TRUE si elle est bien passée, FALSE sinon
  6.    $statement->execute(array('id_theme' => $desired_theme_id)) or die ( "Erreur à l'execution du statement " );
  7. }
  8. else {
  9.    die ( "Erreur de statement avec la requête ".$sql );
  10. }


Apparemment, d'après la doc PHP, tu devrais préciser dans ton prepare un array...

n°1838756
rufo
Pas me confondre avec Lycos!
Posté le 16-01-2009 à 09:40:18  profilanswer
 

Gavrinis a écrit :

Bon c'est résolu, il y avait bien une erreur (merci Rufo ;)).
Maintenant j'ai droit à une autre ... "Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /var/www/includes/functions.php on line 72 Warning"
 


Ca me paraît plus simple à résoudre. il te dit que le paramètrre passé n'est pas défini. Soit $_GET['lang'] contient rien (auquel cas voir pourquoi) soit il contient une valeur qui n'est pas un nombre. Attention, en général, ce qui est passé dans du GET ou POST est vu comme un type string. PDO fait sans doute la distinction entre la valeur 1 et "1". Si $_GET['lang'] n'est aps vide, essayes de faire (integer)$_GET['lang'] pour forcer le type.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1839320
Gavrinis
Open your mind
Posté le 17-01-2009 à 10:44:30  profilanswer
 

macgawel a écrit :


Si le script passe dans ta condition IF, c'est qu'elle est validée...

 

Tu as testé voir s'il y passe effectivement (echo par exemple) ?
Essaye de fractionner ton test. C'est peut-être moins optimisé, mais ce sera plus simple à maintenir :

Code :
  1. // Tableau contenant les langues utilisables
  2. $Tlang = array ( "fr", "en" );
  3. // Langage par défaut : la première du tableau des langues
  4. $desired_lang_id = $Tlang[0];
  5. // On commmence par regarder si un langage est demandé dans la session
  6. // Je n'ai pas tout suivi, dans ton script donc je fais le minimum...
  7. if ( isset ($_SESSION['language_id'] ) && ( ! empty ($_SESSION['language_id'] ) {
  8. // Je pars du principe que le contenu de SESSION est correct. Sinon, faire une vérif.
  9.    $desired_lang_id = $_SESSION['language_id'];
  10. }
  11. // ensuite on regarde si un langage est demandé par le GET
  12. if (isset ( $_GET['lang'] ) ) && ( in_array ( $_GET['lang'], $Tlang ) ) {
  13.    $desired_lang_id = $_GET['lang'];
  14. }
 


Ceci-dit, je ne pense pas que ce soit cette ligne qui te génére un Warning: PDOStatement...

 

Sinon, vu que tu utilises PDO - ou une variante :

Code :
  1. $sql = 'SELECT id, nom, repertoire FROM themes WHERE id = :id_theme';
  2. //En cas d'échec du PREPARE, $statement vaudra FALSE...
  3. // Du coup, on teste sa valeur avant de continuer...
  4. if ( $statement = $db -> prepare ( $sql ) ) {
  5. // La fonction execute renvoie TRUE si elle est bien passée, FALSE sinon
  6.    $statement->execute(array('id_theme' => $desired_theme_id)) or die ( "Erreur à l'execution du statement " );
  7. }
  8. else {
  9.    die ( "Erreur de statement avec la requête ".$sql );
  10. }


Apparemment, d'après la doc PHP, tu devrais préciser dans ton prepare un array...


Le problème s'est qu'un echo ne changera rien car le $_GET['lang'] est sensé ne rien contenir lors de l'arrivé sur la page, le echo n'affichera donc rien.
J'ai mis ton test mais ça n'a rien changé :(.
Ta solution pour le Warning me donne ceci "Erreur de statement avec la requ�te SELECT id, nom, repertoire FROM themes WHERE id = :id_theme"
Pour le prepare Ok mais je ne vois pas quel array mettre :??:


Message édité par Gavrinis le 17-01-2009 à 11:58:55
n°1839323
Gavrinis
Open your mind
Posté le 17-01-2009 à 10:47:52  profilanswer
 

rufo a écrit :


Ca me paraît plus simple à résoudre. il te dit que le paramètrre passé n'est pas défini. Soit $_GET['lang'] contient rien (auquel cas voir pourquoi) soit il contient une valeur qui n'est pas un nombre. Attention, en général, ce qui est passé dans du GET ou POST est vu comme un type string. PDO fait sans doute la distinction entre la valeur 1 et "1". Si $_GET['lang'] n'est pas vide, essayes de faire (integer)$_GET['lang'] pour forcer le type.


Il ne contient rien car quand le visiteur arrive sur la homepage, il n'y a pas encore de paramètre dans l'url, c'est pour cela qu'il y a une alternative avec les sessions.
Sa valeur contenue n'est effectivement pas un nombre étant donné que c'est soit "fr" soit "en".

n°1843732
Gavrinis
Open your mind
Posté le 27-01-2009 à 16:32:06  profilanswer
 

[:undertaker666]

n°1844046
macgawel
Posté le 28-01-2009 à 10:45:21  profilanswer
 

[:sh@rdar]

Citation :

Exemple #1 Prépare une requête SQL avec des paramètres nommés
<?php
/* Exécute une requête préparée en passant un tableau de valeurs */
$sql = 'SELECT nom, couleur, calories
    FROM fruit
WHERE calories < :calories AND couleur = :couleur';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':couleur' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array('calories' => 175, 'couleur' => 'yellow'));
$yellow = $sth->fetchAll();
?>


Si tu lis la doc de prepare et execute :
Le problème, c'est que tu demande d'exécuter une requête en lui passant des paramètres, mais que tu la prepare sans paramètres.
Du coup, forcément ça coince !
 
Essaye d'adapter un des exemples de la doc à ton cas, et vois ce que ça donne...

n°1844663
Gavrinis
Open your mind
Posté le 29-01-2009 à 13:28:05  profilanswer
 

C'est encore pire si j'ajoute cela à mon prepare car la page ne s'affiche plus du tout, une page blanche c'est tout.

n°1845109
macgawel
Posté le 30-01-2009 à 10:52:27  profilanswer
 

Code :
  1. $sth->execute(array(':calories' => 150, ':couleur' => 'red'));

Tu as bien mis les ":" dans le execute ?

n°1845335
Gavrinis
Open your mind
Posté le 30-01-2009 à 18:46:01  profilanswer
 

Oui

Code :
  1. $statement->execute(array(':id_theme' => $desired_theme_id));

n°1847751
Gavrinis
Open your mind
Posté le 05-02-2009 à 22:56:30  profilanswer
 

Pas d'idées ? :(

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Call to a member function execute() on a non-object

 

Sujets relatifs
Balise Object probleme IEvector contenant object utilisant polymorphisme, help
[C++][resolu]error: no matching function for call to...SimpleXML Object vers Array ?
std::map associer des index et une classe, comparison functionFatal error: Can't use function return value in write context in
[AJAX] Problème avec innerHTML=xhr_object.responseTextfrom c function func(double (*g(char*))) to cpp cool object design
Plus de sujets relatifs à : Call to a member function execute() on a non-object


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR