プロが教える店舗&オフィスのセキュリティ対策術

このユーザ認証プログラムが最後の2行(ページを(userpage)に飛ばす)の命令が実行しません。※最後の2行を追加する前の部分は正常動作するのは確認済みです。
 ちなみに、この2行をこのプログラムの上部に移動すると指示通りのページに移ります。
 まる2日間、この問題解決が見えません。どなたか御指南下さい。

<?
/*=========================================
ユーザ認証(Login処理) loginexe.php
===========================================*/

session_start();

// テーブルに uid とpasswdの組が存在するかどうかを調べる。
$con = mysql_connect("サーバー名","データベース名","パスワード");
//データベースを選択する。
$selectdb = mysql_select_db("データベース名",$con);
$sql = "select passwd from tbl_user where uid='$uid'";
$r = mysql_query($sql,$con);
if( mysql_num_rows($r) != 1) {
print "アカウントが違う、もしくはユーザ登録されていません。";
print '<a href="reguser.php">こちらから登録してください。</a>';
session_destroy();
exit;
}
print "tbl_user1のパスワード:".mysql_result($r, 0, "passwd1")."<br>";
if( mysql_result($r, 0, "passwd1") != $passwd1) {
print "パスワードが違います。";
print '<a href="index.php">戻る</a>' ;
session_destroy();
exit;
}

//$_SESSION[セッション変数名] = 値;
$_SESSION[suid] = $uid;

//ページをuserpageに飛ばす
header("Location: userpage.php");
?>

A 回答 (4件)

お二人とも現象について書いていらっしゃるので私はマニュアルから引用しておきます.


ちなみに同様にマニュアルに書いていますが,Locationは絶対URIでなければなりませんので,マニュアルを参考に絶対URIの生成方法を習得されることをお勧めいたします.

下記引用>>

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。

参考URL:http://php.net/header
    • good
    • 0

Locationで次の処理に移って変数を渡せないとかうまくいかないという質問を良く見かけますがrequire()かinclude()の方が適切な場合が多いようです。


ご質問のケースも
header("Location: userpage.php");
ではなく
include "userpage.php";
で良いのではないでしょうか
    • good
    • 0

がると申します。


#1さんもおっしゃってますが、本質的には「ヘッダとボディの出力タイミング」による問題です。
直接的に解決する方法はいくつかあるのですが。
とりあえず、
ob_start、ob_end_flush という関数を調べてみてください。
具体的には…物凄くアバウトですが、プログラム行頭でob_start()、exit直前を含むプログラム終了直前にob_end_flush() を埋め込みます。
    • good
    • 0

途中でprintしているので動きません。


headerはprintする前に置かないと動きません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!