0

わかりました。私はこのPDOにまったく慣れていません。mysqlスクリプト(機能している)をPDOスクリプト(機能していない)に再作成しようとしました。DBログイン情報がPDO用に正しくプログラムされていることをテストしました。

これは私のPDOスクリプトです...

<?

session_start();
//connect to DB
require_once("connect.php");

//get the posted values
$email=htmlspecialchars($_POST['email'],ENT_QUOTES);
$pass=md5($_POST['psw']); 

//now validating the email and password
$sql - $conn_business->prepare( "SELECT email, password FROM members WHERE email='".$email."'");
$sql -> execute();
$count = $sql->rowCount();
$result = $sql -> fetch();
// Now use $result['rowname'];

$stmt = $conn_business->prepare("SELECT * FROM members WHERE email='".$email."'");
$stmt ->execute();
$act = $stmt -> fetch();

//if email exists
if($count > 0)
{
//compare the password
if(strcmp($result["password"],$pass)==0)
{
    // check if activated
    if($act["activated"] == "0")
    {
        echo "act"; //account is not activated yet
    }
    else
    {
        echo "yes"; //Logging in
        //now set the session from here if needed 
        $_SESSION['email'] = $email;
    }
}
else
        echo "no"; //Passwords don't match
}
else
    echo "no"; //Invalid Login

?>

そしてこれは私の古いmysqlスクリプトです...

session_start();
require_once("connect.php");
//get the posted values
$email=htmlspecialchars($_POST['email'],ENT_QUOTES);
$pass=md5($_POST['psw']); 

//now validating the username and password
$sql="SELECT email, password members WHERE email='".$email."'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result); 

$sql2="SELECT * FROM members WHERE email='".$email."'";
$result2=mysql_query($sql2);
$row2=mysql_fetch_array($result2);
$act = $row2['activated'];

//if username exists
if(mysql_num_rows($result)>0)
{
    //compare the password
    if(strcmp($row['password'],$pass)==0)
    {
        // check if activated
        if($act == "0")
        {
            echo "act";
        }
        else
        {
            echo "yes";
            //now set the session from here if needed 
            $_SESSION['email'] = $email;
        }
    }
    else
            echo "no";
}
else
        echo "no"; //Invalid Login

誰か知っていますか、私が間違ったことをしましたか?これは自動的にスクリプトになります。AJAXを介して呼び出され、「no」、「yes」、「act」に基づいてデータを返し、AJAX/jQueryスクリプトに何をすべきかを指示します。ですから、PDOスクリプトで私が間違ったことを誰かに教えてもらえれば幸いです。

編集:

データをjQueryスクリプトに返すと、次のようになります。はいの場合:セッションを開始し、セッションが開始された状態でpage2.phpにリダイレクトします。それ以外の場合:アカウントがアクティブ化されていないフィールドに書き込みます。それ以外の場合:メールアドレスとパスワードが一致しなかったことを記入してください。

問題は、正しい電子メールとパスワードを書き込もうとすると、リダイレクトする代わりに「電子メールとパスワードが一致しませんでした」と書き続けるということです。スクリプトは説明どおりに機能しますが、PDOスクリプトは機能しません。

そして、私は「エコー「いいえ」;」を変更しようとしました。'エコー"はい";' とにかくログインが開始されるかどうかを確認しますが、どういうわけか、電子メールとパスワードが一致しなかったと書き込みを続けます。

解決:

不要だと思ったので言わなかったのですが、ページ上部のコメント欄に古いmysqlコードが入っていて、session_startコマンドが機能しなかったためです。 ..古いコードを削除した後、それは機能しましたが、変更するものが他に見つかりました。検証中のPDOスクリプトには、次のように表示されます。$ sql-$ conn_business-> prepare( "SELECT email、password FROM members WHERE email ='"。$email。"'"); 次に、$sqlの後の「-」を「=」に変更しました。これですべてが完全に機能します...とにかく皆さんに感謝します。このコードが他の人に役立つことを願っています。

4

2 に答える 2

0

スクリプトの2番目のクエリは必要ないと思います。簡単に実行できます。

   SELECT * FROM members WHERE email=:EMAIL AND password=:PWS;

bindParamメソッドを使用する

   $qCredentials->bindParam(":EMAIL",$EMAIL);
   $qCredentials->bindParam(":PWS",$PWS);

次に、 yesまたはnoではなく、より不安定出力を実行します。無効なタイプの値の場合は「ログインできません:無効な資格情報が提供されました」、無効なユーザー資格情報の場合は「ログインできません:無効な資格情報、ユーザーが見つかりませんでした」を 試してください。 ユーザーがIF条件に正常にログインし、yesを返した後、セッションの開始を試みることができます。



$PDOstatement->debugDumpParams()
$PDOstatement->errorInfo()
$PDOstatement->errorCode()

クエリで何がうまくいかなかったかを理解するのに役立ちます!

于 2012-05-28T16:14:34.107 に答える
0

PDOを「使い始める」前に、マニュアルを読んだこともありますか?

  • それは、準備されたステートメントが使用されることになっている方法ではありません!あなたのコードはSQLインジェクションで満たされています。
  • 同じ行を2回選択するのはなぜですか?
  • strcmp ()は、ある文字列が別の文字列と同一である場合のチェッシング用ではありません。
  • そして、単純なMD5のようにパスワードをハッシュすることは、単なる冗談です。

    session_start();
    
    //very stupid way to acquire connection
    require_once("connect.php");
    
    //get the posted values
    $email = htmlspecialchars($_POST['email'],ENT_QUOTES);
    if (filter_var( $email, FILTER_VALIDATE_EMAIL))
    {
        // posted value is not an email
    }
    
    // MD5 is not even remotely secure
    $pass = md5($_POST['psw']); 
    
    $sql = 'SELECT email, password, activated FROM members WHERE email = :email';
    
    $statement = $conn_business->prepare($sql);
    $statement->bindParam(':email', $email, PDO::PARAM_STR);
    
    $output = 'login error';
    
    if ($statement->execute() && $row = $statement->fetch())
    {
        if ( $row['password'] === $pass )
        {
            // use account confirmed
            if ( $row['activated'] !== 0 ) {
                $output = 'not activated';
                $_SESSION['email'] = $email;
            }
    
            $output = 'logged in';
        }
    }
    
    echo $output;
    
于 2012-05-28T16:20:22.937 に答える