2013-03-02 13 views
6

Próbuję utworzyć własne zapytania MySQL w Cakephp.Jak tworzyć niestandardowe zapytania MySQL w CakePHP?

To jest mój LocationsController.php:

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

To jest mój LocationModel.php:

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

    public $name = 'Location'; 

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

Jak widać, jestem po prostu staramy się wykonywać proste zapytanie, ale to nie działa. Otrzymuję ten błąd:

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 

Kiedy użyć jednej z magicznych metod, takich jak find („all”) zamiast, to działa ...

widzisz w czym jest problem? Naprawdę nie mogę i próbuję tylko wykonać proste zadanie!

+1

Jeśli” czy w modelu 'Location' nie byłoby po prostu' $ this-> query ("SELECT * FROM location"); '? – AlienWebguy

+0

Sprawdź odpowiedź poniżej i daj mi znać, co stanie się dalej! – Karma

+1

Nie widzę żadnego rozsądnego powodu, aby użyć niestandardowego zapytania tutaj, gdy już masz model lokalizacji i może po prostu zrobić 'find (all)' ... powinieneś zawsze zadać sobie pytanie, czy naprawdę musisz użyć niestandardowego zapytania. wtedy przekonasz się, że nigdy ich naprawdę nie potrzebujesz. – mark

Odpowiedz

7

Nazwa klasy modelu lokalizacja powinna być Location nie LocationModel.

Z tego powodu CakePHP wygeneruje "ogólny" model tabeli bazy danych lokalizacji i użyje tego modelu zamiast własnego modelu. Ponieważ ten rodzajowy modelu robi nie mieć metodę get(), będzie wykonywał get jako SQL, powodując błąd

Również wewnątrz modelu nie należy używać $this->Location->query();, ale po prostu $this->query();

+1

Czy 'query()' zapobiega iniekcji SQL? –

+6

@FranciscoCorrales ** nie ** jeśli przekażesz mu literalne zapytanie zawierające zmienne bez zmiany znaczenia, ale * obsługuje * gotowe instrukcje (patrz źródło [tutaj] (https://github.com/cakephp/cakephp/blob /2.4.9/lib/Cake/Model/Model.php#L3297)). Użyj go w ten sposób: '$ this-> query ('SELECT * FROM foo WHERE id =? Lub somefield =?', Array (123, 'foo'));' – thaJeztah

3

Lokalizacja Kontroler powinien być:

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

Lokalizacja model powinien być:

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

czy 'query()' zapobiega iniekcji SQL? –

+0

Nie. Tak nie jest. Można jednak sprawdzić zmienne za pomocą funkcji php, takich jak 'is_int()' lub 'ctype_alnum' – Karma

+0

Cóż, proszę spojrzeć na to i daj mi znać, co myślisz: https://github.com/cakephp/ cakephp/blob/2.4.9/lib/Cake/Model/Model.php # L3297 –

Powiązane problemy