2

login.phpログインが成功すると、自動的に にリダイレクトされるように設定していますprofile.php。ただし、ログイン成功しても、いつアクセスしprofile.phpても「このページにアクセスするにはログインする必要があります」と表示されます。なんで?

これが私のものlogin.phpです:

$email = $_POST['email-field'];
$password = $_POST['password-field'];

if ($email && $password)
{
    $connect = mysql_connect("xx", "xx", "xx") or die("Couldnt connect!");
    mysql_select_db(xx) or die("Couldnt find db");

    $query = mysql_query("SELECT * FROM users WHERE email = '$email'");

    $numrows = mysql_num_rows($query);

    if ($numrows != 0)
    {

        while ($row = mysql_fetch_assoc($query))
        {
            $email = $row['email'];
            $md5password = $row['password'];
        }

        if ($email == $email && $md5password == md5($password))
        {
            header("Location: profile.php");
            $_SESSION['email']==$email;
        }
        else
            echo "Incorrect password";
    }
    else
        die("That user doessnt exist!");
}
else
    die("Please enter a username and a password");

そして私のprofile.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<?php 

include('get-info.php');

session_start();

if ($_SESSION['email'])
    echo "<a href=logout.php>Logout</a>";
else
    die("You must be logged in to access this page");


?>


<html>

    <head>

        <title>

            R-A | Profile

        </title>

        <link href='css.css' rel='stylesheet' type='text/css' />

    </head>

    <body class='body3' >

        <div class='logo-bar'>

            <div class='menu'>

                <img src='images/rateaway.png' class='logo-bar-img' />

                    <div class='menu-options'>

                        <a href='index.php' class='menu-links' >Home</a>

                        <a href='profile.php' class='menu-links' >Profile</a>

                        <a href='profile.php' class='menu-links' >Friends</a>

                    </div>

            </div>

        </div>

        <div class='profile-main-content' >

            <div class='profile-current-info'>

                <p class='profile-name'> <?php get_info('iran_mateu@yahoo.com', 'name'); ?> </p>

                <img src='<?php get_info('iran_mateu@yahoo.com', 'profilepic'); ?>' class='profile-pic'/>

                <p class='profile-dob' > Born: <?php get_info('iran_mateu@yahoo.com', 'dob'); ?> </p>

                <p class='profile-country' > Currently lives in: <?php get_info('iran_mateu@yahoo.com', 'country'); ?> </p>

                <p class='profile-gender' > Gender: <?php get_info('iran_mateu@yahoo.com', 'gender'); ?> </p>

            </div>

            <div class='profile-edit-info' >



            </div>

        </div>

    </body>
4

4 に答える 4

2

セッションを開始するのを忘れました。セッションを使用する各ページで、次を呼び出す必要があります。

session_start();

また、コンテンツを出力する前に必ずこれを行ってください。そうしないと機能しません。

于 2012-06-07T01:21:07.603 に答える
1

ログインに成功した後、セッションに書き込みを行っていません。この部分を考えてみましょう:

if ($email==$email&&$md5password==md5($password))
    {
        header("Location: profile.php");
        $_SESSION['email']==$email;
    }

=の代わりに使用する必要があり==ます。あなたはそうではないので、に割り当てていません。何も割り当てず、比較を行うだけです (そしてその戻り値を破棄します)。したがって、次のようになります。$email$_SESSION['email']

$_SESSION['email'] = $email;

また、session_start();ミニテックが彼の回答で提案したように、login.php の先頭に追加する必要があります。

于 2012-06-07T01:25:37.153 に答える
0

さらに、サインアップ ページでデータベースに複数の電子メールを許可しないという確固たる検証がない限り、クエリは次のようになります。

mysql_query("SELECT * FROM users WHERE email = '$email' LIMIT 1");

これにより、確実に 1 つのレコードのみが取得されます (理論上は常にそうなるはずです)。

最後に ($email == $email... うーん、基本的にそれ自体が等しいことを確認しているだけなので (常にそうなります)、これが正しいかどうかわかりません。混乱したと思います。実際には、$_POST から取得した $email 変数を db からのデータで上書きしているため、コードを次のように修正する必要があります。

while ($row = mysql_fetch_assoc($query))
{
   $db_email = $row['email'];
   $md5password = $row['password'];
}

if ( $email == $db_email && $md5password == md5($password) )
{
   // assign variables / do things BEFORE redirecting as there is a risk that
   // your session data may not get written in some circumstances
   $_SESSION['email'] = $email;
   header("Location: profile.php");
   // always good habit to make sure nothing else is done after the redirection
   die();
}

編集:

もう 1 つのヒント:

これ:

$email = $_POST['email-field'];
$password = $_POST['password-field'];

if ($email && $password)
{

次のようにするとよいでしょう:

session_start();
if ( isset($_POST['email-field']) && isset($_POST['email-field']) )
{
    $email = $_POST['email-field'];
    $password = $_POST['password-field'];
    // add some validation to your $email and $password variables

上記は、 $_POST 変数が設定されているかのように使用していた元のコードのように $_POST 変数が実際に設定されていない場合の通知を回避するのに役立ちます (設定されていない可能性があります) - これも良い習慣です。

于 2012-06-07T01:52:56.623 に答える
0

この関数のメモが必要です。

if ($email==$email&&$md5password==md5($password)) { header("場所: profile.php"); $_SESSION['email']==$email; }

提供:ガヤ ランバット

于 2014-09-02T07:33:25.097 に答える