web-dev-qa-db-fra.com

pdo - Appel à une fonction membre prepare () sur un non-objet

Ce code obtient une erreur

Erreur fatale: appel d'une fonction membre prepare () sur un non-objet dans C:\Utilisateurs\fel\VertrigoServ\www\login\validation.php à la ligne 42

CODE:

   function repetirDados($email) {
        if(!empty($_POST['email'])) {

            $query = "SELECT email FROM users WHERE email = ?";

            $stmt = $pdo->prepare($query); // error line: line 42

            $email = mysql_real_escape_string($_POST['email']);

            $stmt->bindValue(1, $email);

            $ok = $stmt->execute();

            $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

            if ($results == 0) {
                return true;
            } else {
                echo '<h1>something</h1>';
                return false;
            }
        }
    }

Quelle est la cause possible? Une autre question, Quel est l'équivalent de mysql_num_rows? désolé, je suis novice avec pdo

15
anvd

$pdo n'est pas défini. Vous ne le déclarez pas dans la fonction et il n'est pas transmis en tant qu'argument.

Vous devez le transmettre (bien) ou le définir dans l'espace de noms global et le rendre disponible pour votre fonction en plaçant global $pdo en haut (mauvais).

20
meagar

Vous pouvez créer une fonction de connexion à la base de données dans la même page php et appeler cette fonction à tout moment. Comme,

public function connection()
{
    $dbc = new PDO("mysql:Host=localhost;dbname=chat","root","");
} 
public function1()
{
   this->connection();
   // now you have the connection.. now, time for to do some query..
}

public function2()
{
  this->connection();
// now do query stuffs..
}

Ou simplement, vous pouvez simplement écrire la ligne de connexion à la base de données dans cette page chaque fois que vous en avez besoin. Comme,

public function a()
{ // connecting DB for this function a only...
  $dbc = new PDO("mysql:Host=localhost;dbname=chat","root","");
  // bla bla bla...
}
public function b()
{  // connecting DB for this function b only...
   $dbc = new PDO("mysql:Host=localhost;dbname=chat","root","");
   // abra ke dabra... boom
}
4
M Alam Telot

L'objet $pdo n'est pas dans la portée de votre fonction.

2
Mark Baker

En ce qui concerne l'équivalent de mysql_num_rows dans PDO, FETCH_NUM renvoie le numéro d'index de la ligne sélectionnée.

1
sebastian

@Anvd. J'ai eu le même problème, mais je l'ai résolu en connectant la base de données sur la même page, pas seulement pour inclure la page de connexion. Ça a fonctionné pour moi 

<?php
try {
$pdo = new PDO('mysql:Host=localhost;dbname=tish_database;charset=utf-8','root','');

} catch(PDOException $e){
echo 'Connection failed'.$e->getMessage();
}

?>
1
Humphrey

J'avais la même erreur: j'ai vu que j'avais appelé ma classe après avoir fermé la connexion PDO.

0
no92

Vous pouvez également obtenir cette erreur des requêtes actives, non mises en mémoire tampon et toujours actives.

donc, à la ligne 41,

$stmt = null;
0
Jordan

Oui, j'ai aussi appris cela à la dure, vous devez ouvrir une connexion de base de données à l'intérieur de la fonction. J'ai supposé que la connexion à la base de données serait ouverte dans la fonction si je l'ouvrais avant d'appeler la fonction, mais non. Alors: 

function whatever(){ 
  //OPEN DB CONNECTION

  CODE

  //CLOSE DB
return whateverValue;
} 
0
Sanner