2013-03-02 8 views
6

मैं केकफ़्पी में अपना खुद का MySQL क्वेरी बनाने की कोशिश कर रहा हूं।केकपीएचपी में कस्टम 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

आप अगर ' 'स्थान' मॉडल में फिर से, यह सिर्फ '$ यह-> क्वेरी नहीं होगी ('स्थान से चुनें');'? – AlienWebguy

+0

नीचे दिए गए उत्तर की जांच करें और मुझे बताएं कि आगे क्या होता है! – Karma

+1

मुझे कस्टम क्वेरी का उपयोग करने के लिए कोई सौहार्दपूर्ण कारण नहीं दिख रहा है जब आपको पहले से ही स्थान मॉडल मिल गया है और केवल 'ढूंढें (सभी)' कर सकता है ... आपको हमेशा खुद से पूछना चाहिए कि क्या आपको वास्तव में कस्टम क्वेरी का उपयोग करना चाहिए। तो आप पाएंगे कि आपको वास्तव में उनकी आवश्यकता नहीं है। – mark

उत्तर

7

अपना स्थान मॉडल के वर्ग के नाम Location, नहीं LocationModel होना चाहिए।

इस वजह से, केकेपीएचपी स्थान डेटाबेस तालिका के लिए 'जेनेरिक' मॉडल उत्पन्न करेगा और आपके मॉडल के बजाय उस मॉडल का उपयोग करेगा। क्योंकि यह सामान्य मॉडल करता नहीं एक get() विधि है, यह एक एसक्यूएल बयान के रूप में get निष्पादित करेगा, त्रुटि पैदा

इसके अलावा, मॉडल के अंदर, आप $this->Location->query(); उपयोग नहीं करना चाहिए, बल्कि केवल $this->query();

+1

'क्वेरी()' एसक्यूएल इंजेक्शन को रोकता है? –

+6

@ फ्रांसिस्को कोरल ** ** ** यदि आप इसे अनचाहे चर के साथ एक शाब्दिक क्वेरी पास करते हैं, लेकिन यह * तैयार किए गए कथन का समर्थन करता है (स्रोत [यहां] देखें (https://github.com/cakephp/cakephp/blob /2.4.9/lib/Cake/Model/Model.php#L3297))। इसे इस तरह प्रयोग करें: '$ this-> क्वेरी ('चुनें * foo से id =? या somefield =?', सरणी (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

'क्वेरी()' एसक्यूएल इंजेक्शन को रोकता है? –

+0

नहीं। यह नहीं है हालांकि, आप 'is_int() 'या' ctype_alnum' – Karma

+0

जैसे php फ़ंक्शंस का उपयोग कर चर की जांच कर सकते हैं, कृपया इसे देखें और मुझे बताएं कि आप क्या सोचते हैं: https://github.com/cakephp/ केकेएफपी/ब्लॉब/2.4.9/लीब/केक/मॉडल/मॉडल.एचपी # एल 3297 –

संबंधित मुद्दे