2

すべてのクエリを PDO 形式に書き直そうとしています。現在、この関数を書き直そうとしていますが、うまくいかないようです。

mysql_query 関数

    function checkLogin() {

    $this->sQuery = "SELECT * FROM users 
          WHERE gebruikersnaam='" . mysql_real_escape_string($_POST['gebruikersnaam']) . "'
          AND wachtwoord = '" . sha1($_POST['wachtwoord']) . "'";


    $this->rResult = mysql_query($this->sQuery)
            or die("Er is iets misgegaan " . mysql_error());


    if (mysql_num_rows($this->rResult) == 1) {  // login name was found            
        $this->aRow = mysql_fetch_assoc($this->rResult);
        $_SESSION['gebruiker'] = $this->aRow['voornaam'];

        header("location: dashboard.php");
    }
}

そして、これは私がPDOでどこまで来たかです:

       function checkLoginPDO(){
    $connect = new PDO(host, username, password); // Database Connectie maken (De host, username & password zijn in de config.php aan te passen)
    $sql = "SELECT * FROM users 
          WHERE gebruikersnaam='" . mysql_real_escape_string($_POST['gebruikersnaam']) . "'
          AND wachtwoord = '" . sha1($_POST['wachtwoord']) . "'"; 
    $value = $connect->prepare($sql); //Een variabele aanmaken die de PDO vast houdt. Vervolgens word de code voorbereid door de prepare functie
    $value->execute(); 
    if(mysql_num_rows($value->fetch()) == 1){
        $_SESSION['gebruiker'] = $row['voornaam'];
        header("location: dashboard.php");
    }
}

私は何を間違っていますか/忘れていますか?

前もって感謝します!

4

4 に答える 4

2

次のようになります。

function checkLoginPDO(){
    $connect = new PDO(host, username, password); // Database Connectie maken (De host, username & password zijn in de config.php aan te passen)
    // define sql query string with special placeholders in the form of ?
    $sql = "SELECT * FROM users 
      WHERE gebruikersnaam=?
      AND wachtwoord =?";
    // prepare statement based on sql query string
    $statement = $connect->prepare($sql);
    // bind first question mark with value from $_POST, first question mark will be replaced with that value
    $statement->bindParam(1, $_POST['gebruikersnaam']);
    // do the same for second question mark
    $statement->bindParam(2, sha1($_POST['wachtwoord']));
    // execute this prepared statement with binded values
    $statement->execute();
    // fetch row from the result in the form of associated array
    if(($row = $statement->fetch(PDO::FETCH_ASSOC))){
        $_SESSION['gebruiker'] = $row['voornaam'];
        header("location: dashboard.php");
    }
    // free statement memory
    $statement = null;
}

注: コードはテストされていません。

編集、説明の追加: PDO を使用する場合は、クエリとデータベースを処理する方法を使用する必要があります。mysql_* 関数を使用することは、これを行う最適な方法ではありません。

于 2013-02-27T09:54:38.643 に答える
1
  • まず、必要なエラー処理のタイプを決定します。PDO のデフォルトPDO::ERRMODE_SILENTは、エラーが発生しないことを意味します。これは、コードの周りのブロックを操作PDO::ERRMODE_EXCEPTIONする必要があることを意味します。try { ... } catch() { ... }

  • 次に、PDO を使用している場合、関数を使用できませんmysql_*。したがって、使用mysql_real_escape_stringは正しくありません。さらに、準備済みステートメントを使用しているため、SQL インジェクション保護はまったく必要ありません。ただし、 param bindingを使用する必要があります。

  • mysql_queryまた、 7号線の周りにもいくつかあります...

  • PDO には組み込み機能がありませんmysql_num_rowsCOUNT(*)そのためには、クエリにステートメントを入れる必要があります。この回答も参照してください

于 2013-02-27T09:55:26.623 に答える
0
function checkLoginPDO(){
$connect = new PDO(host, username, password); // Database Connectie maken (De host, username & password zijn in de config.php aan te passen)
$sql = "SELECT * FROM users 
      WHERE gebruikersnaam=:gebruikersnaam
      AND wachtwoord = :wachtwoord"; 
$value = $connect->prepare($sql);
$value->bind(':gebruikersnaam',$_POST['gebruikersnaam']);
$value->bind(':wachtwoord',sha1($_POST['wachtwoord']));
$value->execute();
$data = $value->fetchAll();
if(count($data) > 0){
    $_SESSION['gebruiker'] = $data[0]['voornaam'];
    header("location: dashboard.php");
}

}

于 2013-02-27T09:58:11.900 に答える
0

ログイン機能が驚異的に機能するようになりました! みんなありがとう!ファイル名をデータベースに書き込む画像アップロード スクリプトが完成しました。動作しますが、SQL インジェクションなどから安全ですか?

私は現在、セキュリティが大きな問題である最後の研究プロジェクトに取り組んでいます。私が一般的なセキュリティ CMS をオフにすることができれば、プログラマーとしての学位を取得できます :)

関数は次のとおりです。

function uploadImage() {
    $dir = $_SERVER['DOCUMENT_ROOT'] . 'pvb/upload/';
    $allowedExts = array("jpg", "jpeg", "gif", "png");
    $extension = end(explode(".", $_FILES["file"]["name"]));
    if ((($_FILES["file"]["type"] == "image/gif")
            || ($_FILES["file"]["type"] == "image/jpeg")
            || ($_FILES["file"]["type"] == "image/png")
            || ($_FILES["file"]["type"] == "image/pjpeg"))
            && ($_FILES["file"]["size"] < 2000000)
            && in_array($extension, $allowedExts)) {
        if ($_FILES["file"]["error"] > 0) {
            echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
        } else {
            if (file_exists($dir . $_FILES["file"]["name"])) {
                echo $_FILES["file"]["name"] . " already exists. ";
            } else {
                move_uploaded_file($_FILES["file"]["tmp_name"], $dir . $_FILES["file"]["name"]);
                $this->createThumbs($dir, $dir . "thumbs/", 100);

                $connect = new PDO(host, username, password); // Database Connectie maken (De host, username & password zijn in de config.php aan te passen)
                $sql = "INSERT INTO afbeeldingen (img_naam) VALUES (:naam)";
                $value = $connect->prepare($sql);
                $value->bindValue(":naam", $_FILES['file']['name'], PDO::PARAM_STR);
                $value->execute();
                $connect = null;
            }
        }
    } else {
        echo "Invalid file";
    }
}
于 2013-02-27T10:22:18.967 に答える