2013-03-02 38 views
6

Tôi đang cố tạo các truy vấn MySQL của riêng mình trong CakePHP.Cách tạo truy vấn MySQL tùy chỉnh trong CakePHP?

Đây là tôi LocationsController.php:

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

Đây là tôi LocationModel.php:

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

    public $name = 'Location'; 

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

Như bạn thấy, tôi chỉ cố gắng thực hiện một truy vấn đơn giản nhưng nó không hoạt động. Tôi nhận được lỗi này:

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 

Khi tôi sử dụng một trong những phương pháp kỳ diệu như find ("tất cả") thay vào đó, nó hoạt động ...

Bạn có thể thấy vấn đề là gì? Tôi thực sự không thể và tôi chỉ cố gắng làm một công việc đơn giản!

+1

Nếu bạn' trong mô hình 'Location', nó sẽ không chỉ là' $ this-> query ('SELECT * FROM locations'); '? – AlienWebguy

+0

Kiểm tra câu trả lời dưới đây và cho tôi biết điều gì sẽ xảy ra tiếp theo! – Karma

+1

Tôi không thấy bất kỳ lý do nào để sử dụng truy vấn tùy chỉnh ở đây khi bạn đã có mô hình vị trí và chỉ có thể thực hiện 'tìm (tất cả)' ... bạn nên tự hỏi mình có thực sự phải sử dụng truy vấn tùy chỉnh hay không. sau đó bạn sẽ tìm ra rằng bạn không bao giờ thực sự cần chúng. – mark

Trả lời

7

Tên lớp của mô hình vị trí của mình nên Location, không LocationModel.

Do đó, CakePHP sẽ tạo mô hình 'chung' cho bảng cơ sở dữ liệu Vị trí và sử dụng mô hình đó thay vì mô hình của riêng bạn. Bởi vì mô hình chung này không không có một phương pháp get(), nó sẽ thực hiện get như một câu lệnh SQL, gây ra lỗi

Ngoài ra, bên trong Model, bạn không nên sử dụng $this->Location->query();, mà chỉ đơn giản $this->query();

+1

hiện 'truy vấn()' ngăn chặn SQL injection? –

+6

@FranciscoCorrales ** not ** nếu bạn chuyển cho nó một truy vấn theo nghĩa đen với các biến không thoát trong nó, nhưng nó * có * hỗ trợ các câu lệnh đã chuẩn bị (xem nguồn [ở đây] (https://github.com/cakephp/cakephp/blob /2.4.9/lib/Cake/Model/Model.php#L3297)). Sử dụng nó như thế này: '$ this-> query ('SELECT * FROM foo WHERE id =? OR somefield =?', Mảng (123, 'foo'));' – thaJeztah

3

khiển Location nên là:

<?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() 
    } 
} 

Location mẫu nên là:

<?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

có 'truy vấn()' ngăn chặn SQL injection? –

+0

Không. Nó không. Tuy nhiên, bạn có thể kiểm tra các biến bằng cách sử dụng các hàm php như 'is_int()' hoặc 'ctype_alnum' – Karma

+0

Vâng, hãy xem điều này và cho tôi biết suy nghĩ của bạn: https://github.com/cakephp/ cakephp/blob/2.4.9/lib/Bánh/Kiểu mẫu/Model.php # L3297 –

Các vấn đề liên quan