2013-03-02 157 views
6

我想在Cakephp中創建我自己的MySQL查詢。如何在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 2013-03-02 04:53:45

+0

查看下面的答案,讓我知道接下來會發生什麼! – Karma 2013-03-02 05:01:18

+1

我沒有看到任何理智的理由在這裏使用自定義查詢時,你已經得到的位置模型,並可以做'找(所有)'...你應該總是問自己,如果你真的必須使用自定義查詢。那麼你會發現你永遠不需要它們。 – mark 2013-03-02 13:25:36

回答

7

您的位置:模型的類名應該是Location,不LocationModel

因此,CakePHP將爲Locations數據庫表生成一個「通用」模型,並使用該模型而不是您自己的模型。因爲通用模型確實get()方法,它將執行get作爲一個SQL語句,導致錯誤

此外,模型裏面,你不應該使用$this->Location->query();,而只是$this->query();

+1

'query()'防止SQL注入嗎? – 2014-04-30 17:38:47

+6

@FranciscoCorrales **不**如果你給它傳遞一個字面查詢並且有非轉義變量,但它支持預處理語句(參見source [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 2014-05-01 20:49:38

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

'查詢()'防止SQL注入? – 2014-04-30 17:40:04

+0

沒有。它沒有。但是,你可以通過使用php函數來檢查變量,如'is_int()'或'ctype_alnum' – Karma 2014-04-30 18:20:29

+0

好吧,請看看這個,讓我知道你在想什麼: https://github.com/cakephp/ cakephp/blob/2.4.9/lib/Cake/Model/Model.php#L3297 – 2014-05-02 00:49:16