2013-10-23 4 views
7

データベースに保存せずに1人のユーザーに1回ログインさせたいが、これを動作させることができない。非常に単純な1つのユーザー名/パスワードのログインをPHPで作成

私のコードは:

<html> 
<head> 
    <title>Login</title> 
</head> 
<h3>Add entry</h3> 
<p> Add another Article</p> 
<form action="trylog.php" method = "post"> 
    <label for="username">Username</label> <input type="username" id="usename" name="username"><br /><br /> 
    <label for="password">Password:</label> <input type="text" id="password" name="password"><br /><br /> 
    <button type = "submit">Login</button> 
</form> 
</html> 

trylog.php

<html> 
<title>Login</title> 
<body> 
    <?php 
    $usr = "admin"; 
    $psw = "password"; 
    $username = '$_POST[username]'; 
    $password = '$_POST[password]'; 
    //$usr == $username && $psw == $password 
    session_start(); 
    if ($_SESSION['login']==true || ($_POST['username']=="admin" && $_POST['password']=="password")) { 
    echo "password accepted"; 
    $_SESSION['login']=true; 
    else { 
     echo "incorrect login"; 
    } 
    ?> 

    <form name="input" action="adminportal.php" method="get"> 
    <input type="submit" value="Home"> 
    </form> 
</body> 
</html> 
+2

はどこlogin.phpであなたの 'body'です(ユーザのみログインがそれにアクセスすることができますか)? – PHPglue

+0

ヘッダーが送信される前に、セッションを 'session_start();'で初期化する必要があります。[documentation](http://php.net/manual/en/function.session-start.php )。つまり、 'html'や任意の' echo'や何かが訪問者のブラウザに返送される前のことです。また、 'else'文の前に括弧をつける必要があります。 –

答えて

15

あなたのコードはより多くのようになります。さて、ページがheader('LOCATION:wherever.php)に基づいてリダイレクトされたときに

<?php 
session_start(); 
$errorMsg = ""; 
$validUser = $_SESSION["login"] === true; 
if(isset($_POST["sub"])) { 
    $validUser = $_POST["username"] == "admin" && $_POST["password"] == "password"; 
    if(!$validUser) $errorMsg = "Invalid username or password."; 
    else $_SESSION["login"] = true; 
} 
if($validUser) { 
    header("Location: /login-success.php"); die(); 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html;charset=utf-8" /> 
    <title>Login</title> 
</head> 
<body> 
    <form name="input" action="" method="post"> 
    <label for="username">Username:</label><input type="text" value="<?= $_POST["username"] ?>" id="username" name="username" /> 
    <label for="password">Password:</label><input type="password" value="" id="password" name="password" /> 
    <div class="error"><?= $errorMsg ?></div> 
    <input type="submit" value="Home" name="sub" /> 
    </form> 
</body> 
</html> 

$_SESSION['login'] === true確認するために、ページの最上部とテストでsession_start()を置きます。 ==は、$_SESSION['login'] == 1の場合も同様です。 もちろん、これはセキュリティ上の理由から悪い考えですが、私の例ではPHPを使用する方法が異なります。

+0

私はこの1つが好きですが、あなたはただ1つしか持っていませんか? "11行目にあまりにも多くの数があります – Wim

+1

なぜ巨大なhtmlの文字列がエコーされていますか? phpはテンプレート言語です。 –

+0

二重引用符で囲まれた変数があります。 – PHPglue

1

login.phpまず、あなたは通常、ページの上部に、ブラウザに任意の出力の前にsession_start();を配置する必要があります。 Have a look at the manual.

第二に、これはあなたの結果には影響しませんが、これらの線はどこにも使用されていない、削除する必要があります。

$usr = "admin"; 
$psw = "password"; 
$username = '$_POST[username]'; 
$password = '$_POST[password]'; 

...と最後の2行が動作しないでしょう、あなたは、角括弧内の引用符を配置する必要があります:あなたがあなたのページ(すなわち<html>タグなど)の上部にsession_start()を置く場合

$username = $_POST['username']; 

、これは正常に動作する必要があります。

+0

実際には、Francisco Presenciaのコメントに、あなたの欠けている括弧についての質問に注意してください。 –

0
<?php 
session_start(); 
    mysql_connect('localhost','root',''); 
    mysql_select_db('database name goes here'); 
    $error_msg=NULL; 
    //log out code 
    if(isset($_REQUEST['logout'])){ 
       unset($_SESSION['user']); 
       unset($_SESSION['username']); 
       unset($_SESSION['id']); 
       unset($_SESSION['role']); 
     session_destroy(); 
    } 
    // 

    if(!empty($_POST['submit'])){ 
     if(empty($_POST['username'])) 
      $error_msg='please enter username'; 
     if(empty($_POST['password'])) 
      $error_msg='please enter password'; 
     if(empty($error_msg)){ 
      $sql="SELECT*FROM users WHERE username='%s' AND password='%s'"; 
      $sql=sprintf($sql,$_POST['username'],md5($_POST['password'])); 
      $records=mysql_query($sql) or die(mysql_error()); 

      if($record_new=mysql_fetch_array($records)){ 

       $_SESSION['user']=$record_new; 
       $_SESSION['id']=$record_new['id']; 
       $_SESSION['username']=$record_new['username']; 
       $_SESSION['role']=$record_new['role']; 
       header('location:index.php'); 
       $error_msg='welcome'; 
       exit(); 
      }else{ 
       $error_msg='invalid details'; 
      } 
     }  
    } 

?> 

// replace the location with whatever page u want the user to visit when he/she log in 
0

あなたのコードでは、より多くのようになります。ここでは

<?php 
session_start(); $username = $password = $userError = $passError = ''; 
if(isset($_POST['sub'])){ 
    $username = $_POST['username']; $password = $_POST['password']; 
    if($username === 'admin' && $password === 'password'){ 
    $_SESSION['login'] = true; header('LOCATION:wherever.php'); die(); 
    } 
    if($username !== 'admin')$userError = 'Invalid Username'; 
    if($password !== 'password')$passError = 'Invalid Password'; 
} 
?> 
<!DOCTYPE html> 
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'> 
    <head> 
    <meta http-equiv='content-type' content='text/html;charset=utf-8' /> 
    <title>Login</title> 
    <style type='text.css'> 
     @import common.css; 
    </style> 
    </head> 
<body> 
    <form name='input' action='<?php echo $_SERVER['PHP_SELF'];?>' method='post'> 
    <label for='username'></label><input type='text' value='<?php echo $username;?>' id='username' name='username' /> 
    <div class='error'><?php echo $userError;?></div> 
    <label for='password'></label><input type='password' value='<?php echo $password;?>' id='password' name='password' /> 
    <div class='error'><?php echo $passError;?></div> 
    <input type='submit' value='Home' name='sub' /> 
    </form> 
    <script type='text/javascript' src='common.js'></script> 
</body> 
</html> 
1

ログインするための単純なPHPスクリプトのみログインユーザーがアクセスすることができるページです。

login.php

<?php 
    session_start(); 
    echo isset($_SESSION['login']); 
    if(isset($_SESSION['login'])) { 
     header('LOCATION:index.php'); die(); 
    } 
?> 
<!DOCTYPE html> 
<html> 
    <head> 
    <meta http-equiv='content-type' content='text/html;charset=utf-8' /> 
    <title>Login</title> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
    </head> 
<body> 
    <div class="container"> 
    <h3 class="text-center">Login</h3> 
    <?php 
     if(isset($_POST['submit'])){ 
     $username = $_POST['username']; $password = $_POST['password']; 
     if($username === 'admin' && $password === 'password'){ 
      $_SESSION['login'] = true; header('LOCATION:admin.php'); die(); 
     } { 
      echo "<div class='alert alert-danger'>Username and Password do not match.</div>"; 
     } 

     } 
    ?> 
    <form action="" method="post"> 
     <div class="form-group"> 
     <label for="username">Username:</label> 
     <input type="text" class="form-control" id="username" name="username" required> 
     </div> 
     <div class="form-group"> 
     <label for="pwd">Password:</label> 
     <input type="password" class="form-control" id="pwd" name="password" required> 
     </div> 
     <button type="submit" name="submit" class="btn btn-default">Login</button> 
    </form> 
    </div> 
</body> 
</html> 

admin.php

<?php 
    session_start(); 
    if(!isset($_SESSION['login'])) { 
     header('LOCATION:login.php'); die(); 
    } 
?> 
<html> 
    <head> 
     <title>Admin Page</title> 
    </head> 
    <body> 
     This is admin page view able only by logged in users. 
    </body> 
</html> 
関連する問題