web-dev-qa-db-fra.com

Appel à une fonction membre fetch () sur un booléen

Je reçois cette erreur:

Erreur fatale: appel de la fonction membre fetch () sur un booléen dans C:\xampp\htdocs\repo\générateur\modèle\database.php à la ligne 34

Quand je lance ce code:

    class database
    {
        private $user = 'root';
        private $pass = '';
        public $pdo;

        public function connect() {
            try {
                $this->pdo = new PDO('mysql:Host=localhost; dbname=generatordatabase', $this->user, $this->pass);
                echo 'Połączenie nawiązane!';
            }
            catch(PDOException $e) {
                echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
            }
        }

        public function createTable() {

                        $q = $this->pdo -> query('SELECT * FROM article');
                          while($row = $q->fetch()) {
                              echo $row['id'].' ';
                          }
                          $q->closeCursor();
        }
    }

    ?>
8
marjanos

Selon le manuel PHP pour PDO :: query

PDO :: query () retourne un objet PDOStatement ou FALSE en cas d'erreur.

Il semble que votre requête échoue (à la ligne 33) et renvoie donc un BOOLEAN (false), probablement parce qu'à ce stade de l'exécution, PDO ne s'est pas connecté à une base de données contenant une table appelée article. Dans la méthode connect (), je vois qu'elle essaie de se connecter à une base de données appelée 'generatordatabase'; assurez-vous que cette connexion est établie avant d'appeler createTable (), sinon assurez-vous qu'elle contient une table appelée 'article'.

Je recommanderais d'ajouter quelques exemples de code supplémentaires, par exemple le code qui appelle cette classe/méthode avant que l'erreur ne soit déclenchée.

8
ajmedway

Un certain traitement des erreurs vous aidera à éviter des problèmes comme celui-ci:

$q = $this->pdo->query('SELECT * FROM article');

//error case
if(!$q)
{
  die("Execute query error, because: ". print_r($this->pdo->errorInfo(),true) );
}
//success case
else{
     //continue flow
}
2
Aris

Je ne suis pas sûr que c'est exactement l'erreur que j'ai eue, mais mon erreur était due à ma variable $ con.

 $con = new mysqli($Host,$username,$password,$database);
$sql = "SELECT name FROM users WHERE email = '$email'";

$stm = $con->prepare($sql);
$stm->execute();

et

 $sql1 = "INSERT INTO posts 
         VALUES('$email','$body')";


$stm1 = $con->prepare($sql1);


if ($stm1->execute()) {

J'aurais dû faire:

$con = new mysqli($Host,$username,$password,$database);
$sql = "SELECT name FROM users WHERE email = '$email'";

$stm = $con->prepare($sql);
$stm->execute();

et

$con1 = new mysqli($Host,$username,$password,$database);

     $sql1 = "INSERT INTO posts 
             VALUES('$email','$body')";

    $stm1 = $con1->prepare($sql1);

    $stm1->execute()
0
Hossein