CakePHPユーザーログイン機能でのUndefined indexエラー

このQ&Aのポイント
  • CakePHP(cake_1.2.1)にて、ユーザーログイン機能を作成中ですが、Undefined indexのエラーが発生しています。
  • エラーの原因は、コントローラーの宣言箇所での記述の誤りや、モデルへの正しい指定の欠如が考えられます。
  • 解決策を見つけるためにWebを検索しても対応策が見つからず困っています。どなたかご教示いただけないでしょうか。
回答を見る
  • ベストアンサー

CakePHP Undefined index

CakePHP(cake_1.2.1)にて、ユーザーログイン機能を作成しようとしてます。 class UsersController extends AppController{ var $name = 'Users'; var $uses = array('User'); // Userモデルを使用 var $needAuth = true; // ログイン必須のフラグ /* * ログインページ */ function login() { // ページタイトルの設定 $this->pageTitle = 'Web-local.community「local.SNS」'; // データが送られてきたら if(!empty($this->data)){ // パスワードを暗号化 $this->data['User']['pwd'] = md5($this->data['User']['pwd']); // 入力された[id]と[pwd]がデータベースにある場合のみ[$user_data]に値が入る $user_data = $this->User->findByEmailAndPwd($this->data['User']['email'], $this->data['User']['pwd']); ・・・ というコントローラーをWebサイトの先人様のを参考にして試作しているのですが、あらかじめ作成したusersテーブルに登録しておいたユーザーのメールアドレス、パスワードを入力して、ログインボタンを押すと、 Notice (8): Undefined index: User [APP\controllers\users_controller.php, line 18] Notice (8): Undefined index: email [APP\controllers\users_controller.php, line 20] というエラーが出て困ってます。"User"、"email"は、知りませんと言っているのでしょう。 モデル等の宣言の箇所で、 // var $name = 'Users'; // var $uses = array('User'); // Userモデルを使用 あるいは、 // var $name = 'Users'; var $uses = array('User'); // Userモデルを使用 あるいは var $name = 'Users'; // var $uses = array('User'); // Userモデルを使用 とコメントアウトしても、前記エラーは変わりません。Webをいろいろ検索しても、解決策が見当たらず、投稿させていただきました。何か、設定が抜けているのでしょうか?どなたかすみませんが、教えてください。

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

  • ベストアンサー
noname#94983
noname#94983
回答No.2

>”Cake is able to connect to the database.” であれば、データベース接続は正常だと思う。 Notice (8): Undefined index: User [APP\controllers\users_controller.php, line 18] Notice (8): Undefined index: email [APP\controllers\users_controller.php, line 20] このusers_controller.phpの18,20行目で何を実行しているか、まずチェック。 次は、loginが呼び出された段階で、$this->data['User']['pwd']、$this->data['User']['email']は正しく値が得られているか、debug($this->data)とかしてみて確認。 次に、モデルからテーブルへアクセスできているか、という部分の確認。とりあえず、debug($this->User->findAll())とか実際に簡単なアクセスとその結果を表示させてみて、正常にアクセスできているか確認。 ここまでOKだったら、後はfindByEmailAndPwd内の処理を1つずつつぶしていくことになる。 これで、どの段階で、何を実行したときにエラーになっているか、そこで使われている引数とかメソッドのどれが正常でないかを調べていくしかないかな。

Gentleman2
質問者

お礼

logger_man様 アドバイスありがとうございます。早速試してみます。また、結果がわかり次第、こちらに報告させていただきます。 取り急ぎ、御礼まで。

Gentleman2
質問者

補足

コントローラーに、アドバイスいただいたデバッグコードを下記のように入れてみました。簡単にするため、パスワードの暗号化をコメントアウトしました。 ----------------------------------------------------------------- function login() { // ページタイトルの設定 $this->pageTitle = 'Web-local.community「local.SNS」'; // データが送られてきたら if(!empty($this->data)){ debug($this->data); // パスワードを暗号化 // $this->data['User']['pwd'] = md5($this->data['User']['pwd']); // 入力された[id]と[pwd]がデータベースにある場合のみ[$user_data]に値が入る debug($this->User->findByEmailAndPwd('test5@foo.com', 'password5')); $user_data = $this->User->findByEmailAndPwd($this->data['User']['email'], $this->data['User']['pwd']); ----------------------------------------------------------------- test5@foo.com password5 をテーブルに追加して、そのメールアドレス、パスワードを入力してログインをすると、 debug($this->data); に対する出力は、 Array ( [User/email] => test5@foo.com [User/pwd] => password5 ) なので、ログインによるデータ送信からは、$this->dataにうまく値が入力されているようです。 debug($this->User->findByEmailAndPwd('test5@foo.com', 'password5')); に対する出力は、 Array ( [User] => Array ( [id] => 5 [name] => testuser5 [email] => test5@foo.com [pwd] => password5 [profile] => test5 [modified] => 2009-03-06 00:51:46 [created] => 0000-00-00 00:00:00 ) ) なので、CakePHPから、Mysqlのテーブルにアクセス出来ているようです(と考えていいですよね?) しかし、 $user_data = $this->User->findByEmailAndPwd($this->data['User']['email'], $this->data['User']['pwd']); この行で、やはり、下記のエラーが出力されます。 Notice (8): Undefined index: User [APP\controllers\users_controller.php, line 19] うーん、なんなんでしょうか?お気づきの点がありましたら、ご教示いただけると大変助かります。

その他の回答 (4)

noname#94983
noname#94983
回答No.5

ついでだから、もう1回、回答しておくか。 >いろんなログインサンプルを見ても、皆$this->data['User']['email']、こういう参照の仕方をしてるんですけど、私の環境で$this->data['User/email']、こうなるのは、CakePHPのVerが違うんでしょうか? おそらく、そっちでは手書きでフォームを書いてるんじゃないか。そのせいでnameがずれてるんだと思う。 CakePHPでは、フォームは「Formヘルパー」というヘルパーを使って自動生成させるのが基本。このとき、フォームの各コンポーネント類は、<input type="text" name="○○[User][email]">というような形式でnameが設定される。 これはつまり、送信されるフォームとモデルのデータ構造を揃えるためにわざわざこういう書き方をしている。だから、例えばコントローラー側で$this->モデル->save($this->data)みたいに単純に$dataを渡すだけでモデルが処理できるような仕掛けになってるわけだ。 手書きでフォームタグを書く場合には、<input type="text" name="email">みたいに普通にnameを指定してしまうはず。このため、送信される$dataのデータ構造がモデルの標準的な構造とずれてしまうというわけ。

Gentleman2
質問者

お礼

了解しました。ありがとうございます。今後とも、よろしくお願いします。

noname#94983
noname#94983
回答No.4

>$data['User/email']です。 だったら、これは違うだろう。 $user_data = $this->User->findByEmailAndPwd($this->data['User']['email'], $this->data['User']['pwd']); こうなるはずだが。 $user_data = $this->User->findByEmailAndPwd($this->data['User/email'], $this->data['User/pwd']);

Gentleman2
質問者

お礼

logger_man様 $user_data = $this->User->findByEmailAndPwd($this->data['User/email'], $this->data['User/pwd']); こちらで、無事とおりました。いろんなログインサンプルを見ても、皆$this->data['User']['email']、こういう参照の仕方をしてるんですけど、私の環境で$this->data['User/email']、こうなるのは、CakePHPのVerが違うんでしょうか? いずれにせよ、本件解決しました。ありがとうございました。

noname#94983
noname#94983
回答No.3

ん? ------ debug($this->data); に対する出力は、 Array ( [User/email] => test5@foo.com [User/pwd] => password5 ) ------ $user_data = $this->User->findByEmailAndPwd($this->data['User']['email'], $this->data['User']['pwd']); ------ $data['User/email']なのか? $data['User']['email']なのか? どっちなんだろうか?

Gentleman2
質問者

補足

$data['User/email']です。 debug($this->data); debug($this->User->findByEmailAndPwd('test5@foo.com', 'password5')); を抜けて、各々の出力が表示された後、 $user_data = $this->User->findByEmailAndPwd($this->data['User']['email'], $this->data['User']['pwd']); ここの行(処理)で、 Notice (8): Undefined index: User [APP\controllers\users_controller.php, line 19] のエラーがでます。 なにか、お気づきの点はありますでしょうか?

noname#94983
noname#94983
回答No.1

Undefined indexってのは、PHPで未定義の配列にアクセスしようとしたときに出るもの。要するにUserのデータが空ってことだろうと思う。ってことは、モデルがテーブルにアクセスできてないってことではないか。 そもそも、データベースへの接続は正常にできているのだろうか。使用しているDBの種類、database.phpの設定とかがわからないのでなんともいえないんだが、そのあたりから確認してみてはどうか。まず、指定のデータベースへのアクセスが正常であり、モデルを介してテーブルにアクセスできていることを確認した上で、実際の開発に入らないと、問題の切り分けができなくなる。

Gentleman2
質問者

補足

早速のご指摘ありがとうございます。DBは、mysql5.1です。database.phpは、 class DATABASE_CONFIG { var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'admin', 'password' => 'XXXXXX', 'database' => 'sns', 'prefix' => '', ); var $test = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'test_database_name', 'prefix' => '', ); } ?> です。var $defaultの方の値を作成したDBに合わせました。var $testの方はデフォルトのままです。 上記設定後、CakePHPの画面で、 ”Cake is able to connect to the database.” と表示が変わったので、DBアクセスは問題ないと思っていたのですが、 その他の方法で、確かめたほうがよいのでしょうか? すみませんが、よろしくお願いします。

関連するQ&A

  • cakePHPについて

    現在、cakePHPを勉強しているのですが、分からなくて進めない箇所があり困っています。 ユーザーがフォームからデータを入力し、DBにデータを格納する際、フォーム項目にないデータを一緒に入力するためにはどうすればいいのか分かりません。 例)ユーザーフォーム入力欄 name email password ↓ ■DB側に格納したいデータ id(AUTO_INCREMENT) contact_id(問題箇所) name email password created modified 現在、下記のようなコードになっているのですが、ご教授頂ければ幸いです。 ■Controller/RequestController public function index(){ if(!empty($this->request->data)){ if($this->request->data[$this->Request->alias]['confirmed']){ //保存実行 //成功時に画面遷移・失敗時にメッセージを表示 if($this->Request->saveAll($this->request->data)){ $this->Session->setFlash('お申し込み有難う御座います。新規依頼が完了しました。'); $this->redirect(array('action' => 'index','controller' => 'details')); }else{ $this->request->data[$this->Request->alias]['confirmed'] == false; $this->Session->setFlash('新規依頼に失敗しました。'); } }else{ if($this->Request->saveAll($this->request->data, array('validate' => 'only'))){ //saveALLは値をまとめて保存するモデルメソッドだけど('validate' => 'only')にすることで //保存処理を行わずにバリデーションのみを実行することができます //入力データに問題がなかった場合は確認画面を呼び出し $this->render('confirm'); }else{ $this->Session->setFlash('エラーがあります。入力内容をご確認下さい。'); } } } }

    • 締切済み
    • PHP
  • cakephp動的アソシエーションについて

    お世話になっております。 cakephpでアソシエーションをコントローラ側で設定しようとしたところ $this->Model->bindModel(array(‘hasOne’=>array(‘Model_3′))); このような形にされてるのが多いのですが $this->Model->hasMany = array('Model' ); こちらのようにコントローラー側で直接変数に モデル設定してはいけないのでしょうか?

    • ベストアンサー
    • PHP
  • Notice:Undefined index が。

    教えて下さい。 01: <?php 02: class Reload { 03: var $id; 04: var $val; 05: var $flag; 06: function Reload($id = 'RELOAD') { 07: $this->id = $id; 08: if ($_GET[$this->id]) 09: $this->val = $_GET[$this->id]; 10: elseif ($_POST[$this->id]) 11: $this->val = $_POST[$this->id];       以下略 こういういうコードがある本に出ているのですが、これをCentOS 5.4で include したスクリプトを実行すると、 Notice: Undefined index: ID in /xxx/abc.php on line 8 (および on line 10 にも ) と警告が出ます。 この警告をなくすために、id=""; を 3行目の下に入れてみると、 Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in /xxx/abc.php on line 4 (id=""; を挿入した行) となります。 なお、windows7 で xampp 上でテストしているときは、上記スクリプト(id=""; をする前)でも不具合は出なかったのですが、対処法が分からず途方に暮れています・・・。  どのように修正すればよいでしょうか。  よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • CakePHP 1.3について

    CakePHPが初心者です。 Views-userdetail-index.ctpにて <?php echo $form->create(null,array('type'=>'get','action'=>'./updateRecord')); ?> ~ <?php echo $form->textarea("User.remarks", array("cols" => 22,"rows" => 2)); ?> ~ を記述し、userdetail_controllerにて function updateRecord(){ if (!empty($this->data)){ $this->User->id = 1; $this->User->saveField('remarks','exists'); } else { $this->User->id = 1; $this->User->saveField('remarks','empty'); } $this->redirect('.'); } を記述しています。 しかし、どうしても「!empty($this->data)」の判別によってemptyとなってしまいます。 User.remarksの部分をUserdetailにして色々ためしましたが、どうしても値の受け渡しがうまくいかないのです。 どなたかご教授を宜しくお願い致します。

    • ベストアンサー
    • PHP
  • クラスと文法とエラー。なぜこの出力

    <?php $chk = new nanikore(); class nanikore{ var $queryY; var $queryZ; function nanikore(){ $this->$queryY = array( "name" => "test1"); $this->$queryZ = array( "name"=> "test2" ); print_r( $this->$queryY ); } } ?>この実行結果が以下になるのはなぜですか?orz 特に以下の部分が理解できません Array ( [name] => test2 ) こうなるつもりなのですが・・・。Noticeエラーのせいなのでしょうか あとなぜノーティスエラーがでるのでしょうか。。よろしくお願いします Array ( [name] => test1 ) //////////////////////////////////////////////////////////// Content-type: text/html X-Powered-By: PHP/4.3.6 <br /> <b>Notice</b>: Undefined variable: queryY in <b>F:\nanikore.php</b> on line <b>8</b><br /> <br /> <b>Notice</b>: Undefined variable: queryZ in <b>F:\nanikore.php</b> on line <b>9</b><br /> <br /> <b>Notice</b>: Undefined variable: queryY in <b>F:\nanikore.php</b> on line <b>10</b><br /> Array ( [name] => test2 )

    • ベストアンサー
    • PHP
  • cakePHPのエラー

    Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'validateSearch' at line 1 SQL Query: validateSearch Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp というエラーが出て困っています。 validateSearchの付近を確認してもよくわかりません。 searchpluginを使っているのですが、上手くいきません。 コントローラーは、 <?php App::uses('AppController', 'Controller'); class Mac554FoodDatasController extends AppController { public $name='Mac554FoodDatas'; public $components =array('Search.Prg'); public $presetVars=array(); public function beforeFilter() { //検索対象のフィールド設定代入 $this->presetVars = $this->Mac554FoodData->presetVars; // ページャ設定 $pager_numbers = array( 'before' => ' - ', 'after'=>' - ', 'modulus'=> 10, 'separator'=> ' ', 'class'=>'pagenumbers' ); $this->set('pager_numbers', $pager_numbers); } public function find() { $datas=$this->Mac554FoodData->find('all'); $this->set('datas',$datas); //検索条件設定 $this->Prg->commonProcess(); //検索条件取得 $tabe=$this->passedArgs; $conditions = $this->Mac554FoodData->parseCriteria['$tabe']; //ページャ関係 $this->paginate =array( 'conditions' => $conditions, 'limit' =>10 ); $this->set('Mac554FoodDatas',$this->paginate('Mac554FoodData')); // レイアウト関係 $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); // post時の処理 //$this->set('Mac554FoodDatas',$this->Mac554FoodData->find('all')); } public function index() { $this->layout = "plain"; $this->set("header_for_layout", "Sample Application"); $this->set("footer_for_layout", "copyright by SYODA-Tuyano. 2011."); //レイアウト } } ?> で、検索フォームはエレメントで <?php echo $this->Form->create('Mac554FoodData', array('url' => '/Mac554FoodDatas/find'))?> <fieldset> <legend>Search or Die!</legend> <dl> <dt><label>ユーザname</label></dt> <dd><?php echo $this->Form->input('name', array( 'type' => 'text', 'div' => false, 'label' => false))?></dd> <dt><label>time</label></dt> <dd><?php echo $this->Form->input('time', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> <dt><label>naiyoudao</label></dt> <dd><?php echo $this->Form->input('naiyoudao', array( 'type' => 'text', 'div' => false, 'label' => false ))?></dd> </dl> <?php echo $this->Form->submit('検索',array('div'=>false,'escape'=>false))?> </fieldset> <?php echo $this->Form->end()?> のように作りました。 モデルは、 <?php class Mac554FoodDatas extends AppModel{ public $name=Mac554FoodData public $actsAs = array('Search.Searchable'); // 検索対象のフィルタ設定 public $filterArgs = array( array('name' => 'name', 'type' => 'value', 'field' => 'Mac554FoodData.name'), array('name' => 'time', 'type' => 'like', 'field' => 'Mac554FoodData.time'), array('name' => 'naiyoudao', 'type' => 'like', 'field' => 'Mac554FoodData.naiyoudao'), ); //検索対象のフィールド設定 public $presetVars = array( array('field' => 'name', 'type' => 'value'), array('field' => 'time', 'type' => 'value'), array('field' => 'naiyoudao', 'type' => 'value'), ); } という感じで作りました。 投げているSQL文を見ると、 SELECT `Mac554FoodData`.`id`, `Mac554FoodData`.`time`, `Mac554FoodData`.`name`, `Mac554FoodData`.`naiyoudao`, `Mac554FoodData`.`twinoid` FROM `mac554_foodlog`.`mac554_food_datas` AS `Mac554FoodData` WHERE 1 = 1 となっています。 よろしくお願い致します

    • ベストアンサー
    • PHP
  • CakePHPでのログイン画面生成について。

    CakePHPでのログイン画面生成について。 参考URLは以下です。 http://h2o-space.com/blog/1950 以上の記事の通り設定・アップロードをし、 add.phpにアクセスすると Missing Method in ViewsController Error: The action add.php is not defined in controller ViewsController Error: Create ViewsController::add.php() in file: app/controllers/views_controller.php. <?php class ViewsController extends AppController { var $name = 'Views'; function add.php() { } } ?> とのエラーが出ます。 <?php class ViewsController extends AppController { var $name = 'Views'; function add.php() { } } ?> をviews_controller.phpに書き込むと Parse error: syntax error, unexpected '.', expecting '(' in /home/rslitefc2/users/アカウント/public_html/login/app/controllers/views_controller.php on line 7 と、エラーが出ます。 7行目の記述はfunction add.php() {です。 どうしたらログイン画面を正しく生成することが出来るでしょうか? どなたかお教えいただければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • CakePHP recursiveプロパティの使い

    大分類、中分類、小分類のテーブルを作っており、大分類・中分類間、中分類、小分類間は、それぞれのModelでbelongsToを用いてアソシエーションができていることは確認できております。 小分類のindex.ctpで、大分類・中分類・小分類の各項目を表示する表を作成しようと考えており、小分類のModelで、下記の記述をしました。 $this->set('「変数名」',$this->「小分類のModel名」->find('all',array('recursive'=>2))); しかし、その結果、 「Notice (8): Undefined index: 「大分類のModel名」 [APP/View/…/index.ctp, line 12]」 というエラーが戻ってきてしまっています。 recursiveプロパティで2を選択おけば、「小分類」のModelからでも、「中分類」のModelを経由してbelongsToでつながっている「大分類」のデータを拾ってくることができると思っていましたが、そうはいかなかったのだと思います。 どなたか、ご教示頂けないでしょうか。 よろしくお願い致します。

    • 締切済み
    • PHP
  • CakePHPのsyntaxエラーについて

    お世話になります。 CakePHPでサイト構成をしています。 教本に従ってコードを書いています。 最も簡単なサイトを作るという章で、MyPagesContorllerを作り、Viewにindex.ctpとedit.ctpを作り、ModelにUser.php、 ContollerにUsersController.phpを作りました。 ユーザーの一覧表示まで出来ましたが、編集機能を作るところでつまずいてます。 UsersController.php <?php class UsersController extends AppController { //モデルの指定(users) public $uses = array('User'); //レイアウトの指定(defaultの場合はなくても動作する) public $layout = 'default'; //indexアクション public function index () { $userData = $this->User->find('all'); //Viewにデータを送る $this->set('userData', $userData); } } //editアクション public function edit($id = null) { if($this->request->isPost() || $this->request->isPut()) { if(!empty($this->data)) { if($this->User->save($this->data)) { $this->Session->setFlash('保存しました'); $this->redirect(array('action' => 'index')); return; } } 下記の様なエラーが表示されてしまいます。 Error: syntax error, unexpected 'public' (T_PUBLIC) 本にある通りに記述して、何度も確認しましたが間違いが見つけられません。 写真に添付しているline20の前後を見ても特にミスは無い様に思えます どこが間違っているのでしょうか。。。 ちなみにeditアクションのソースを消すと、エラーは表示されません。 どなたかご教授頂けないでしょうか。 宜しくお願いいたします。

  • NoticeとUndefined index

    ●質問の主旨 1.アンケート項目が空欄ではなく、 : <br /><b>Notice</b> Undefined index: name in <b>C:\xampp\htdocs\php10\lesson16_2\wizard1.php</b> on line <b>17</b><br /> という文字列が入るのかが、よく分かりません。 2.性別のところが未定義の関数になるのかが分かりません。 ●質問の補足 10日でおぼえるPHP第4版P134のlesson16 「セッション機能でウィザード形式のフォームを作成しよう」 のコードを「ほぼ」真似ています。 参考文献のコードでは、2行目をrequire_once'../Encode.php'; になっていますが、下記のコードでは、 include_once'Encode.php';にしています。 これら以外のコードは全くコピペしています。 なお、wizard1.phpとEncode.phpは同じフォルダに入れています。 ●開発環境 windows XAMMP1.8.1 ●コード(wizard1.php) <?php include_once 'Encording.php'; session_start(); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>PHP入門教室</title> </head> <body> <h3>アンケート</h3> <form method="POST" action="wizard2.php"> <div class="container"> <label for="name">名前:</label><br /> <input type="text" id="name" name="name" value="<?php print(e($_SESSION['name'])) ?>" /> </div> <div class="container"> <label for="email">メールアドレス:</label><br /> <input type="email" id="email" name="email" value="<?php print(e($_SESSION['email'])) ?>" /> </div> <div class="container"> <label for="zip">郵便番号:</label><br /> <input type="zip" id="zip" name="zip" value="<?php print(e($_SESSION['zip'])); ?>" /> </div> <div class="container"> 性別:<br /> <?php $sexes =array('男性', '女性', 'その他'); foreach($sexes as $sex) { print('<label>'); print('<input type="radio" name="sex" value="'.$sex.'"'); if ($sex === $SESSION['sex']) { print(' checked'); } print('< />'); print($sex.'</label>'); } ?> </div> <input type="submit" value="次へ" /> </form> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう