2

私は自分のローカルマシンで開発しているphpサイトを作っています。これは本当に初めてなので、これは私が今まで試みた最初のことです。ホストに移動すると、次のエラーが表示されます。

 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied             for user 'matthew'@'localhost' (using password: NO)  on line 11

ここでかなり検索しましたが、クエリを「準備」する必要があるため、それはかなり確信しています。私が確信が持てないのは、いつ準備するのが正しいのか、いつ準備しないのかということです。詳細を説明するために、いくつかのクエリを以下に追加しました。

データベースへの接続:

$hostname = "localhost";
$username = "root";
$password = "root";

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=wmpt", $username, $password);
//echo "Connected to database"; // check for connection
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }

クエリの例を次に示します。

$username = mysql_real_escape_string($_POST['run']);


$STH = $dbh->query("SELECT * FROM tblusers WHERE username = '$username' ");
$STH->setFetchMode(PDO::FETCH_ASSOC);  
$result = $STH->fetch();

私の質問は、ユーザーが送信したデータを使用して DB をクエリ/挿入/更新する場合にのみ、クエリを「準備」する必要がありますか?

上記のクエリは悪い習慣ですか? ユーザーが送信したデータが含まれていない場合、つまり、クエリを実行したい場合

 $STH = $dbh->query("SELECT * FROM tblusers WHERE username LIKE '%hotmail%' ");

これはおそらく悪い例ですが、開発者が定義したクエリを示しています。

これが私が得る理由ですか、どうすれば回避できますか:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for     user 'matthew'@'localhost' (using password: NO)  on line 11
4

2 に答える 2

4

PDO を使用している場合は、使用しないでくださいmysql_real_escape_string。PDO ライブラリには、はるかに優れた機能を果たす非常に堅牢なSQL プレースホルダー メソッドがあります。

$STH = $dbh->query("SELECT * FROM tblusers WHERE username = :username");
$STH->bindParam(':username', $username);
$STH->setFetchMode(PDO::FETCH_ASSOC);  
$result = $STH->fetch();
于 2012-10-23T19:44:42.640 に答える
4

受け取ったエラーに対処するにmysql_real_escape_string()は、 を介して開いている接続が必要ですmysql_connect()。持っていないため、接続を試みて失敗していmatthewます (PDO は で接続しているのに対し、のユーザー名を使用していますroot)。さらに、混合して一致させることはできません (またはすべきではありません) 。それらは異なるライブラリです。mysql_real_escape_string()PDO

プリペアド ステートメントを使用する「タイミング」に関しては、一般的な経験則として、値がハードコーディングされていないときはいつでも使用できます。の例をLIKE '%hotmail%'準備する必要はありません。ハードコードされており、変更されることはありません (もちろん、手動で更新しない限り)。

任意の種類の変数、 または からのデータ、または開発者がクエリの 10 行前に作成した変数を受け取るクエリがある場合は$_POST$_GET準備されたステートメントを使用する必要があります (または、少なくともエスケープして、チェックアウトしてください)。PDO::quote )。

于 2012-10-23T19:39:49.200 に答える