session_startについての質問

このQ&Aのポイント
  • ログイン時に違うサーバーに戻ってしまう問題の原因が判明しない初心者が手がかりを求めています。
  • PHPのsession_start関数について、sakuraインターネットでは正常に動作するが別のサーバーでは正常に動作しないという問題に悩んでいます。
  • ログイン時に設定画面にリダイレクトさせるプログラムを作成している初心者が、違うサーバーでは正常に動作しない原因が分からず、助言を求めています。
回答を見る
  • ベストアンサー

session_startについて

初心者です。 以下のように、ログイン時、設定画面adminpage.htmlに行くように作っています。 sakuraインターネットでは動くのですが、 もう一方の違うサーバーでは、login.phpに戻ってきてしまいます。 原因が判りません。 手がかりが欲しいのですが、 お詳しい方がおられましたら教えてください。 よろしくお願い致します。 <?php require("MySmarty.class.php"); require('Settings.class.php'); $smarty = new MySmarty(); $settings = new Settings; session_start(); $id = $_SESSION['id']; $pass = $_SESSION['pass']; //idとパスワードに不具合有れば、login.phpへ戻る。 if( ( $id == '' ) || ( !$settings->isValidUser($id,$pass) ) ){ header("Location: login.php" ); print $_SESSION["id"]; print $_SESSION["pass"]; print $id; print $pass; exit; } $settings->loadSettings(); $smarty->assign('maintitle', $settings->maintitle); $smarty->assign('subtitle', $settings->subtitle); $smarty->assign('error_message', $settings->errorm); $smarty->display('adminpage.html'); ?>

  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 1minn
  • ベストアンサー率57% (52/90)
回答No.2

読み込んでるクラスの中身が気になります。 Smartyを使っているような書き方ですが、 $smarty->display('adminpage.html'); ここってtplにはならないのですか? あまりSmartyは触った事がないので、このような方法もあるのであればすみません。 また、settingsって定義ファイルっぽいですけど、ここで認証処理を実装されているのですか? 初めは組み込みのクラスかと思ったのですが、Smartyマニュアルには無いようなので・・・ とりあえず、 header("Location: login.php" ); が実行されて戻ってきているのであれば、その後のprintの中身って見れないですよね? 意味がない気がしますが・・・

その他の回答 (1)

  • gtx456gtx
  • ベストアンサー率18% (194/1035)
回答No.1

$smartyでセッションを動作させたことないので参考になれば・・・ セッションですが、上手く動作しなくて調べたら・・・session_start();を最初の独立してスタートさせないと正しく動作しないことがあるようです。 私は別な原因だったので解決していますが、いまでも下記のような感じで記述しています ------------ <?php session_start(); ?> この行を第一行目に書いて、独立させる <?php . . . ?> ------------

hatokamome
質問者

お礼

ありがとうございます。 試してみましたが、エラーになってしまいます。 サーバーの条件におるのかもしれないと思います。 DBからのデータ取得がうまくいていないかもしれないので調べてみます。

関連するQ&A

  • PHP4.3.9+smartyのsessionについて

    お世話になります。 PHPで、ログイン画面・入力画面・登録を作りたいと思ってます。 手始めにsessionをクッキーを使わずに使用したいと思い簡単に作ってみました。 login.phpの記述(ログイン) $smarty=new SubSmarty; session_start(); $_session[] $_session["id"]='abcde'; $smarty->display("insert.tpl"); nyuryoku.tpl <html> <head> </head> <body> {$smarty.session.id} </body> <html> この時点でsessionの中身が見れません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • php session_start()

    いつもお世話になっております PHP session_start()について質問させていただきます。 ブラウザで確認すると以下のワーニングが表示されます。 Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ファイル名) in ファイル名 過去の質問を参考にしてphpinfo()を使用してサーバの設定を確認したところ、Session Supportはenabledとなっております。 また、余分なスペースなどが無いよう、コードを1行にまとめて試してみましたが同じ結果でした。 コードは以下のとおりです。ちなみにサーバはレンタルサーバを使用しております。 ■index.php <?php  $documentroot = dirname( __FILE__) . '/';  require_once $documentroot . '../php_libs/config/config.inc.php';  require_once("Auth/Auth.php");  require_once("HTML/QuickForm.php");  require_once("HTML/QuickForm/Renderer/ArraySmarty.php");  require_once( _SMARTY_LIBS_DIR . "Smarty.class.php");  require_once( _MODULE_DIR . "build_screen.inc.php");  require_once( _MODULE_DIR . "menu.inc.php");  require_once( _MODULE_DIR . "MYDB.inc.php");  require_once( _MODULE_DIR . "sub.inc.php");  main(_MEMBER_FLG);  exit; ?> ■main関数 <?php  function main($systemflg){   // セッション名の設定   $sess_name = ($systemflg) ? _SYSTEM_SESSNAME : _MEMBER_SESSNAME;   session_name($sess_name);   // セッション開始   session_start(); ~以下省略~ どこに問題があるかお分かりの方いらっしゃいましたら、ご回答のほどよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Smartyでテンプレートが読み込めない

    下記のソースを実行すると、テンプレートが読み込めずエラーになってしまいます。 うーん、何故なのか分からず困っております。 phpのバージョンは4.4.6なのですが、Ver5以降でないとサポートされないのでしょうか。 [source] <?php require_once("Smarty.class.php"); class MySmarty extends Smarty { function _MySmarty() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; } } $o_smarty=new MySmarty(); $o_smarty->display("hello.tpl"); ?> [error message] Warning: Smarty error: unable to read resource: "hello.tpl"

    • ベストアンサー
    • PHP
  • こんにちは、PHP初心者です。

    こんにちは、PHP初心者です。 Smartyを利用してWebサイトを構築中です。 Smarty.classの派生クラスを作成し、コンストラクタ内でDB接続オブジェクトをprivateプロパティ($_db)に設定しているのですが,query文のところでエラーSELECT * FROM books [nativecode=1046 ** No database selected]となります。ためしにコンストラクタ内でクエリを実行したところテーブルから値を取得できました。なぜコンストラクタ外に出るとエラーになるのかわかりません。どなたかご教示ください。どうぞよろしくお願いします。 下記ソースです。 =====派生クラス======================= <?php $user = "dbuser"; $pass = "dbpassword"; $name = "mobilephp"; $host = "localhost"; require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("mysql://$user:$pass@$host/$dbname"); } public function __destruct() { $this->_db->disconnect(); } public function get_db() {return $this->_db;} } ?> ======end===================================== ==========メインのPHP=================================== <?php require_once("../MySmarty.class.php"); $o_smarty=new MySmarty(); $db=$o_smarty->get_db(); $stt=$db->query("SELECT * FROM books");←ここでエラーになる $data=array(); while($row=$stt->fetchRow(DB_FETCHMODE_ASSOC)){ $data[]=array("isbn"=>$row['isbn'],"title"=>$row['title'], "publish"=>$row['publish'],"price"=>$row['price']); } $o_smarty->assign("data",$data); $o_smarty->display("structure.html"); ?>

    • ベストアンサー
    • PHP
  • SESSION の受け渡し

    初心者ですので、見当違いの質問の場合はご容赦ください login.php(ユーザ認証) cart.php(ショッピングカート) という構成でSESSION変数の受け渡しを行いたいのですが login.php で認証確認後、 session_start(); $_SESSION['su_id'] = $u_id ; $_SESSION['su_name'] = $u_name ; のように設定の上 require "./cart.php"; でcart.phpを呼び出し(?)ています require直後のcart.phpの初期状態では $_SESSION['su_id'] 、$_SESSION['su_name']ともに正しく表示しますが submit等(次ページ表示などで)で再表示を行うと $_SESSION['su_id'] 、$_SESSION['su_name']が引き継がれません cart.phpにおける session_start()時に、新しいIDに置き換わっているからだと思いますが このようなケースではどういう処置を行えばよいのでしょうか? 幼稚な質問かどうかすら判断できていないのですが コメントを頂ければ助かります よろしくお願いします

    • 締切済み
    • PHP
  • セッション

    phplibを使わないでユーザ認証を用いたwebサイトを作ろうと思います。 shinki.php => login.php => contents1.php=> contents2.php .... のような流れの構造で、直接contents1.phpなどに入られないようにセッションを使用したいと思います。 ユーザが持っているセッション名と、サーバー側のセッション名が一致するという条件だけでログインしたユーザと考えていいのでしょうか? 現在はこのような感じになっています。 まずshinki.phpでユーザー登録します。この時ユーザ情報と暗号化されたパスワードをDBに保存。 login.phpでユーザIDとパスワードを入力し、DBのデータと一致するとcontents1.phpに進む。この時セッションを発行し、idと暗号化されたパスワードをセッションに記憶させる。 contents(1 | 2).phpのコード <? session_start(); // PostgreSQL 接続 if (!($cn = pg_connect("dbname=****"))){die;} // SQL文 $sql = "select * from ***** where id='$_SESSION[id]'"; if (!($rs = pg_exec($sql))) {die;} $ct = pg_numrows($rs); for ($i = 0; $i < $ct; $i++) { $array = pg_fetch_array($rs, $i); } // セッションのパスワードとデータベースのパスワードが一致 if($_SESSION[pass] == $array['pass']){ login_html(); }else{ print "ログインしてください。"; } // PostgreSQL 切断 pg_close($cn); function login_html(){ print "<html><head><title><title></head><body>"; .... .... } ?> このような構造には、セキュリティー的な問題はあるのでしょうか? おそらくいろいろ問題があると思いますので、ご指導お願いします。 一般的なパスワード制のページではどのような処理をしているのでしょうか? よろしくお願いします。 os:linux httpd:apache1.3.27 postgreSQL php4.x.x

    • ベストアンサー
    • PHP
  • smartyのdifineについて

    表示するファイルにdefineにてパスを設定すると正常に 表示されるのですが管理が面倒なので別のファイルに defineにてパスを設定するとエラーになってしまいます。 具体的には以下のソースです。 ---Smarty/libs/path.php--- define ('SMARTY_LIBS_DIR', 'C:/Program Files/xampp/htdocs/Smarty/libs/'); ---Smarty/libs/MySmarty.class.php--- require_once dirname(__FILE__) . '/Smarty.class.php'; require_once dirname(__FILE__) . '/path.php'; ---Smarty/index.php--- require_once SMARTY_LIBS_DIR . 'MySmarty.class.php'; 調べてみたのですが表示するファイルに指定する方法しか みつからなかったのですが別ファイルから指定する事は 無理なのでしょうか?

    • 締切済み
    • PHP
  • PHPのセッションについて

    PHPのセッションについて 現在ログインフォームを作成しているのですが、 ログインフォームからIDとパスワードを送信して、合っていれば セッションを発行してロケーションで飛ばそうと思っているのですが、 初回時にIDとパスワードを入力して送信しても、セッションが引き継がれず 2回目以降だとセッションが引き継がれる症状に悩んでおります。 どなたかご教授ください。 宜しくお願いいたします。 【login.php】-------------------------------- <?php session_name("stock"); session_start(); $error_flag = 0; if(isset($_POST["login"])){ $id = htmlentities($_POST["id"],ENT_COMPAT); $password = trim(htmlentities($_POST["password"],ENT_COMPAT)); if($login_id == $id && $login_pass == $password){ $_SESSION["id"] = $id; $_SESSION["password"] = $password; header("Location:stock.php"); exit; }else{ $error_flag = 1; } } echo <<<EOD <form method="post" action="login.php" id="login"> <input type="text" name="id" id="id" > <input type="password" name="password" id="password"> <input type="submit" name="login" value="ログイン" /> </form> EOD; 【stock.php】--------------------------------- <?php session_name("stock"); session_start(); echo $_SESSION["id"]; echo $_SESSION["password"]; ?>

    • ベストアンサー
    • PHP
  • Smartyに関しまして

    require_once("Smarty/Smarty.class.php"); $smarty = new Smarty(); $smarty->template_dir = "./templates"; $smarty->compile_dir = "./templates_c"; $smarty->assign("message", "こんばんは"); $a = array('hello','php','html'); $smarty->assign('a',$a); $smarty->display("index.tpl"); これでindex.tplで出力すると日本語部分が「?????」になってしまいます。 何か設定がいるんでしょうか??

    • ベストアンサー
    • PHP
  • こんにちは、PHP初心者です。

    こんにちは、PHP初心者です。 Smartyを利用してWebサイトを構築中です。 Smarty.classの派生クラスを作成し、コンストラクタ内でDB接続オブジェクトを privateプロパティ($_db)に設定しているのですが$_dbの値が アクセサメソッドを通じてgetすると空白になってしまいます。 色々やってみましたが理由が分からず、 ためしにコンストラクタ内でクエリを実行したところテーブルから値を取得できました。 なぜコンストラクタ外に出るとprivateプロパティの値が取得できなくなるのか分かりません。 どなたかご教示ください。 どうぞよろしくお願いします。 下記ソースです。 *(Smarty.classの派生クラス)********************************************** <?php require_once("DB.php"); require_once("Smarty.class.php"); class MySmarty extends Smarty{ private $_db; public function __construct(){ parent::__construct(); $this->template_dir="C:/xampp/modules/access_control/templates"; $this->compile_dir="C:/xampp/modules/access_control/templates_c"; $this->config_dir="C:/xampp/config"; $this->config_load("access_control.conf",basename($_SERVER['SCRIPT_NAME'],".php")); $tihs->_db=DB::connect($this->get_config_vars('db_string')); if (PEAR::isError($db)) { die($db->getMessage()); } } public function __destruct(){ $this->_db->disconnect(); } public function get_db(){return $tihs->_db;} } ?> *********************************************** *(メインのPHP)********************************************** <?php require_once("../../modules/access_control/class/MySmarty.class.php"); require_once("../../modules/access_control/class/name_search.class.php"); $o_smarty=new MySmarty(); $db=$o_smarty->get_db(); ←ここで値が取得できない $o_smarty->assign("toolname",name_search::getToolName($db)); $o_smarty->display(basename($_SERVER['SCRIPT_NAME'],".php").".tpl"); ?> ***********************************************

    • ベストアンサー
    • PHP

専門家に質問してみよう