Fatal error: Uncaught Error: Call to a member function query() on null in

chrismargab
Invité n'ayant pas de compte PHPfrance

09 avr. 2019, 21:04

Bonjour,

Je rencontre un problème sur mon site depuis ce matin, et je n'arrive pas à en trouver la solution.
Je suis hébergé chez OVH. Le site est en fonction depuis 1 an, sans rencontrer de problème, et depuis ce matin, j'ai le massage "Fatal error: Uncaught Error: Call to a member function query() on null in " après le Xème appel à la base. Si encore ça se passait à la première requête, mais non, j'effectue plusieurs requêtes sur la même page, et d'un coup, ce message apparaît.

Voici mon code de connexion :

Code : Tout sélectionner

<?php function connectToDB(& $bdd= null) { try { $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:host=xxxxx.mysql.db;dbname=xxxx;charset=utf8', 'xxxx', 'xxxx', $pdo_options); } catch(Exception $e) { return false; } return true; } ?>

Et voici un extrait de mon code :

Code : Tout sélectionner

<td class="align_haut" id="statut"> <p class="titre_rubrique"> STATUTS A AFFICHER </p> <p> <?php connectToDB($bdd); $sql = "select count(*) from statuts_affaires where supprime='0'" ; $nb=$bdd->query($sql); $nb_statut_base=$nb->fetchColumn(); $bdd = null; $nb_statut_reglage=substr_count($_SESSION['affichage_statut_affaire'], ',') - 1; ?> <input type="checkbox" id="checkall_statut" <?php if($nb_statut_reglage == $nb_statut_base){ echo "checked";}?>/> <label for="statut1" class="tous_aucun"><span><span></span></span>&nbsp; Tous / Aucun</label> </p> <div id="bordure_liste"> <?php $i=-1; connectToDB($bdd); $sql = "select * from statuts_affaires where supprime='0' order by statut asc" ; $req = $bdd->query($sql); while($row = $req->fetch()) { $i += 1; ?> <input type="checkbox" id="case_1" name="statut<?php echo $i; ?>" <?php if (strpos($_SESSION['affichage_statut_affaire'],",".$row['id_statut'].",") !== false){ echo "checked"; } ?> /> <label for="statut1"><span><span></span></span>&nbsp; <?php if($row['statut']!="") {echo $row['statut'].' ('.$row['abrege'].')';} ?></label> <br> <?php } $bdd = null; ?> </div> </td> <td class="align_haut" id="site"> <p class="titre_rubrique"> SITES A AFFICHER </p> <p> <?php connectToDB($bdd); $sql = "select count(*) from sites where supprime='0'" ; $nb=$bdd->query($sql); $nb_site_base=$nb->fetchColumn(); $bdd = null; $nb_site_reglage=substr_count($_SESSION['affichage_site_affaire'], ',') - 1; ?> <input type="checkbox" id="checkall_site" <?php if($nb_site_reglage == $nb_site_base){ echo "checked";}?>/> <label for="site1" class="tous_aucun"><span><span></span></span>&nbsp; Tous / Aucun</label> </p> <div id="bordure_liste"> <?php $i=-1; connectToDB($bdd); $sql = "select * from sites where supprime='0' order by site asc" ; $req = $bdd->query($sql); while($row = $req->fetch()) { $i += 1; ?> <input type="checkbox" id="case_1" name="site<?php echo $i; ?>" <?php if (strpos($_SESSION['affichage_site_affaire'],",".$row['id_site'].",") !== false){ echo "checked"; } ?> /> <label for="site1"><span><span></span></span>&nbsp; <?php echo $row['site']; ?></label> <br> <?php } $bdd = null; ?> </div> </td>

L'erreur se produit à la ligne

Code : Tout sélectionner

$nb=$bdd->query($sql);


qui se trouve après

Code : Tout sélectionner

$sql = "select count(*) from sites where supprime='0'" ;
c'est à dire à la 3ème requête.

Si quelqu'un a une explication à ce problème, je lui serai reconnaissant de m'en donner la solution.

Christian

Mammouth du PHP | 1137 Messages

09 avr. 2019, 21:37

drôle d'idée de se connecter, passer la connexion à null pour se reconnecter dans le même script.
possible qu'il n'y ai plus de problème en se connectant une fois au début, une fois pour toute.

chrismargab
Invité n'ayant pas de compte PHPfrance

09 avr. 2019, 23:01

J'ai tester de n'ouvrir la connexion qu'en début de page, et en la fermant à la fin.
J'obtiens, toujours à la même ligne de code, l'erreur suivante : Warning: Cannot modify header information - headers already sent by...
De toute façon, ça fait 1 an que ça fonctionne comme ça, ça m'étonnerais que se soit ça qui pose problème du jour au lendemain.

Christian

Mammouth du PHP | 1562 Messages

10 avr. 2019, 08:06

test la valuer de $bdd pour comprendre quand elle ne prend pas la valeur voulue.

je confirme qu'une seule ouverture de connection serait mieux. si cela te donne une erreur de type header already sent, c'est une erreur qui peut se corriger mais pas en multipliant les connection sql.

en dernier recours, contacte ton hebergeur si l'erreur ne se produisait pas avant, il y a probablement eu un changement de configuration de leur coté.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

chrismargab
Invité n'ayant pas de compte PHPfrance

10 avr. 2019, 12:20

J'ai envoyé un mail à OVH pour savoir, car effectivement, une erreur qui apparaît du jour au lendemain sans avoir modifié quoi que ce soit dans le code, ça ne peut à mon avis s'expliquer que par une modification de leur côté.

Christian.

mimine
Invité n'ayant pas de compte PHPfrance

10 avr. 2019, 14:36

Bonjour,

Même problème pour moi depuis ce matin sur mon site alors que je n'ai fait aucune modification depuis plusieurs semaines....
Je serais bien intéressée par la réponse que OVH va vous faire.

Petit nouveau ! | 2 Messages

11 avr. 2019, 06:20

Même problème pour moi, tout fonctionnait correctement et du jours au lendemain "Cannot modify header information", @chrismargab pourrez-vous nous tenir informé de votre échange avec OVH ?
Merci.

Mammouth du PHP | 1562 Messages

11 avr. 2019, 08:12

n'hésitez pas à poster votre code + messagfe d'erreur plus explication dans un nouveau posts.

Il y a des chances que l'erreur viennent d'une mauvaise conception de code. classiquement "Cannot modify header information" apparait lorsque du code html est envoyé avant certaine fonction de type header() ou session_start();
Une mise à jour de php sur vos serveur peut le rendre plus sensible à ces erreurs. Et donc ce sera à vous de modifier le code et non pas OVH à rétablir une configuration probablement obsolète.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

chrismargab
Invité n'ayant pas de compte PHPfrance

11 avr. 2019, 18:47

Mon code est affiché dans le post initial, et le message d'erreur est "Call to a member function query() on null in...".
@Or1 et toi (@Spols) me dites que les ouvertures et fermetures de connexion répétées peuvent être à l'origine du problème. Je l'entends, et je veux bien le croire. Mais il me suffit de supprimer la première fermeture de connexion ("$bdd = null;"), et de supprimer l'ouverture suivante pour n'avoir donc qu'une ouverture et une fermeture pour deux requêtes, et j'obtiens le message d'erreur "Cannot modify header information".
Tu y crois toi, à cette erreur ? Moi, non.

Christian.

Mammouth du PHP | 1562 Messages

12 avr. 2019, 08:45

sans aucun soucis je crois à cette erreur, d'habitude cette erreur est plus loquace, on sait ou le header cherche a être modifié et où il y a envoi de donnée empèchant cette modification.

ton code commence par du html, donc cherche les fonction (y compris dans les fonctions de connexion) qui utilise le header classiquement header() et session_start() et fais en sorte qu'elle interviennent en premier.
soit en les déclarant en tout début de script soit en sauvegardfant le code html à produire dans une variable pour l'afficher qu'en fin de script.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

chrismargab
Invité n'ayant pas de compte PHPfrance

12 avr. 2019, 19:44

Je me suis mal exprimé. Effectivement, cette erreur est possible, mais dans ce cas, je ne pense pas.
Ce que je veux dire, c'est que ce n'est pas simplement en supprimant une fermeture et une ouverture de connexion après une requête, que cette erreur va se produire. Ce n'est pas le fait de ne plus fermer une connexion que cette erreur de header va se produire.
J'ai envoyé un deuxième mail à OVH ce matin, le premier étant toujours sans réponse.
Si vous êtes dans le même cas que moi, je vous invite à écrire à OVH directement, peut être que plus il y aura de "plaintes", plus vite ils réagiront.

Christian.

chrismargab
Invité n'ayant pas de compte PHPfrance

17 avr. 2019, 08:05

Bonjour,

Toujours sans réponse de leur part, j'ai contacté OVH par téléphone hier. Pour eux, tout va bien avec l'hébergement, puisque j'arrive sans problème sur la page d’accueil. Le fait que certaines requêtes ne fonctionnent plus du jour au lendemain vient de mon code, pas de chez eux (dixit la dame). Il faut que je regarde de mon coté, l'intégrité de ma base. J'ai beau eu expliqué que j'ai transféré la base telle quelle, ainsi que le code, sur un autre hébergement (OVH également), et tout fonctionne bien. En local, idem, tout fonctionne. Il n'y a que sur l'hébergement dédié que ça ne veut pas. "On n'y peut rien, et on ne peut rien faire" qu'elle m'a dit...
J'ai alors supprimé toutes les tables de ma base, supprimé toutes les pages, puis transféré la base complète et les pages du site où ça fonctionne actuellement. Rien à faire, ça ne fonctionne toujours pas, alors que tout provient d'un autre hébergement OVH où tout fonctionne. Il ne faut pas me dire que ça ne vient pas de l'hébergement !
Je désespère... Que faire ?

Christian.

Mammouth du PHP | 1562 Messages

17 avr. 2019, 11:40

Reprends du début petit bout de script par petit bout pour comprendre ce qui bloque. affiche bien toutes les erreurs y compris les NOTICE et test la valeurs de tes variables avec var_dump à différent endroit du script.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

chrismargab
Invité n'ayant pas de compte PHPfrance

21 avr. 2019, 10:04

Bonjour. Hier matin, retour de la part de OVH sur mon ticket. Le technicien me demande des informations sur l'erreur : copie d'écran, type d'erreur, etc. J'ai tout indiqué sur le ticket, mais je me rends quand même sur le site,.... qui fonctionne (il ne fonctionnait toujours pas 2 jours avant) ! Je réponds en demandant ce qui a été fait, et réponse peu de temps après : rien. Mon œil !! Menteur !! Rien n'a changé de mon côté, donc c'est bien du leur que ça a bougé, et ils le savent. Bon, l'essentiel c'est que ça marche. Joyeuses pâques à tous. Christian.