2011-07-29 13 views
2

データベースに2人のユーザーがいます。ログインしようとするとインデックスページに残ります。データベースに1人のユーザーがいる場合、正常にログインできますが、2人のユーザーがインデックスページにリダイレクトします。問題は何ですか?PHPログインスクリプトが動作しない

<?php 

include("connect.php"); 

$username = $_POST["username"]; 
$password = $_POST["password"]; 

$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 

echo $username; 
echo $password; 

if (empty($_POST['username']) || empty($_POST['password'])) 
{ 
    //$_SESSION["login_error"] = "1"; 
    echo 'error code 1'; 
    header ('Location: ../index.php'); 
} 

//$password = sha1($password); 

$sql = "SELECT * FROM users"; 
$result = mysql_query($sql); 
if (!$result) die('Invalid query: ' . mysql_error()); 

$userid = ""; 

while ($row3 = mysql_fetch_array($result, MYSQL_ASSOC)) 
{ 

    if(($username == $row3["username"]) && ($password == $row3["password"])) 
    { 
      $userid = $row3["id"]; 
      $_SESSION["userid"] = $userid; 

      //$online = mysql_query("UPDATE numbers SET online='1' WHERE id='".$userid."'") 
      //or die(mysql_error()); 

      //$type = mysql_query("UPDATE numbers SET type='facetime' WHERE id='".$userid."'") 
      //or die(mysql_error()); 
      echo $userid; 
      echo 'error code 2'; 
      header ('Location: ../control_panel.php'); 
    } 
     else 
     { 
      $userid = ""; 
      $_SESSION["userid"] = ""; 
      header ('Location: ../index.php'); 
      echo 'error code 3'; 
     } 

     //debug 
     //echo $password; 
     //$useridvar = $_SESSION["userid"]; 
     //echo $useridvar; 
} 
     if ($_SESSION["userid"]=="") 
    { 
     header ('Location: ../index.php'); 
     echo 'error code 4'; 
    } 



    //else 
    //{ 
    // $userid = ""; 
    // $_SESSION["userid"]= ""; 
    // header ('Location: ../login.php'); 
    //} 

?> 

答えて

4

コードが非常に悪いです。ユーザーテーブル全体をループしていますか?それはひどい。これを試してみてください:header()機能へ

<?php 

include("connect.php"); 

$username = $_POST["username"]; 
$password = $_POST["password"]; 

$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 

if (empty($_POST['username']) || empty($_POST['password'])) 
{ 
    header ('Location: ../index.php?emptyusernameorpassword'); 
    die(); 
} 

$result = mysql_query("SELECT * FROM users where username = '".$username."' and password = '".$password."' LIMIT 1") or die('Invalid query: ' . mysql_error()); 
$row3 = mysql_fetch_assoc($result); 

if(mysql_num_rows($result) != 0) 
{ 
    $_SESSION["userid"] = $row3["id"]; 

    header ('Location: ../control_panel.php'); 
    die(); 
} 
else 
{ 
    $_SESSION["userid"] = ""; 
    header ('Location: ../index.php?invaliduserorpassword'); 
    die(); 
} 

?> 
+0

それをより良くする方法に関する提案は – mintuz

+0

私のポストを編集し、上記のコードを試してください。 – technology

+0

よろしくお願い致します.D – mintuz

1

'header'コマンドを発行する前に出力することはできません。

また、headerコマンドの直後に 'exit'を発行する必要があります。

2

あなたの呼び出しはecho()への呼び出しが先行しています。私が知る限り、あなたのスクリプトが前に出力を生成していれば、HTTPヘッダーを追加することはできません。また、Location HTTPヘッダーには、http://または/で始まる絶対パスが必要です。その後、header()への呼び出しの直後にexit()コールを追加して、後で他のヘッダー情報が追加されないようにする必要があります。

+0

私はそれらを取り除きましたが、まだ動作しません。 – mintuz

+0

Locationヘッダーの絶対パスを使用して、それが役立つかどうかをお知らせください。 –

-1

エラーログを確認しましたか?

テキストをエコーし​​てからヘッダーを送信していますが、これはうまく動作しません。

php.iniでdisplay_errorsを1に設定していることを確認してください。 ファイルの先頭にerror_reporting(-1);

0

私はsession_start()をどこで呼び出すことができません。これは、あなたが$ _session ['var']を任意のスクリプトで使用したい場合は、最初にsession_start()を使用してセッションを開始してから、すべてのheader()コールの後に 'exit; ''なし、すなわち出口。そうでなければ、スクリプトは実行を継続し、ヘッダに指定されたリンクをロードしません。

3

他の回答は、あなたの主な間違いを既に指摘しています。「ヘッダーを送信する前に何も出力しない」 Develrootによると、ユーザーテーブルのすべてのレコードをループしてはいけないとも言われています。

しかしあなたはまだあなたがインデックスにリダイレクトされている2人のユーザーで、これが答えです理由に興味がある場合:

あなたのループでは、あなたがのすべてのレコードをループにすることを計画適切なものを見つけたら適切な場所にリダイレクトし、悪いものが見つかった場合はインデックスにリダイレクトします。

  • レコード1:良いユーザー

    ので、テーブル内のレコードの順序に応じて、あなたのコードは通常、このでしょうか?はい。次に、 "場所"を "パネル"に設定します

  • レコード2:いいえ?いいえ、 "Location"を上書きし、 "index"に設定します。

良いユーザーを見つけてループを壊すと、コードが機能します。 (非効率的だが動作するだろう)。

もちろん、実際にはは、Develrootの示唆する方法でこの手順を設計する必要があります。

+0

+1ユーモラスな説明のため:) – Torxed