0

私はPHPに少し慣れていないので、ログインフォームで次のことをしようとしています: - index.php: ログイン (reglogin.phpへのリンク) - reglogin.php: 登録またはログインのいずれか。ログイン時: 電子メールがデータベースにあるかどうかを確認します。その場合 --> ログインして成功ページに移動します。成功ページへのリダイレクトが機能しません。

index.php

<?php session_start(); $page=(isset($_GET['page']))?$_GET['page']:"index"; ?>
<!DOCTYPE html>
....
<body>
    <?php include 'includes/header.php'; ?>

    <div class="content">
        <?php
        $frontpage="page/home.php";
        $page404="page/404.php";
        $folder="page/";

        if ($page=="index") {
            include_once($frontpage);
        }
        else {
            include_once((file_exists($folder.$page.".php"))?$folder.$page.".php":$page404);
        }
    </div>
</body>

include/header.php

<div class="header">
    <?php
        if (isset($_SESSION['email'])) {
            ?>
            <ul><li><a href="index.php?page=logout">Log out</a></li></ul>
        <?php
        }
        else { ?>
            <ul><li><a href="index.php?page=reglogin">Log in</a></li></ul>
        <?php }
        ?>    
</div>

Reglogin.php

<?php if (!isset($_SESSION['email'])) {  ?>
    <form method="post" action="index.php?page=logincheck" class="loginform">
        <fieldset>
            <input type="text" name="login_email" />
            <input type="text" name="login_password" />
            <input type="submit" name="login_submit" />
        </fieldset>
    </form>
<?php } else { echo "U are already logged in"; } ?>

Logincheck.php

<?php
    session_start();
    include 'includes/config.php';

    // if session['email'] doesn't exit    
    if (!isset($_SESSION['email'])) {
    if (isset($_POST['login_email']) && isset($_POST['login_password'])) {
                $login_email = $_POST['login_email'];
        $login_password= $_POST['login_password'];       

                    if (!empty($login_email) && !empty($login_password)) {
                        $query = 'SELECT Email, Password FROM tblregpersons
                                    WHERE Email="' . $login_email .  '"
                                    AND Password="' . $login_password .  '"';
                        if ($query_run = mysql_query($query)) {
                            $query_num_rows = mysql_num_rows($query_run);
                            if ($query_num_rows == 0) {
                                echo "invalid";
                            }
                            else {
                                $_SESSION['email'] = $_POST['login_email'];
                                header('location: index.php?page=succes');
                                exit();
***// This redirect doesn't work. The page stays on logincheck.php.***
                            }                     
                        }
                        else {
                            echo "query failed";
                        }
                    }                
                    else {
                        echo "Please fill in an email/password";
                    }
            }
            else {
                echo "no post";
            }
    else {
        "U are already logged in";
    }
?>

私は登録フォームも持っているので、私は で作業しており$_SESSION['email']、この「電子メール」セッションを登録およびログイン フォームの POST にリンクしています。

このリダイレクトで何が間違っていますか?

4

5 に答える 5

2

ヘッダーを呼び出す前に ob_flush を試すことができます。ヘッダーの前に出力が出力される場合があります。また、正確なエラーが発生するように、すべてのエラーを表示するように php を構成します。

于 2013-05-09T10:19:42.377 に答える
0

これは logincheck.php の新しいバージョンです - ここに直接投稿するようにフォームを変更してください

これは参照されている唯一のスクリプトであるため、出力はなく、リダイレクトは機能するはずです

<?php
session_start();
include 'includes/config.php';

// if session['email'] doesn't exit
$error='';
if(!isset($_SESSION['email']))
{
    if(isset($_POST['login_email']) && isset($_POST['login_password']))
    {
        $login_email = $_POST['login_email'];
        $login_password= $_POST['login_password'];       

        if(!empty($login_email) && !empty($login_password))
        {
            $query = "SELECT Email, Password
                FROM tblregpersons
                WHERE Email='".mysql_real_escape_string($login_email)."'
                AND Password='".mysql_real_escape_string($login_password)."'";
            $query_run = mysql_query($query);
            if($query_run)
            {
                $query_num_rows = mysql_num_rows($query_run);
                if($query_num_rows != 1)
                {
                    $error="invalid";
                }
                else
                {
                    $_SESSION['email'] = $_POST['login_email'];
                    header("Location:index.php?page=success");
                    exit();
                }
            }
            else
            {
                $error='sql error '.mysql_error();
            }
        }
        else
        {
            $error="Please fill in an email/password";
        }
    }
    else
    {
        $error="no post";
    }
}
else
{
    $error="U are already logged in";
}
header("Location:index.php?page=logincheck&error=".urlencode($error));
exit();

?>
于 2013-05-09T11:50:09.517 に答える
0

あなたの index.php スクリプトは、Logincheck.php が機能する前に出力を生成しています。

<?php
session_start();
$page=(isset($_GET['page']))?$_GET['page']:"index";
if($page=='logincheck')
{
    include('logincheck.php');
}
else
{
?>
<!DOCTYPE html>
....
<body>
    <?php include 'includes/header.php'; ?>

    <div class="content">
    <?php
    $frontpage="page/home.php";
    $page404="page/404.php";
    $folder="page/";

    if($page=="index")
    {
        include_once($frontpage);
    }
    else
    {
        include_once((file_exists($folder.$page.".php"))?$folder.$page.".php":$page404);
    }
    ?>
    </div>
</body>
<?php
}
?>

注:あなたの質問はLogincheck.phpと言っていますが、あなたのスクリプトはlogincheck.phpを意味しています

別の解決策は、フォームを logincheck.php に投稿し、ヘッダーを適切なページに配置するか、デフォルトでエラー メッセージとともに index.php に戻すことです。

于 2013-05-09T11:22:35.063 に答える
-1

session_start()ページの先頭で を使用する必要があります。

于 2013-05-09T10:00:21.383 に答える
-2

スクリプトの先頭で既に出力を送信しているため、スクリプトはリダイレクトされません。

<?php if (!isset($_SESSION['email'])) {  ?>
<form method="post" action="index.php?page=logincheck" class="loginform">
    <fieldset>
        <input type="text" name="login_email" />
        <input type="text" name="login_password" />
        <input type="submit" name="login_submit" />
    </fieldset>
</form>
< ?php } else { echo "U are already logged in"; } ?>

php.ini ファイルで output_buffering を編集し、値 4096 (推奨) を指定すると、問題が解決するはずです。

于 2013-05-09T10:10:25.650 に答える