0

問題があります。入力したメールアドレス(ユーザー名)とパスワードをチェックして、ユーザーの正当性を検証しようとしています。users テーブルには次の列があります。

#   Name               Type          Collation      
     1  User_ID     int(10)UNSIGNED 
     3  Phone       bigint(10)              
     4  Street_Address  varchar(30)     latin1_swedish_ci       
     5  Apartment   int(5)              
     6  City        varchar(35)     latin1_swedish_ci            
     7  State       varchar(35)     latin1_swedish_ci           
     8  Zip_Code    int(5)              
     10 Login_Password  char(32)        latin1_swedish_ci               
     11 UserType    varchar(5)      latin1_swedish_ci   

電子メールとパスワードの入力を検証し、それらが制約を満たした後。ブール変数「$insert」を true に設定しました。次に、次の PHP コードがあります。

$check= "SELECT Name FROM users WHERE Email='$emailLogin' AND Login_Password='$passwordLogin'";

if(($result= ($db->query($check))) != false) // <--- PROBLEM HERE
     {
             $resultArray = $result->fetch();
             $name= $resultArray['Name'];

             $checkID= "SELECT User_ID FROM users WHERE Name= '$name'";
             $idResult= $db->query($checkID);

             if(count($idResult) >0)
             {
                $idArray= $idResult->fetch();
                $id= $idArray['User_ID'];
                    echo "userID is = ". $id;
                $_SESSION['user']= $name;
                $_SESSION['login']= true;
                $_SESSION['userID']= $id;
                //header('location:../view/userHome.php');
             }
             else
             {
                 include("../view/error.php?message=19");
                 exit();
             }
     }
     else
     {

         header("location: ../controller/login.php");
     }
}//end function

簡単に言えば、「if($result= ($db->query($check))) != false」で、問題が発生した場合に上記のコードに含まれています。一致する電子メール アドレスとパスワードが見つからない場合は、if 句を入力しないでください。誰かが私のコードの欠陥を指摘するか、より良いチェック方法を教えてくれますか?

「database.php」ファイルが必要な場合に備えて、次のファイルがあります。

<?php
    $dsn = 'mysql:host=localhost;dbname=store';
    $username = 'alex';
    $password = 'asdf1234';

    try {
        $db = new PDO($dsn, $username, $password);
    } catch (PDOException $e) {
        $error_message = $e->getMessage();
        include('database_error.php');
        exit();
    }
?>
4

2 に答える 2

0

データベース.php

<?php
$dsn = 'mysql:host=localhost;dbname=store';
$username = 'alex';
$password = 'asdf1234';
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
);
$db = new PDO($dsn, $username, $password, $opt);

database_error.php専用のファイルではなく、エラー ハンドラによって表示される一般化されたエラー ページがあることに注意してください。

問題に最も重要な ERRMODE に注意してください。クエリで実際に何が問題なのかがわかります。

そして、ここにパスワード チェック用の適切なコードがあり、無用なコードが大量に取り除かれています。

$sql = "SELECT Name, User_ID FROM users WHERE Email= ? AND Login_Password=?";
$stm = $db->prepare($sql);
$stm->execute([$emailLogin, $passwordLogin]);
if($row = $stm->fetch())
{
    $_SESSION['user']   = $row['name'];
    $_SESSION['userID'] = $row['id'];
    header('location:../view/userHome.php');
    exit();
}
else
{
    header("location: ../controller/login.php");
    exit();
}

簡単に言うと、 query() の結果は、クエリ エラーの場合にのみ false になります。したがって、それを使用してパスワードをチェックすることはできません。代わりに、フェッチされた値を確認する必要があります。それでも、最初に修正する必要があるクエリにエラーがあることを明確に示しています。

同じテーブルに対して 2 つのクエリを実行して、同じ行から 2 つの異なる値を取得することはほとんど意味がありません。多数の変数の割り当てと同様に。

そしてああ、はい。query()動的に構築されたクエリでは決して使用しないでください。代わりに、プレースホルダーを使用して準備/実行を使用する必要があります。

于 2013-10-25T07:19:41.257 に答える