1

次のようなコードを取得しました:

<?php
require_once("../classes/pdo.class.php");
$db = new mysql();
$db->connect();
class votingpanel{

    public function logintopanel($username, $password){

        //Dane z logowania + token
        $login = mysql_real_escape_string($username); 
        $password = mysql_real_escape_string($password); 

            $sql = $db->prepare("SELECT * FROM xxx WHERE username = '$login'");
            $sql = $db->exec($sql);
            if($sql == 1){
                $password = sha1($password);
                $sql = $db->prepare("SELECT * FROM xxx WHERE username = '$login'");
                $sql = $db->exec($sql);
                $row = $sql->fetch();

                if($row['password'] == $password and $row['toplistadmin'] == 1){
                    $_SESSION['toplist_admin'] = 1;
                    $_SESSION['toplist_adminloged'] = 1;

                }
                else{
                    return false;
                }
            }
            else{
                return false;
            }


    }

}

?>

pdoクラスは次のようになります。

<?php

require_once("../konfiguracja.php");

class mysql{
    public function connect(){
        try {
            $conn = new PDO('mysql:host=xxx;dbname=xxx', 'xxx', 'xxx');
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
        }
    }
}
?>

そしてその見返りに私はそのようなエラーを受け取ります:

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'radiolev'@'localhost' (using password: NO) in /home/radiolev/public_html/top/toplist.class.php on line 10

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/radiolev/public_html/top/toplist.class.php on line 10

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'radiolev'@'localhost' (using password: NO) in /home/radiolev/public_html/top/toplist.class.php on line 11

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/radiolev/public_html/top/toplist.class.php on line 11

Fatal error: Call to a member function prepare() on a non-object in /home/radiolev/public_html/top/toplist.class.php on line 13

mysqlパスワードが適切であるために表示される理由がわかりません。通常のmysql_connectで試してみましたが、機能しましたが、なぜここでpdoに表示されるのかわかりません。

4

3 に答える 3

4

mysql_real_escape_strings()をPDOで使用しようとしないでください。PDOライブラリにはなく(古くて厄介なmysqlライブラリにあります)、DBへの別の(グローバル-何とか)接続を使用します。

まず、mysql_real_escape_strings()を使用して2行を削除します。

次に、プリペアドステートメントを使用しているので、値をバインドします。これは簡単です。変数を手動で引用せずに、コロンで始まるプレースホルダーに置き換えるだけです。次に、bindValue()を呼び出します。これは、新しく作成されたPDOStatement(によって作成された$db->prepare())のメソッドです。最後に、ステートメントでexecuteを呼び出します。

              $sql = $db->prepare("SELECT * FROM xxx WHERE username = :login ");
              $sql->bindValue(":login", $login);
              $result = $sql->execute();

これにより、mysqlサーバー側の$ login変数が安全にエスケープされ、インジェクションから保護されます。

于 2013-01-01T17:27:44.713 に答える
1

関数を使用しないでください-現在PDOを使用しており、関数を使用すると、デフォルト設定で自動モードで接続が作成されます。

そして、クラス変数$dbで使用します。ただし、クラスメソッドの場合、これはローカル変数です。グローバル宣言を使用するか、関数のパラメーターとして(参照により)メソッドに$dbを指定する必要があります。

于 2013-01-01T17:27:24.070 に答える
0

mysql_*エスケープ関数をPDOと組み合わせて使用​​しているため、このコードはエラーを発生させています。mysql_real_escape_stringからのアクティブなデータベース接続が必要mysql_connectです。(理由は聞かないでください、でもそうです。)

とにかくPDOのプリペアドステートメントを使用している場合は、エスケープを気にしないでください。組み込みのパラメーターを使用して、次のように渡します。

// let $dbh be a PDO object, probably defined inside your mysql class
$stmt = $dbh->prepare("SELECT * FROM xxx WHERE username = ?");
$stmt->bindParam(1, $login);
$results = $stmt->execute();
于 2013-01-01T17:29:18.333 に答える