0

こんにちは私はPDOを使用するためにmysqliphpファイルをどのように移行するのか疑問に思いました。誰かが私のコードを見て、私が正しい方向に進んでいるかどうかを確認できますか?

これは私の元の(mysqli)コードです:

<?php
    // connecting to database
    $conn = new mysqli('xxxxxx', 'xxxxxx', 'password', 'xxxxxx');

    $match_email = 'email';
    $match_passhash = 'passhash';

    if (isset($_POST['email'])) {
        $clean_email = mysqli_real_escape_string($conn, $_POST['email']);
        $match_email = $clean_email;
    }

    if (isset($_POST['passhash'])) {
        $clean_passhash = mysqli_real_escape_string($conn, $_POST['passhash']);
        $match_passhash = sha1($clean_passhash);
    }

    $userquery = "SELECT email, passhash, userlevel, confirmed, blocked FROM useraccounts
                  WHERE email = '$match_email' AND passhash = '$match_passhash'
                  AND userlevel='user' AND confirmed='true' AND blocked='false';";

    $userresult = $conn->query($userquery);
    if ($userresult->num_rows == 1) {
        $_SESSION['authorisation'] = 'knownuser';
        header("Location: userhome.php");
        exit;
    } else {
        $_SESSION['authorisation'] = 'unknownuser';
        header("Location: userlogin.php");
        exit;
    }
?>

そして、これはそれをPDOに移行する私の試みです:

<?php
    // connecting to database
    $dbh = new PDO("mysql:host=xxxxxx; dbname=xxxxxx", "xxxxxx", "password");

    $match_email = 'email';
    $match_passhash = 'passhash';

    if (isset($_POST['email'])) {
        $clean_email = mysqli_real_escape_string($conn, $_POST['email']);
        $match_email = $clean_email;
    }

    if (isset($_POST['passhash'])) {
        $clean_passhash = mysqli_real_escape_string($conn, $_POST['passhash']);
        $match_passhash = sha1($clean_passhash);
    }

    $userquery = "SELECT email, passhash, userlevel, confirmed, blocked FROM useraccounts
                  WHERE email = ':match_email' AND passhash = ':match_passhash' AND
                  userlevel='user' AND confirmed='true' AND blocked='false';";

    $stmt = $dbh->prepare($query);
    $stmt->bindParam(":match_email", $match_email);
$stmt->bindParam(":match_passhash", $match_passhash);
$stmt->execute();

    $userresult = $conn->query($userquery);
    if ($userresult->num_rows == 1) {
        $_SESSION['authorisation'] = 'knownuser';
        header("Location: userhome.php");
        exit;
    } else {
        $_SESSION['authorisation'] = 'unknownuser';
        header("Location: userlogin.php");
        exit;
    }
?>

また、PDOで返され​​る行数をカウントする方法もわかりません。

誰かが私を助けることができれば、それは非常に素晴らしいことです。

よろしくお願いします!

4

1 に答える 1

0

プリペアド ステートメントを使用し、$stmt->bindValue()または$stmt->bindParam()で値をエスケープする必要がない場合mysqli_real_escape_string()、PDO がそれを行います。

値に正しいデータ型を設定することを忘れないでください。これはバインド関数の 3 番目の引数であり、デフォルトでは文字列であるため、ここのコードは問題ありません。参照は必要ないので、bindValue()代わりに使用するだけです。bindParam()

$stmt->execute()準備されたステートメントをクエリとして実行します。もう 1 つ$conn->query()は、準備済みステートメントでは機能しません。これは、MySQLi で使用していたような生のクエリ用です。

実行する$stmt->execute()と、応答がオブジェクトに保存され$stmtます。行数には を使用します$stmt->rowCount()

于 2012-08-20T02:07:17.200 に答える