3

以下のコードを実行すると、このエラーが発生します。私は通常msql関数を使用しましたが、代わりにPDOを使用しようとしました。なにが問題ですか ?

致命的なエラー:非静的メソッドPDO :: query()を14行目で静的に呼び出すことはできません

<?php 

if(isset($_POST['username']) AND isset($_POST['password'])) {

$username = $_POST['username'];
$password = $_POST['password'];
$password_hash = md5($password);

if (!empty($username) AND !empty($password) ) {


$query = "SELECT 'id' FROM `userdatabase` WHERE 'email'='$username' AND      'password'='$password_hash'";

if($query_run = PDO::query($query)){

$query_num_rows = PDO::rowcount($query_run);
if ($query_num_rows==0){
echo 'invalid password/username';

} else {
echo 'Username/password  = correct';
}


}


} else {
echo 'You must enter a password..';
}

} 


?>
4

4 に答える 4

3

まず、静的メソッドを使用できる場合、データベースにどのように接続すると思いますか?

__construct()コンストラクター( )はデータベースに接続するため、PDOはインスタンスである必要があります。PDO::__construct($params)PHPには静的コンストラクターがないため、静的メソッドがある場合は実行できません。

したがって、PDOをインスタンス化します。

$pdo = new  PDO('mysql:dbname=testdb;host=localhost', 'root', 'password');

そして、クエリを実行します。

$result = $pdo->query('SELECT * FROM table WHERE 1=1');
于 2012-06-23T20:50:12.643 に答える
3

::sign は、静的として定義されたメソッドを呼び出すために使用されます。つまり、このメソッドを呼び出すためにオブジェクトのインスタンスを作成する必要はありません。メソッドは静的ではありません。つまり、最初にオブジェクトを作成してから、そのオブジェクトでメソッドを呼び出すquery()必要があります。PDOquery()

これは次のようになります。

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$pdo = new  PDO($dsn, $user, $password);
$result = $pdo->query('SELECT * FROM table');  //here $result is a set of results that can be accessed like arrays;
于 2012-06-23T20:42:35.437 に答える
2

エラーメッセージはそれをすべて示しています。queryメソッドを静的メソッド(クラスをインスタンス化する必要のないメソッド)として呼び出していますが、静的メソッドではありません。

なぜ静的関数にできないのかについてもう少し背景を説明します(あなたの質問は、それがこのエラーを解決したい方法だと私に信じさせるからです)。

  • PDOオブジェクトをインスタンス化するときは、データベースホスト、ユーザー名、パスワード、dbのタイプ、およびデフォルトのデータベースをコンストラクターに渡します。(これらはすべて必須のパラメーターではありません)。データベースサーバーへの接続が確立されるため、データを照会できます。

  • クエリメソッドが静的である場合は、実行するクエリごとに、接続、クエリ、切断して結果を返す必要があります。明らかに、これは良いアプローチではありません。

  • PDOオブジェクトを使用すると、クエリを実行するだけでなく、多くのことを実行できます。DBがInnoDBエンジンで実行されているとします。静的クエリメソッドは、クエリを実行しようとするだけDELETEですが、問題が発生したときにセーフティネットの余地はありません。PDOは、データの破損を防ぐための$db->commit();とメソッドを提供します。$db->rollBack();

PDOクラスを拡張したり、静的メンバー関数を作成したりすることを考えるべきではない理由は他にもたくさんありますが、ドキュメントを読んで自分で調べることができます。

あなたの例では、クエリが実行された後に行数を取得したいとします。それが何を意味するかを考えてみてください。この値をそのプロパティの1つに割り当てるインスタンスはなく、クエリを実行したばかりのデータベースへの接続もありません。ケースで行数を取得する唯一の方法は、クエリを再実行してカウントすることです。IMO、それはばかげている

于 2012-06-23T20:50:12.317 に答える
0

クエリはデータベース接続で実行する必要があります。

query静的関数として使用することはできませんが、$con->query()代わりに使用してください。

PDOオブジェクトが指定されていない場合、PDOはどの接続が使用するかをどのように知ることができますか? (複数持つこともできます)

于 2012-06-23T20:42:39.523 に答える