アプリ版:「スタンプのみでお礼する」機能のリリースについて

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をいろいろ検索しても、解決策が見当たらず、投稿させていただきました。何か、設定が抜けているのでしょうか?どなたかすみませんが、教えてください。

「CakePHP Undefined in」の質問画像

A 回答 (5件)

>”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つずつつぶしていくことになる。

これで、どの段階で、何を実行したときにエラーになっているか、そこで使われている引数とかメソッドのどれが正常でないかを調べていくしかないかな。

この回答への補足

コントローラーに、アドバイスいただいたデバッグコードを下記のように入れてみました。簡単にするため、パスワードの暗号化をコメントアウトしました。
-----------------------------------------------------------------
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]

うーん、なんなんでしょうか?お気づきの点がありましたら、ご教示いただけると大変助かります。

補足日時:2009/03/06 00:59
    • good
    • 0
この回答へのお礼

logger_man様

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

取り急ぎ、御礼まで。

お礼日時:2009/03/05 23:30

ついでだから、もう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のデータ構造がモデルの標準的な構造とずれてしまうというわけ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/08 12:14

>$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']);
    • good
    • 0
この回答へのお礼

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が違うんでしょうか?

いずれにせよ、本件解決しました。ありがとうございました。

お礼日時:2009/03/07 14:32

ん?


------
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']なのか? どっちなんだろうか?

この回答への補足

$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]
のエラーがでます。

なにか、お気づきの点はありますでしょうか?

補足日時:2009/03/07 00:04
    • good
    • 0

Undefined indexってのは、PHPで未定義の配列にアクセスしようとしたときに出るもの。

要するにUserのデータが空ってことだろうと思う。ってことは、モデルがテーブルにアクセスできてないってことではないか。

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

この回答への補足

早速のご指摘ありがとうございます。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アクセスは問題ないと思っていたのですが、
その他の方法で、確かめたほうがよいのでしょうか?

すみませんが、よろしくお願いします。

補足日時:2009/03/05 00:13
    • good
    • 0

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