モデルのメソッド名がSQLと解釈される現象への対処法と動作位置について

このQ&Aのポイント
  • CakePHPで開発をしている中で、モデルに定義したメソッド名がSQLと解釈されてしまうという現象に困っています。この現象への対処法について教えていただきたいです。
  • ログに吐き出されたSQLを見ると、メソッド名がSQL文と解釈されていることがわかります。一方、同じコントローラー内でモデルの他のメソッドを呼び出す際には正常に動作しています。
  • モデルのメソッドを実行するときに動くCakePHPのコードの位置についても教えていただきたいです。
回答を見る
  • ベストアンサー

モデルのメソッド名が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
  • 回答数2
  • ありがとう数4

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

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

まず、EnquetesControllerで、正しく呼んでるのでしょうか。 場合によって、Enqueteクラスの継承元のModelクラスがロードされている場合があります。 class EnquetesController extends AppController{ function index(){ echo get_class($this->Enquete); } } としてクラス名が、「Enquete」と表示されるか確認して下さい。 もし、それが「Model」と表示するようであれば、EnquetesControllerで、明示的に、 var $uses = array('Enquete'); を記述してみてください。

LFNAtacker
質問者

お礼

大変失礼しました。原因は、モデルの名前にありました。 質問に書いたコードでは省略した部分に原因が・・・・。 Enquete_200911_001というテーブルがあり、そのアンダーバーを削って、Enquete200911001というモデルを作ったのですが、save()は出来ても、自作のメソッドが実行できませんでした。 $this->Enquete200911001->myMethod() このmyMethodがSQL文と解釈されていました。 質問文に不足がありまして、すみませんでした。 ちなみに、こういった名前付けの問題は、よく見られる話題なのでしょうか?

その他の回答 (1)

  • manimani2
  • ベストアンサー率70% (12/17)
回答No.1

こんにちは(^^) 参考にならないかもしれまんが、通りすがったので回答します。 saveメソッドが正常に動作しているということなので、何かのちょっとしたミスではないかと思うのです。とりあえず、問題のメソッド以外に、何か単純なメソッドを1つ作って、それをコントローラーから動かしてみるのはどうでしょうか? 例えばレコード数を表示するようなメソッドを作って・・・ function getRecodeCount(){ $count = $this->find('count'); return $count; } とモデルに書き、コントローラーから・・・ $this->Enquete->getRecodeCount(); で呼び出してみるとか。もし呼び出せれば、問題のtyoityoi()メソッドの中身がおかしいとか、エラーの原因を特定するのに役立つと思います。 >もしくは、モデルのメソッドを実行するときに動くCakePHPのコードの位置を、 教えていただけませんか? 特に厳しい制限はなかったと思います。質問者さんが書いているような方法で動くと思います。 あと、実際に出ているエラーメッセージを書いておくと、回答が集まりやすいと思います。 ではでは。。。

LFNAtacker
質問者

補足

>manimani2さん ありがとうございます。manimani2さんのお答えにあるように、 モデルにgetRecordCount()という関数を記述し、コントローラーで呼び出しましたが。しかし、やはりSQLエラーになります。 Warning (512): SQL Error: 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 'getRecordCount' at line 1 [CORE\cake\libs\model\datasources\dbo_source.php, line 684] エラーメッセージは上記で、SQL文のシンタックスエラーです。実際にCakePHPが実行したSQL文を、ログに吐き出すようにしたところ、getRecordCountがSQL文として解釈されて実行されており、そのためSQLシンタックスエラーが出てしまう状態です。 >もしくは、モデルのメソッドを実行するときに動くCakePHPのコードの位置を、教えていただけませんか? これについてですが、$this->Model->method()というコードをコントローラーから実行したときに、CakePHPのソースコードのどこが実行されるのかを、教えて頂ければと思いました。それが分かれば、今回の問題の原因が分かるかもと思いまして。 manimani2さん、ありがとうございました。

関連するQ&A

  • Cakephp AppControllerについて

    CakePHPにて、 AppControllerクラスに処理を記述しようと思い、 app/app_controller.php を設置したのですが、 app/app_controller.php がどうしても呼び出されません。 色々調べてるのですが、どうしても原因が分かりません。 原因等分かる方がおりましたら教えて頂けますでしょうか? ---------------------- ■cakephpのバージョンは1.3です。 ■app/app_controller.phpの中身は↓です。 class AppController extends Controller { function __construct() { parent::__construct(); } function beforeFilter() { echo "test"; ←これが呼ばれない。 } } ----------------------

    • ベストアンサー
    • PHP
  • cakePHPでSQLが実行できない。

    cakePHP2.2でSQLが実行できません。 実行のやり方が悪いのでしょうが ネットで探してもイマイチ理解できません・・ やりたいのは画面から入力された値を使い SQLを実行することです。 何が駄目なのか教えてください。 controllerのソース <?php class BuhinController extends AppController { public $layout = 'user_default'; //## ログイン処理 public function login(){ $bool = false; $rslt = null; Configure::write('debug', 1); $sql = "select id from table_user where add = '". $_POST["add"] . "' "; $sql = $sql. " and pass = '". $_POST["pass"] . "'"; $this->query($sql); } public function index(){ } public function logout(){ $this->Auth->logout(); } } ?> エラーメッセージ Fatal Error Error: Call to undefined method BuhinController::query() File: C:\xampp\htdocs\cake\app\Controller\BuhinController.php よろしくお願いします。

    • ベストアンサー
    • PHP
  • 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 1.3 の $uses は?

    お尋ねします。 CakePHP 1.3 の $uses は extends ですか? モデルの中からは、コントローラのメソッドは、やはり使えませんか?

    • 締切済み
    • 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
  • Cake2系のコントローラでセッション情報取得

    CakePHP2を使用して、開発を行っているのですが、 AppControllerを継承したControllerのあるメソッドで、 別のコントロー(AppController継承)をnewでインスタンスを生成し、 自前のコントローラのあるメソッドを呼び出しているのですが、 自前のコントローラのメソッド内で、セッション情報取得しようとすると 「Call to a member function load() on a non-object」 となりエラーになります。 AppControllerには、コンポーネントの呼び出しを行っています。 public $components = array('Common','Session'); newして使わないコントローラだと、セッション情報を取得できるのですが、 newしたコントローラでは、セッション情報にセットした情報を取得することができません。 newしたコントローラへ必要な情報を渡すには引数以外はないのでしょうか。 セッション情報をnewしたコントロールで取得したいのですが、 可能でしょか。

    • ベストアンサー
    • 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のコントローラの作成

    PHP初心者です。 CakePHPをインストールし試しにTestControlerを作成したのですが、ページが開きません。 PageNotFoundになります。 考えられる原因が分かれば教えて下さい。 【やったこと】 ・ [CakePHP root]\app\Controller に TestController.php を作成。 <?php App::uses('AppController', 'Controller'); class TestController extends AppController { } ・ URLにアクセス http://[CakePHP root]/Test ⇒ Not Found http://[CakePHP root]/test ⇒ Not Found http://[CakePHP root]/app/webroot/index.php?url=test ⇒ CakePHPのindex.phpが表示される。 http://[CakePHP root]/app/webroot/index.php?url=Test ⇒CakePHPのindex.phpが表示される。 以下のサイトを参考にしました。mod_rewriteが動いていない可能性がある ということなので、URL直接指定もしてみましたがダメでした。 http://codezine.jp/article/detail/768?p=2 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 継承クラスで定義したメソッドのtry-catch文

    親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。

    • ベストアンサー
    • PHP
  • templateメソッドパターンで抽象メソッドを定義する意義

    こんにちは。 テンプレートメソッドパターンで、例えば、 class oge { abstract function a(); abstract function b($param); final function tempMethod() { $this->a(); $this->b($param); } } とした場合、抽象メソッドの定義は意味があるのでしょうか? なぜなら、tempMethod()中でa()もb($param)も呼び出してますんで、 わざわざ抽象メソッドとして定義しなくてもサブクラスで実装しないとどっちみち動きません。 抽象メソッドの定義の意義を教えてください。

    • 締切済み
    • PHP

専門家に質問してみよう