Pour un projet perso, j'utilise PDO pour MySQL.
En local, je n'ai aucun problème; en revanche, sur le serveur distant, j'ai droit à ce sale coup d'erreur critique:
Voici le fichier en question:Fatal error: Call to a member function fetchAll() on a non-object in /.../.../index.php on line 134
<?php
// Nombre de requêtes
$nombre_requetes = 0;
// Début de la génération de la page
$debut_generation = microtime (true);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index</title>
</head>
<body id="haut">
<div id="page">
<?php
$lang = 'fr';
require_once (dirname (__FILE__).'/conf/conf.php');
require (dirname (__FILE__).'/sgbd/pdo.php');
// Liste des forums
$requete = "SELECT id, description, titre
FROM ".VBRF_SQL_PREFIXE_TABLES."forums";
$resultat = $pdo -> query ($requete);
$donnees_forums = $resultat -> fetchAll (PDO::FETCH_ASSOC);
$nombre_requetes ++;
?>
<table summary="Nomenclature">
<thead>
<tr>
<th> </th>
<th>Forums et sous-forums</th>
<th>Sujets</th>
<th>Messages</th>
<th>Derniers messages</th>
</tr>
</thead>
<tbody>
<?php
if (count ($donnees_forums) == 0)
{
?>
<tr>
<td colspan="5">Aucun forum n'a été créé</td>
</tr>
<?php
}
else
{
foreach ($donnees_forums as $forum)
{
// Nombre de sujets postés par forum
$requete = "SELECT COUNT(*) AS total
FROM ".VBRF_SQL_PREFIXE_TABLES."sujets
WHERE id_forum=".$forum['id'];
$resultat = $pdo -> query ($requete);
$donnees = $resultat -> fetchAll ();
$sujets = $donnees[0]['total'];
$nombre_requetes ++;
// Nombre de messages postés par forum
$requete = "SELECT COUNT(*) AS total FROM ".VBRF_SQL_PREFIXE_TABLES."messages,
".VBRF_SQL_PREFIXE_TABLES."sujets
WHERE id_forum=".$forum['id'];
$resultat = $pdo -> query ($requete);
$donnees = $resultat -> fetchAll ();
$messages = $donnees[0]['total'];
$nombre_requetes ++;
// Lien vers le dernier message posté par forum
$requete = "SELECT ".VBRF_SQL_PREFIXE_TABLES."messages.id AS message,
".VBRF_SQL_PREFIXE_TABLES."sujets.id AS sujet,
identifiant, titre, titre_url
FROM ".VBRF_SQL_PREFIXE_TABLES."membres,
".VBRF_SQL_PREFIXE_TABLES."messages,
".VBRF_SQL_PREFIXE_TABLES."sujets
WHERE ".VBRF_SQL_PREFIXE_TABLES."membres.id=id_membre
ORDER BY message DESC LIMIT 1";
$resultat = $pdo -> query ($requete);
$donnees_message = $resultat -> fetch (PDO::FETCH_ASSOC);
$nombre_requetes ++;
?>
<tr>
<td><img src="themes/default/images/nouveau-message.gif" alt="Nouveaux messages" /></td>
<td>
<h2><a href="forum.php?forum=<?php echo $forum['id'] ?>"><?php echo $forum['titre'] ?></a></h2>
<p><?php echo $forum['description'] ?></p>
</td>
<td><?php echo $sujets ?></td>
<td><?php echo $messages ?></td>
<td>
<?php
if ($sujets == 0 || $messages == 0) echo 'Pas de messages';
else echo '<a href="sujet.php?sujet='.$donnees_message['sujet']
.'&titre='.$donnees_message['titre_url'].'#message-'.$donnees_message['message'].'">'
.$donnees_message['titre'].'</a> - Date - '.$donnees_message['identifiant'];
?>
</td>
</tr>
<?php
}
}
?>
</tbody>
</table>
<div id="bas">
<div id="statistiques">
<h3>Statistiques</h3>
<?php
// Nombre de membres inscrits
$requete = "SELECT COUNT(*) AS total
FROM ".VBRF_SQL_PREFIXE_TABLES."membres";
$resultat = $pdo -> query ($requete);
$donnees = $resultat -> fetchAll (); // La ligne mentionnée par l'erreur critique
$membres = $donnees[0]['total'];
$nombre_requetes ++;
// Nombre de messages
$requete = "SELECT COUNT(*) AS total
FROM ".VBRF_SQL_PREFIXE_TABLES."messages";
$resultat = $pdo -> query ($requete);
$donnees = $resultat -> fetchAll ();
$messages = $donnees[0]['total'];
$nombre_requetes ++;
// Nombre de sujets postés
$requete = "SELECT COUNT(*) AS total
FROM ".VBRF_SQL_PREFIXE_TABLES."sujets";
$resultat = $pdo -> query ($requete);
$donnees = $resultat -> fetchAll ();
$sujets = $donnees[0]['total'];
$nombre_requetes ++;
?>
<ul>
<li><strong><?php echo $membres ?></strong> membres sont inscrits</li>
<li>
<strong><?php echo $messages ?></strong> messages ont été postés
dans <strong><?php echo $sujets ?></strong> sujets
</li>
<?php
// Membre le plus récent
$requete = "SELECT identifiant
FROM ".VBRF_SQL_PREFIXE_TABLES."membres
ORDER BY id DESC LIMIT 1";
$resultat = $pdo -> query ($requete);
$donnees = $resultat -> fetch (PDO::FETCH_ASSOC);
$nombre_requetes ++;
?>
<li>Membre le plus récent : <a href="#haut"><?php echo $donnees['identifiant'] ?></a></li>
</ul>
</div>
</div>
<?php
// Durée de génération de la page
$fin_generation = microtime (true) - $debut_generation;
?>
<p id="info-serveur">Requêtes effectuées : <?php echo $nombre_requetes ?>.
Page générée en <?php echo round ($fin_generation, 4) ?> s.</p>
</div>
</body>
</html>
Pour info, le fichier conf (toutes les données y sont valides)<?php
// Configuration de la connexion à la base de données MySQL
// Adresse du serveur
define ('VBRF_SQL_ADRESSE', 'localhost');
// Utilisateur
define ('VBRF_SQL_UTILISATEUR', 'root');
// Mot de passe
define ('VBRF_SQL_MOT_DE_PASSE', '');
// Nom de la base de données
define ('VBRF_SQL_BASE', 'nom_de_la_base');
// Préfixe à ajouter devant le nom des tables
define ('VBRF_SQL_PREFIXE_TABLES', 'vbrf_');
?>
ainsi que le fichier pdo<?php
// Connexion au serveur de gestion de base de données et à la base de données
require_once (dirname (__FILE__).'/../conf/conf.php');
try
{
$pdo = new PDO ('mysql:host='.VBRF_SQL_ADRESSE.
';dbname='.VBRF_SQL_BASE, VBRF_SQL_UTILISATEUR, VBRF_SQL_MOT_DE_PASSE);
}
catch (PDOException $erreur)
{
die ('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Erreur PDO</title>
</head>
<body>
<p xml:lang="en" lang="en">'.$erreur -> getMessage ().'</p>
</body>
</html>
');
}
?>
C'est d'autant plus incompréhensible que les deux premières requêtes de type SELECT COUNT() du fichier index sont exécutées sans problème, y compris sur le serveur distant. Quant aux requêtes SQL en soi, elles ne comportent aucune erreur d'après phpMyAdmin.