0

PHPを使用して単純な動的Webサイトを作成しています。ここでは、ユーザーがログインして特定のページにアクセスできるようにしています。これが私がこれまでにしたことです。

ログインした値は、登録ユーザーのデータベースから値をフェッチするphpスクリプトの$_POST変数を介して取得されます。ユーザーが見つかった場合、私は次のことを行います。

session_register('userid');
$_SESSION['userid'] = $username;//this is taken from $_POST
$_SESSION['accesslevel'] = $access;

私が置いたphpスクリプトの始めにsession_start();

ここに私の問題があります。

すべてのページで、ユーザーがそのページを表示できるかどうかを確認する必要があります。許可されていない場合は、login.phpにリダイレクトする必要があります。許可されていない場合は、ページの読み込みを続行する必要があります。

これまでのところ、phpページ全体で値を維持する唯一の方法は$_SESSION変数を使用することであり、セッション変数を使用しているページは、最初の行として各ページに書き込む必要がありますsession_start()。そうしないと、ヘッダーが既に送信されます。エラー..

不思議なことに、私はそれを正確に実行しましたが、それでも「ヘッダーはすでに送信されています」とエラーが発生します。

したがって、ほとんどのページでSession変数を使用し、これらの一般的なチェックを共通の場所に保持する必要があるWebサイトを設計するための最良の方法を知りたいと思います。

  • include()機能をどのように使用できますか?
  • セッションは、phpページ間でデータを通信する唯一の方法です。
  • より良い方法は何ですか?

私は次のコードを持っています:

<?php
session_start();
if(!isset($_SESSION['user']))
{
    $_SESSION['loc'] = "adminhome.php";
    header("location:ettschoollogin.php");
    exit();
}
    ?>

これは、ユーザーがログインしたかどうかを確認したいすべてのページの上部にあります。

そしてこれはログインをチェックするためのスクリプトです

<?php
session_start();
include("connection.php");
$userid =$_POST['userid'];
$userpwd =$_POST['userpwd'];

$query="Select UNAME,UPASSWORD,SCHOOL,uaccess from schooluser where uname = '$userid'";

$result=mysql_query($query) or die("couldn't execute the query");
$row=mysql_fetch_array($result);
$useraccess = $row["uaccess"];


$school =$row[2];

if(($row[0]==$userid)&&($row[1]==$userpwd))
{
        session_register('userid');
        $_SESSION['userid']=$userid;
        $_SESSION['school']=$school;

    if($useraccess =="admin")   
    {       
        header("Location:adminhome.php");
    }

    if($useraccess !="admin")
    {
        header("Location:school_main.php");

    }
}
else
{
    header("Location:ettschoollogin.php?err=1"); 
}
?>

「?>」の後に余分なスペースがあるという一般的なエラーを認識していましたが、それでも取得できます。

みんなありがとう、私は逃しました、そして「connection.php」ファイルは私が前にそれを削除した「?>」の後に実際に余分なスペースを持っていました、しかしいくつかの方法でファイルは再び書き直されました。どうもありがとう。

4

3 に答える 3

2

•include()機能をどのように使用できますか?

はい。session_start()を呼び出す前に、好きなことを行うことができます。ただし、スペースや文字が1つでも、何も出力してはいけません。おそらく、自動インクルージョンまたはapache prependで、すでに何かを出力している可能性があります。

•セッションは、phpページ間でデータを通信する唯一の方法です。•より良い方法は何ですか?

他の方法は、Cookie、投稿、パラメータの取得です。ただし、セッションは、データをクライアントに送信したり返送したりせずにページ間でデータを安全に渡す唯一の方法です(セキュリティ上のリスクが生じる可能性があります)

于 2009-08-24T12:15:26.563 に答える
2

はい、インクルードを使用できます。すべての一般的な関数を個別のphpファイルに入れ、各ファイルの先頭に「インクルード」します。

Cookieを使用して情報を保存できます(通常、PHPページで追加情報を検索するために使用するIDのみ)。通常、PHPセッションはCookieを使用して処理されます。setcookieドキュメントを参照してください。

<?php ?>ブロック外の文字の迷いが原因でエラーメッセージが表示される可能性があります。一般的なエラーは、インクルードファイルの最後の。の後に余分な空白行があること?>です。その空白行が出力され、ヘッダーが送信されます。それが問題ではない場合は、セッション関連のコードを、出力を生成する可能性のあるコードの上に移動する必要があります(たとえば、printまたはechoを使用します)。

于 2009-08-24T12:19:42.307 に答える
1

コードの先頭に書くob_start();と、「ヘッダーはすでに送信されています」というエラーは表示されません。

于 2012-08-22T05:35:14.217 に答える