2011-09-25 5 views
0

基本的に私がここに設定したのは、非常にシンプルで一般的なログインです。コードのコピー全体を貼り付けて貼り付けました。しかし、PHPプログラムが関数を否定していますか?

$user = mysql_real_escape_string($_POST['User']); 
$pass = mysql_real_escape_string(md5($_POST['Pass'])); 
$conn = mysql_connect("localhost", "root") or die(mysql_error()); 
(mysql_select_db('fireworks', $conn)); 
$ask = "SELECT * FROM name WHERE (User = '" . $user . "') and (Pass = '" . $pass . "');"; 
$result = mysql_query($ask); 

以下のコードは完全に無視されています。ログイン(インデックスページから)を押すと、一連の小切手を実行することになっています。ユーザーは、以下の文字列のショーを返すために仮定されているユーザーとパスワードテキストボックス内の何も入れていないことを決定した場合:(ここまで^)

if (strlen($user) < 1){ 
    if (strlen($pass) < 1){ 
     print "<p class = 'Back'>Epic Fail</p>"; 
     print "<p>You forgot to put in your Username or Password.</p>"; 
    } 
} 

をしかし、それはしていません。代わりにその空白のページ。しかし、他のすべては正常に動作します。私が偽のユーザーを入力すると、「あなたは失敗します!」というメッセージが返されます。有効なユーザーを入力すると、「WELCOME BACK」が返されます。

if (strlen($user) >= 1){ 
    if (mysql_num_rows($result) >= 1) { 
     while ($row = mysql_fetch_array($result)) 
     { 
      print "<p class='Back'>Welcome back</p><p>" . $row['User'] . "</p>"; 
     } 
    }else{ 
     print "YOU FAIL!!!"; 
    } 
} 

お勧めはありますか?注釈:データベースは花火と呼ばれ、テーブルは名前と呼ばれます。名前テーブルには3つの列があります。名前ID、ユーザー、およびパス。 (これは便利ですが、時にはそれがどのようにIDK)

+0

strlen($ user)の値を確認していますか?たぶん、1 – rwilliams

+0

以上でコードをインデントする必要があります。読みやすくすることができます。 – Spudley

答えて

2

あなたのコード::あなたはこれにそれを変更したい場合があります

実際には

if (strlen($user) < 1){ 
if (strlen($pass) < 1){ 
print "<p>You forgot to put in your Username or Password.</p>"; 
} 
} 

、これは$userまたはブランクであること$passをチェックしません。 のいずれもが空白の場合にのみ、エラーメッセージが表示されます。

それぞれのテストは大丈夫ですが、のテストは$userテストの結果がtrueの場合にのみ実行されます。あなたがあるためにそうように、or条件と一緒にそれらを書くために必要なもの

:助け

if (strlen($user) < 1 or strlen($pass) < 1){ 
.... 
} 

希望。

+0

ありがとうございます。それは他の誰もが私に与えたパイプシンボルの方法と比べるとずっと混乱していて、それほど人気が​​ありません。 – bnynn

+0

PHPは、単語 'or'または二重パイプ'||'を受け取ります。彼らはまったく同じことをしています。 (ほとんどの経験豊富なプログラマは二重パイプを好みますが、それらの間には若干の微妙な違いがありますが、これらの違いは無関係です) – Spudley

+0

'$ pass'が' md5($ _ POST ['Pass']) '$ pass'は決して空の文字列ではありません。空文字列にもハッシュがあります。 –

1

これを試してみてください。

if (strlen($user) < 1 || strlen($pass) < 1){ .... } 
0

あなたがIFSを入れ子にしているので、ユーザ名とパスワードの両方が上がらないとき「エピック失敗は」のみが表示されます入りませんでした。

if (strlen($user) < 1 || strlen($pass) < 1) 
{ 
    print "<p class = 'Back'>Notice</p>"; 
    print "<p>You forgot to put in your Username or Password.</p>"; 

} 
0

mysql_real_escape_stringのドキュメントでは、文字セットのデータベースに接続しようとしています。チェックの前にデータベースに接続していないと、非常にうまくいくかもしれません。エラー報告が、E_WARNINGレベルエラーを返したかどうかを確認することができます。

もう1つのことは、データベースコールが不要なときにデータベースコールを回避する必要があることです。重要なコードの全部があれば、エスケープしてデータベースの処理を続ける前に、両方のチェックを呼び出す必要があります。また、empty()関数も役に立ちます。

if(!empty($_POST['User']) || trim(strlen($_POST['User'])) < 1) { 
// database stuff 
} 
+0

あなたは 'strlen(trim($ pass))<1)'を意味します。 – tttony

関連する問題