2013-03-02 13 views
6

Sto cercando di creare le mie query MySQL in Cakephp.Come creare query MySQL personalizzate in CakePHP?

Questo è il mio LocationsController.php:

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

Questo è il mio LocationModel.php:

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

    public $name = 'Location'; 

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

Come potete vedere, sto solo cercando di eseguire una semplice query, ma non funziona. Ottengo questo errore:

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 

Quando uso uno dei metodi magici come find ("tutto"), invece, funziona ...

si può vedere qual è il problema? Davvero non posso e sto solo cercando di fare un compito semplice!

+1

Se si' nel modello 'Location', non sarebbe solo' $ this-> query ('SELECT * FROM locations'); '? – AlienWebguy

+0

Controlla la risposta qui sotto e fammi sapere cosa succede dopo! – Karma

+1

Non vedo alcun motivo ragionevole per usare una query personalizzata qui quando hai già ottenuto il modello di localizzazione e potresti semplicemente fare 'find (all)' ... dovresti sempre chiederti se devi davvero usare una query personalizzata. allora scoprirai che non ne hai mai veramente bisogno. – mark

risposta

7

Il nome della classe del modello posizione dovrebbe essere Location, non LocationModel.

Per questo motivo, CakePHP genererà un modello "generico" per la tabella del database delle posizioni e utilizzerà tale modello anziché il proprio modello. Poiché questo modello generico fa non hanno un metodo get(), eseguirà get come un'istruzione SQL, che causa l'errore

Inoltre, all'interno del modello, non si dovrebbe usare $this->Location->query();, ma semplicemente $this->query();

+1

does 'query()' previene l'iniezione SQL? –

+6

@FranciscoCorrales ** not ** se si passa una query letterale con variabili senza escape in esso, ma * fa * supporta le istruzioni preparate (vedere la fonte [qui] (https://github.com/cakephp/cakephp/blob /2.4.9/lib/Cake/Model/Model.php#L3297)). Usalo in questo modo: '$ this-> query ('SELECT * FROM foo WHERE id =? OR somefield =?', Array (123, 'foo'));' – thaJeztah

3

Località controller dovrebbe essere:

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

Località modello dovrebbe essere:

<?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()' impedisce l'iniezione SQL? –

+0

No. Non è così. Tuttavia, puoi controllare le variabili usando le funzioni php come 'is_int()' o 'ctype_alnum' – Karma

+0

Bene, per favore guarda questo e fammi sapere cosa ne pensi: https://github.com/cakephp/ cakephp/blob/2.4.9/lib/Cake/Model/Model.php # L3297 –

Problemi correlati