0

私はphpとmysqlに非常に慣れていません。サイトに登録およびログイン セクションを作成するための優れたチュートリアルを見つけました。私はそれをかなりうまく解体し、小さな変更を加えています。でも...

ログイン時にパスワードが正しくない場合は検証され、エラーが返されます。正しければログインします。

私が抱えている問題は、正しいパスワードを入力しても、検証もログインも行わずに余分な文字を追加すると、空白のページに移動することです。ログインページの検証コードは次のとおりです -

<?php
include('db.php'); 
if(!isset($_POST['login']))//checking if user has entered this page directly
{
include('form.php');
}
else{
if(isset($_POST['user'])&&$_POST['user']==""||!isset($_POST['user']))
{
$error[] = "Username Field can't be left blank";
$usererror = "1";
}
if(!isset($usererror))
{
$user = mysql_real_escape_string($_POST['user']);
$sql = "SELECT * FROM users WHERE user = '$user'";
if(mysql_num_rows(mysql_query($sql))=="0")//1 means there is one entry same so we print error
{
$error[] = "Can't find a user with this username"; 
}
}
if(isset($_POST['pass'])&&$_POST['pass']==""||!isset($_POST['pass']))
{
$error[] = "password Field can't be left blank";
}
if(isset($error)){
if(is_array($error)){echo "<div class=\"error\"><span>please check the errors and refill the form<span><br/>";
foreach ($error as $ers) {     
echo "<span>".$ers."</span><br/>";
}
echo "</div>";
include('form.php');
}
}
if(!isset($error)){
$suser=mysql_real_escape_string($_POST['user']);
$spass=md5($_POST['pass']);//for secure passwords
$find = "SELECT * FROM users WHERE user = '$suser' AND password = '$spass'";
if(mysql_num_rows(mysql_query($find))=="1"or die(mysql_error())){
session_start();
$_SESSION['username'] = $suser;
header("Location: loggedin.php");
}
else{
echo "<div class=\"warning\"><span>Some Error occured durring processing your data</div>";
}
}
}
?>

どんな助けでも大歓迎です...

編集

パスワードが入力されていない場合にのみエラーが発生することに気付きました。間違ったパスワードを入力すると、空白の白いページが表示されます。パスワードが検証されない理由について誰か助けてもらえますか?

4

3 に答える 3

2

trim()文字列の前後の余分なスペースを処理するために使用します

ロジックの問題のように見えます。条件を整理するには、括弧を使用する必要があります。

if(
    (isset($_POST['pass'])&&$_POST['pass']=="")
  ||
    !isset($_POST['pass'])
)
于 2013-01-26T02:50:15.130 に答える
0

if(mysql_num_rows(mysql_query($find))=="1"or die(mysql_error())){

SQL クエリが結果を返さない場合 (パスワードとユーザー名が一致しなかったことを意味します)、if ステートメントは false を返し、何も起こりません。その場合、エラー メッセージを返す必要があります。

編集:

その後、elseステートメントに気づきませんでした。実際の問題はdie(mysql_error())だと思います。SQL クエリが結果を返さない場合、その if ステートメントは die(mysql_error()) を実行します。空の結果はエラーではないため、ブランクが返されます。

die(mysql_error()) を削除し、別の if ステートメントを含めて mysql_errno() (エラーがある場合に true を返す) をチェックすることをお勧めします。

if (mysql_errno()) { die(mysql_error()); }

最近のバージョンの PHP では mysql_* 関数が非推奨になっていることに注意してください。PHP で MySQL に接続するには、MySQLi または PDO を使用することをお勧めします。

于 2013-01-26T03:07:25.653 に答える
0

これを試して、動作するかどうかを確認してください。

if(mysql_num_rows(mysql_query($find))=="1") {
  session_start();
  $_SESSION['username'] = $suser;
  header("Location: loggedin.php");
} else {
  echo "<span>Your username or password was incorrect.</span>";
  include "form.php";
  die;
}
于 2013-01-26T03:18:08.503 に答える