2013-03-02 3 views
6

私は自分のMySQLクエリをCakephpで作成しようとしています。CakePHPでカスタムMySQLクエリを作成するには?

これは私のLocationsController.php

<?php 
App::uses('Location', 'Model'); 
class LocationsController extends AppController 
{ 
    public $helpers = array('Html', 'Form'); 
    function index() 
    { 
     $this->loadModel("Location"); 
     $this->Location->get(); 
    } 
} 

これは私のLocationModel.php

<?php 
App::uses('AppModel', 'Model'); 
class LocationModel extends Model { 

    public $name = 'Location'; 

    public function get() 
    { 
     $this->Location->query("SELECT * FROM locations;"); 
    } 
} 

あなたが見ることができるように、私は単純なクエリを実行しようとしていますが、それは動作しません。私はこのエラーを取得する:

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 'get' at line 1 

私が見つける(「すべて」)のような魔法の方法のいずれかを使用する代わりに、それが動作する...

あなたは問題が何であるかを見ることができますか?私は本当にできないし、私は単純な仕事をしようとしている!コントローラがあるべき

+1

べきではありません'Location'モデルでは、' $ this-> query( 'SELECT * FROM locations'); '? – AlienWebguy

+0

以下の答えを確認して、次に何が起こるか教えてください! – Karma

+1

私は、あなたが既にロケーションモデルを持っていて、単に 'find(all)'を行うことができるときに、ここでカスタムクエリを使用する根気のない理由を見ません...本当にカスタムクエリを使用する必要があるかどうか常に尋ねてください。あなたはあなたが本当にそれらを必要としないことが分かります。 – mark

答えて

7

あなたの場所モデルのクラス名がLocation、ないLocationModelでなければなりません。

このため、CakePHPはLocationsデータベーステーブル用の「汎用」モデルを生成し、独自のモデルの代わりにそのモデルを使用します。この一般的なモデルはget()メソッドを持っていないので、それはまた、エラーに

を引き起こし、SQL文としてgetを実行しますあなたの場合は、モデルの内側に、あなたは「$this->Location->query();を使用しますが、単に$this->query();

+1

'query()'はSQLインジェクションを防止しますか? –

+6

@FranciscoCorrales **はエスケープされていない変数を含むリテラルクエリを渡すが、プリペアドステートメントをサポート*しています(ソース[here](https://github.com/cakephp/cakephp/blob /2.4.9/lib/Cake/Model/Model.php#L3297))。 $ this-> query( 'SELECT * FROM foo WHERE id =?OR somefield =?'、array(123、 'foo')); ' – thaJeztah

3

場所:

<?php 
App::uses('Location', 'Model'); // Y do u need this? 
class LocationsController extends AppController 
{ 
    public $helpers = array('Html', 'Form'); 
    function index() 
    { 
     $this->loadModel("Location"); 
     $this->LocationModel->getLocations(); // I will strongly discourage using get() 
    } 
} 

場所のモデルは次のようになります。

<?php 
App::uses('AppModel', 'Model'); 
class LocationModel extends Model { 

    public $name = 'Location'; 

    public function getLocations() // Try to avoid naming a function as get() 
    { 
    /** Choose either of 2 lines below **/ 

     return $this->query("SELECT * FROM locations;"); // if table name is `locations` 
     return $this->query("SELECT * FROM Location;"); // if table name is `Location` since your public name is `Location` 
    } 
} 
+0

'query()'はSQLインジェクションを防止しますか? –

+0

それはしません。しかし、あなたは 'is_int()'や 'ctype_alnum'のようなPHP関数を使って変数をチェックすることができます。 – Karma

+0

これを見て、あなたの考えを教えてください: https://github.com/cakephp/ cakephp/blob/2.4.9/lib/Cake/Model/Model.php#L3297 –

関連する問題