0

SQL データベースとのセッションを使用してログイン システムを作成しました。正しいユーザー名とパスワードを入力するとログインできます。しかし、間違ったものを入力すると、Incorrect username or passwordメッセージが表示されず、checklogin.php ページ (空白のページ) にとどまります。どうすれば問題を解決できますか? これは checklogin.php です。

session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];

    $dbh = new PDO("mysql:host=$hostname;dbname=...", $username, $password);
    $sql = "select * from user where username='$myusername' and password='$mypassword' ";
    foreach ($dbh->query($sql) as $row){

if (isset($myusername) && isset($mypassword)) {
  if (($row['username']==$myusername) && ($row['password']==$mypassword)) {
    $_SESSION['login']='true';
    echo "Login successfully";
    echo"<a href='log_out.php'>Logout</a>";
    }else{
    echo "Incorrect username or password";
    }
}
    }
4

5 に答える 5

1

によって返された結果を数えるだけ$sqlで、ユーザーの資格情報を確認できます。countが1の場合、ユーザーはログインする必要があります。それ以外の場合は、Incorrect Password or Usernameメッセージが表示されます。

session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];
$dbh = new PDO("mysql:host=$hostname;dbname=...", $username, $password);
$sql = "select count(*) from user where username='$myusername' and password='$mypassword'";
if (isset($myusername) && isset($mypassword))
{
 $nRows = $dbh->query($sql)->fetchColumn(); 
 $count= (int) count($nRows);

 // If result matched $myusername and $mypassword, table row must be 1 row
 if($count==1){
 // Register $myusername, $mypassword and redirect to file "login_success.php"
 $_SESSION['login']='true';
 header("location:login_success.php");
 }
 else {
 echo "Wrong Username or Password";
 }
}
else {
 echo "Please enter Password and Username";
  }

でクレデンシャルを確認し、checklogin.php成功した場合はユーザーを別のページにリダイレクトlogin_success.phpすることをお勧めします(たとえば)。パスワードがの表示エラーと一致しない場合checklogin.php

于 2012-12-08T12:55:04.220 に答える
1
$row=$dbh->query($sql);
if ($row['username']='' && $row['password']!='') {
  if (($row['username']==$myusername) && ($row['password']==$mypassword)) {
    $_SESSION['login']='true';
    echo "Login successfully";
    echo"<a href='log_out.php'>Logout</a>";
    }else{
    echo "Incorrect username or password";
    }
}
于 2012-12-08T12:52:01.323 に答える
1

あなたのコードに何か奇妙なものがあります。一方では PDO 接続、もう一方では mysql_real_escape_string です。

したがって、コードを読みやすくするために、 PDO で準備済みステートメントを使用します。

session_start();
$mypassword=$_POST['mypassword'];
$myusername=$_POST['myusername'];
$dbh = new PDO("mysql:host=$hostname;dbname=", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql = "select * from user where username=:myusername AND password=:mypassword ";
$statement = $dbh->prepare($sql);
$statement->execute(array(':myusername'=>$myusername,':mypassword'=>$mypassword));
if($row = $statement->fetch(PDO::FETCH_ASSOC)){//if there is someone with given informations 
  echo "Welcome !";
else{
   echo "Wrong password or identifier";
}

ご覧のとおり、(prepare/execute または query を使用して) クエリを実行し、fetch を使用して結果を取得しています。PDO には、結果配列全体を取得できる関数 fetchAll があり、while ループの代わりに foreach でトラバースできます。

次に、私のコードには何かが欠けています。接続文字列にデータベース名を指定しなかったため、機能しません。

エラーを処理する行も追加しました。

于 2012-12-08T12:39:36.460 に答える
0
$sql = "select count(*) as exist from user where username='$myusername' and password='$mypassword' ";
foreach ($dbh->query($sql) as $row){
    if (row['exist'] > 0) {
        $_SESSION['login']='true';
        echo "Login successfully";
        echo"<a href='log_out.php'>Logout</a>";
    }else{
        echo "Incorrect username or password";
    }
}
于 2012-12-08T12:37:54.620 に答える
0

正しいユーザー名と正しいパスワードを持つユーザーを選択しています。次に、foreach ループを使用してそれらを反復処理します。
パスワードが間違っている場合、ステートメントは何も選択せず、foreach ループ内のコードは実行されません。エラー メッセージはそのループ内にあるため、エコーされません。
行が返された場合は数を確認し、数がゼロの場合はエラーを表示する必要があります。
ただし、これはループの外で行います。

于 2012-12-08T12:44:58.043 に答える