web-dev-qa-db-ja.com

pdo-非オブジェクトでメンバー関数prepare()を呼び出す

このコードはエラーを取得します:

致命的エラー:42行目のC:\ Users\fel\VertrigoServ\www\login\validation.phpにある非オブジェクトのメンバー関数prepare()の呼び出し

コード:

   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;
            }
        }
    }

考えられる原因は何ですか? 別の質問mysql_num_rowsと同等のものは何ですか?すみません、私はPDOの初心者です

15
anvd

$pdoは未定義です。関数内で宣言しておらず、引数として渡されていません。

渡すか(良い)、またはグローバル名前空間で定義して、global $pdoを一番上に配置して(悪い)関数で使用できるようにする必要があります。

20
meagar

同じPHPページでデータベース接続の機能を作成し、いつでもその機能を呼び出すことができます。なので、

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..
}

または、必要なときにそのページにデータベース接続行を書き込むだけで済みます。なので、

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

$pdoオブジェクトが関数内のスコープ内にありません。

2
Mark Baker

PDOのmysql_num_rowsに相当するものは、基本的にFETCH_NUMであり、選択された行のインデックス番号を返します。

1
sebastian

@Anvd私は同じ問題を抱えていましたが、coonnectingページを含めるだけでなく、同じページにデータベースを接続することで解決しました。それは私のために働いた

<?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

同じエラーが発生していました。PDO接続を閉じた後、クラスを呼び出しました。

0
no92

このエラーは、アクティブでバッファリングされていないクエリがまだアクティブであることから発生する場合もあります。

だから、41行目で、

$stmt = null;
0
Jordan

はい、私もこれを難しい方法で学びました。関数内でDB接続を開く必要があります。関数を呼び出す前に開いた場合、関数内でDBへの接続が開かれると仮定しましたが、いいえ。そう:

function whatever(){ 
  //OPEN DB CONNECTION

  CODE

  //CLOSE DB
return whateverValue;
} 
0
Sanner