cakePHPのサンプルブログで検証エラーが出ない

このQ&Aのポイント
  • cakePHP初心者です。cookbookにそってサンプルブログを組んでいますが、投稿時にバリデーションエラーが表示されずに投稿できてしまいます。
  • 投稿時にtitleとbodyを空で投稿してもエラー表示されず、投稿一覧にも表示されてしまいます。
  • 自力で組む場合はエラーを見つけやすいですが、まだcakePHPに慣れていないので、このバグの原因を追求するためにどうしたらいいかわかりません。
回答を見る
  • ベストアンサー

cakePHPのサンプルブログで検証エラーが出ない

cakePHP初心者です(まだはじめて数時間くらい) で、cookbookにそってサンプルブログを組んでいるのですが、 http://book.cakephp.org/2.0/ja/getting-started.html のとおり、 Postモデルに class Post extends AppModel {    public $validate = array(       'title' => array(          'rule' => 'notEmpty'       ),       'body' => array(          'rule' => 'notEmpty'       )    ); } (↑タブを全角空白4文字に変換してます) と入れてsaveしたものの、 title,bodyを空で投稿しても、エラー表示されず投稿できてしまいます (投稿一覧にも表示されます) FWを使わないで自力で組むなら、自分なりにエラーを見つけられるのですが、 まだcakePHPになれていないため、 このバグの原因を追求するためになにからはじめたらいいのかわかりません。 どなたかお教えいただけないでしょうか? よろしくお願い申し上げます。

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

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

  • ベストアンサー
  • paschen00
  • ベストアンサー率100% (1/1)
回答No.1

controller側のコードがおかしいのではないでしょうか。 可能であればcontroller側のコードを貼り付けてみてください。

dicemiyagawa
質問者

補足

ありがとうございます。 以下に /app/Controller/PostsController.php を貼り付けます (タブは全角空白4文字に変換しています) ヘルプいただければ幸いです。 なお、今後自分で解決できるようになるために、 なぜ、MVCのうちVでなくCがおかしいと推測なさったか教えていただけますか? (View側だけがおかしいなら、見た目だけの問題に過ぎないはずだからでしょうか?) よろしくお願いします。 <?php //File: /app/Controller/PostsController.php class PostsController extends AppController {     public $helpers = array('Html' , 'Form');     public function index(){         $this->set('posts', $this->Post->find('all'));     }     public function view($id = null){         if(!$id) {             throw new NotFoundException(__('Invalid post'));         }         $post = $this->Post->findById($id);         if(!$post){             throw new NotFoundException(__('Invalid post'));         }         $this->set('post', $post);     }     public function add() {         if ($this->request->is('post')){             $this->Post->create();             if ($this->Post->save($this->request->data)){                 $this->Session->setFlash(__('Your post has been saved.'));                 return $this->redirect(array('action' => 'index'));                 }             $this->Session->setFlash(__('Unable to add your post.'));             }     } }

関連するQ&A

  • CakePHPのブログチュートリアルについて

    PHPフレームワークのCakeについて、質問させてください。 初心者ならだれもが一度は試すであろうhttp://book.cakephp.org/ja/view/219/Blogに掲載されているブログチュートリアルですが、下記環境で実行すると大量のエラーが出力されます。(添付画像参照) 環境:hetemlレンタルサーバー Apache 2.0.xx ver 4.4.2 ※CakePHPのトップページが正常に表示されること、tmpフォルダのパーミッションは正常に設定されていることは確認しています。 また、Viewで正常にデータを取得できているにもかかわらずデータ表示部分でエラーが表示されるため、変数$postsをvar_dumpしたところ、 Array ( [0] => Array ( [id] => Array ( [id] => 1 ) [title] => Array ( [title] => タイトル ) [body] => Array ( [body] => これは、記事の本文です。 ) [created] => Array ( [created] => 2009-08-08 21:56:50 ) [modified] => Array ( [modified] => ) ) [1] => Array ( [id] => Array ( [id] => 2 ) [title] => Array ( [title] => またタイトル ) [body] => Array ( [body] => そこに本文が続きます。 ) [created] => Array ( [created] => 2009-08-08 21:56:50 ) [modified] => Array ( [modified] => ) ) [2] => Array ( [id] => Array ( [id] => 3 ) [title] => Array ( [title] => タイトルの逆襲 ) [body] => Array ( [body] => こりゃ本当に面白そう!うそ。 ) [created] => Array ( [created] => 2009-08-08 21:56:50 ) [modified] => Array ( [modified] => ) ) ) となっていました。 これでは、チュートリアルに掲載されている、 <?php echo $post['Post']['id']; ?> ではなく、 <?php echo $post['id']['id']; ?> で呼び出さなくてはならなくなります。 これはどこかがおかしいのでしょうか?教えてください。

    • 締切済み
    • PHP
  • CakePHPのValidateメッセージの改行

    CakePHPのValidateメッセージの改行方法を教えてください。 「エラーメッセージです」 というメッセージを 「エラー」 「メッセージです」 というように2行で出力したいのです。 下記のように<br/>を入れてメッセージを設定してみたのですが、 「<div class="error-message">エラー&lt;br/&gt;メッセージです</div>」 というソースが出力され、ブラウザ上でも「エラー<br/>メッセージです」と そのまま表示されてしまいます。 var $validate = array( 'test' => array( array( 'rule' =>VALID_NOT_EMPTY, 'message' => "エラー<br/>メッセージです" ) );

    • ベストアンサー
    • PHP
  • CakePHPでvalidateのメッセージの表示

    バリデーションで設定したエラーメッセージをsetFlashで表示したいのですが、 エラーメッセージ(下記のhoge)を取得する方法はありますか? CakePHP 2x Model public $validate = array( 'username' => array( 'rule' => 'notEmpty' 'message' => 'hoge' ) ); Controller $this->Session->setFlash('test'); $this->redirect('index');

    • 締切済み
    • PHP
  • CakePHPのアソシエーションがうまくいかず困っています。

    CakePHPのアソシエーションがうまくいかず困っています。 以下の3つのテーブルがあります。 [Table_A] id_a id_b name_a [Master_B] id_b name_b [Table_C] id_c id_a name_c Table_Aを中心にアソシエーションを設定しようと思い、modelを以下のように設定しました。 [Model A] class A extends AppModel { public $name = 'A'; public $useTable = 'Table_A'; public $primaryKey = 'id_a'; public $hasOne = array( 'C' => array('className' => 'C', 'foreignKey' => 'id_c' ) ); } [Model B] class B extends AppModel { public $name = 'B'; public $useTable = 'Table_B'; public $primaryKey = 'id_b'; } [Model C] class C extends AppModel { public $name = 'C'; public $useTable = 'Table_C'; public $primaryKey = 'id_c'; } そして、Controllerを以下のように設定しました。 [Controller A] $a = $this->A->find('all'); Controller Aでfindした結果、name_aとname_cの取得には成功しました。 そこでname_bも取得しようとしたのですが、どのようにアソシエーションを設定すればよいか、わかりません。 テーブルの項目は固定であり変更できないため、なんとかこれでアソシエーションを設定したいと思っています。 マニュアルやウェブサイトを調べたのですが、わかりませんでした。 ご教授のほどよろしくお願いいたします。

    • 締切済み
    • PHP
  • [CakePHP]複数テーブルのアソシエーション

    CakePHPについて質問です(Ver.2.2)複数テーブルのアソシエーションについてなのですが、下記のようなアソシエーションは可能でしょうか? [使用テーブル] Post、Recommend、UserMaster、UserDetail [結合キー] (1)Post.id = Recommend.post_id (2)User.id = Post.user_id (3)User.id = UserDetail.user_id つまり、Post.php内にてPost以外で紐づいているテーブル同士を結合が可能かどうかを知りたいです。((1)(2)はPostテーブルと紐づいているが、(3)はPostテーブル以外同士で紐づいている) 下記方法にて(1)(2)は実現できたのですが、(3)の方法が見つかりませんでした。 -- class Post extends AppModel { $belongsTo = array('User'); $hasOne = array('Recommend'); (略) -- 不明点あればご説明します。どうぞよろしくお願いします。

    • ベストアンサー
    • 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アクションのソースを消すと、エラーは表示されません。 どなたかご教授頂けないでしょうか。 宜しくお願いいたします。

  • CakePHPでの自作関数保存場所

    PHP 5.0.4 CakePHP Version1.1 CakePHPのモデル内でコールバック関数として登録したい関数を作成したのですが、その関数をどこに記述してよいか分かりません。今のところ下記のようにモデル内のクラス定義の外に定義しています。 <?php class Hoge extends AppModel { var $name = "Hoge"; function gethoge(){ ・・・・ return array_map("hoge_callback",$hoge_array); } } function hoge_callback(){ ・・・・ } ?> ただこれだと”hoge_callback()”を他のモデルでも使いたい時にそのモデル内でも記述しないといけません。どこか1箇所にまとめて置いてきそれを参照するようなスマートな方法はないでしょうか(できればモデル内だけでなくコントローラやビューでも使えるとうれしいです)?「CakePHPでは自作関数は”ここ”に登録する」といったようなルールがありましたらご教示頂ければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • CakePHP で、質問させていただきます。CakePHPは、初心者で

    CakePHP で、質問させていただきます。CakePHPは、初心者です。 app/controllers のコントローラ「mobilehellow_controller.php」で、以下のようにデータをセットして、DBにインサートしようとしていますが、何もDBには追加されません。 $saveData = array( "NUM" => $item[$hscan_offset]['kyujin_syokusyu'], "JOBTYPE" => 'kyujin_syokusyu', )); $this->Mobilehellow->create(); $this->Mobilehellow->save($saveData); 画面上には、こんな文字が表示されました。 Query: INSERT INTO "mobilehellows" ("NUM") VALUES ('nextval(''"helloworkmobilep01_NUM_seq"''') DBの構成はこれです。 NUM integer NOT NULL JOBTYPE text エラーも何も出なので、どうしてなのかわかりません。 どうか、ご存知の方お教えください。

    • ベストアンサー
    • 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
  • モデルのメソッド名がSQLと解釈されます

    CakePHPで開発をしています。 モデルにメソッドを定義しコントローラーで呼び出したところ、メソッド名が SQLと解釈されるという現象に困っています。 モデル class Enquete extends AppModel {  var $name = 'Enquete';  function tyoityoi() {  } } コントローラー class EnquetesController extends AppController {   function index() {    $this->Enquete->tyoityoi();   } } こういう使い方をしているのですが、SQLシンタックスエラーが出てしまい、 ログに吐き出したSQLを見ると、tyoityoiがSQL文と解釈されてしまっていました。 同じコントローラーで、Enqueteモデルのsave()めそっどを呼び出していますが、 そちらは正常動作しています。どなたか原因の分かる方いらっしゃいませんか? もしくは、モデルのメソッドを実行するときに動くCakePHPのコードの位置を、 教えていただけませんか? よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう