2010-12-06 11 views
0

致命的なエラー:準備メンバ関数の呼び出し()非オブジェクトPHP PDO:メンバー関数prepare()&listを呼び出しますか?

には、私がしようとしたとき、私は取得していますです:

$sql = $connect->prepare ("SELECT id, pwd, firstname, lastname, approved, user_level FROM users WHERE $user_cond AND banned = 0"); // SELECT 
$sql->execute(); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$num = $connect->rowCount(); 

イムは、すべてを取り出し、私のシステムを書き換えるに保持しますmysql_ *とpdoを代わりに使用してください。

これは前にあったものである:私は間違っ

$result = mysql_query("SELECT `id`,`pwd`,`firstname`,`lastname`,`approved`,`user_level` FROM users WHERE 
      $user_cond 
      AND `banned` = '0' 
      ") or die (mysql_error()); 
$num = mysql_num_rows($result); 

何をしましたか?

そしてリストを()私が持っている:

list($id,$pwd,$firstname,$lastname,$approved,$user_level) = mysql_fetch_row($result); 

の代わりには、mysql_fetch_row($結果);私はPDOで何をすべきですか?

マイPDOオブジェクト/接続:

try{ 
$connect = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF-8", DB_USER, DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
} 
catch(PDOException $pe) 
{ 
    die('Could connect to the database because: ' .$pe->getMessage()); 

}

答えて

1

Fatal error: Call to a member function prepare() on a non-object

は通常、何かが失敗し、あなたの変数はあなたはそれがあることを期待するものではないことを意味します。 $connectionはおそらくfalseです。また

PDOStatement::fetch

list($id,$pwd,$firstname,$lastname,$approved,$user_level) = $sql->fetch(); 

ない接続で、声明にrowCountを呼び出す:

$sql->rowCount(); 
+0

更新質問を参照してください。私は$ connect – Karem

+1

のためのエラーを得ないかもしれませんあなたのコードを順番に投稿するべきでしょう。何とか '$ connection'が作成されておらず、あなたが提供したものが問題の原因を突き止めるには不十分です。 –

+0

$ connectが関数の外にあるためかもしれませんか?私はそれをグローバルにするべきですか?私はglobal $ connectで試したところです。 $ connect行の後に問題を修正しませんでした – Karem

0

誤差はMySQLの接続失敗に最も可能性が高いです - その$connectが有効PDOではありませんobject - エラーが示すように、あなたはそれをサポートしていないオブジェクトのメソッドを呼び出そうとしています。接続処理コードはどのように見えますか?接続が正常に作成されたかどうかを確認しましたか?

+0

はい更新された質問と接続を参照してください。 – Karem

+0

okと思われます。あなたは$ connectのvar_dump()を - > prepare()コールの直前に実行しようとしましたか? PDOは2つの方法でエラーを発生させることができます:例外とブール値FALSEを返します。あなたの設定はブールバージョンを行うことができるので、キャッチブロックは決して発射されません。 –

+0

私はvar_dumpを実行すると "NULL"になりますが、これは悪いですか? $ connectが関数の外にあるためかもしれませんか?私はそれをグローバルにするべきですか?私はglobal $ connectで試したところです。 $ connect行の後に、問題を解決しなかった – Karem

1

準備をしているので、名前付きパラメータ$ condを作成してからこれを実行してください: この例では条件はuser_idですが、複数の条件と複数の名前付きパラメータを持つことができます。

$sth = $pdo->prepare ("SELECT id, pwd, firstname, lastname, approved, user_level FROM users WHERE user_id = :cond AND banned = 0"); 
$sth->bindParam(':cond', $some_user_id); 
$sth->execute(); 
$a = $sth->fetch(PDO::FETCH_ASSOC); 

と同じようには$あなたのassiciateの配列になります、しますprint_r($ a)は、それに

1

だものを見るためには、スコープの問題のように見えます。

関数、クラス、名前空間内に$connectを割り当てているか、関数、クラスまたは名前空間で準備を実行していますか?

$connectを関数内に代入すると、その関数はPDO接続を返します。私はそうのような静的インスタンスを導入する:

class Database extends PDO 
{ 
    private $instance = null; 
    public static function Instance() 
    { 
     if(self::$instance == null) 
     { 
      self::$instance = new Database(); 
     } 
     return self::$instance; 
    } 

    private function __construct(){} 
    private function __connect() 
    { 
     try 
     { 
      parent::__construct("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF-8", DB_USER, DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)) 
     }catch(PDOException $e) 
     { 
      die($e->getMessage()); 
     } 
    } 
} 

はそのようにように使用:

$Database = Database::Instnace(); 

$Database->prepare("..."); 
関連する問題