2009-04-12 8 views
11

मैं निम्नलिखित एसक्यूएल (वास्तविक समस्या का सरलीकरण) है:मैं ज़ेंड फ्रेमवर्क में जटिल एसक्यूएल से कैसे बच सकता हूं?

SELECT * 
FROM t 
WHERE myname LIKE '%{$input}%'; 

मैं $ इनपुट कैसे बच सकता हूँ?
मैं उद्धरण का उपयोग नहीं कर सकता (जब तक मुझे कुछ याद न हो)।

SELECT * 
FROM t 
WHERE myname LIKE '\%my input\%'; 

उत्तर

15

अंतिम विकल्प मेरे लिए अच्छा काम करता है मैंने इसे '%' से बचने का अनुभव नहीं किया है। इसलिए $db->quote('%'.$_GET['query'].'%') आउटपुट %queryvalue%

+0

यह सबसे अच्छा तरीका है :) –

+3

एफडब्ल्यूआईडब्ल्यू, यह एकल-उद्धरण सहित '% queryvalue%' आउटपुट करता है। –

2

आप कर सकते हैं:

$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE '%?%'",$input); 

मुझे

SELECT * 
FROM t 
WHERE myname LIKE '%'my input'%'; 

और

देंगे

रूप
$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?",'%'.$input.'%'); 

मुझे तर्ज पर कुछ देना होगा एसक्यूएल स्तर पर $ इनपुट के संयोजन:

$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE '%'|| ? ||'%'",$input); 

दुर्भाग्य से यह जब आप चाहते हैं $ इनपुट शाब्दिक '%' या '_' वर्ण के लिए सक्षम होना प्रयोग करने योग्य नहीं है। इस दौर पाने के लिए, एक स्पष्ट तरह-एस्केप वर्ण निर्दिष्ट करें और उन्हें अपने भागने:।

$inputlike= '%'.preg_replace('[%_=]', '=$0', $input).'%'; 
$sql=$DB->quoteInto("SELECT * FROM t WHERE myname LIKE ? ESCAPE '='", $inputlike); 

(यह किसी भी चरित्र हो सकता है जरूरी नहीं कि '=' यह भी करने के लिए जहां ESCAPE चूक एक बग के आसपास काम करता है '\' जब MySQL में निर्दिष्ट नहीं है।)

दुर्भाग्यवश SQL सर्वर भी '[' चरित्र को विशेष रूप से लेता है, एक regexp- जैसे चरित्र समूह करने के लिए। तो यदि आपका डीबी SQL सर्वर है तो आपको preg_replace में समूह में '[' शामिल करना होगा। दुर्भाग्य से यह अन्य डीबीएमएस पर '[' से बचने के लिए वैध एएनएसएल एसक्यूएल नहीं है जहां इसे बचने की आवश्यकता नहीं है।

+0

और स्ट्रिंग कॉन्सटेनेशन एक डीबीएमएस-निर्भर है, इसलिए अपने डीबीएमएस दस्तावेज़ों की जांच करें। –

+0

हम्म, हाँ ... + एसक्यूएल सर्वर और || है एएनएसआई/हर कोई, आईआईआरसी है। गह, क्या गड़बड़ है। – bobince

+0

वास्तव में एक गड़बड़। देखेंगे कि अगर मैं जेडएफ परियोजना में इसके लिए एक बग खोलता हूं तो क्या होगा। –

-1

आप केवल उस फ़ंक्शन का उपयोग कर सकते हैं जो zf स्ट्रिंग पर उपयोग करता है जो addcslashes ($ value, "\ 000 \ n \ r \ '\" \ 032 ") है; जो स्ट्रिंग को उसी तरह बदल देगा वहाँ db कक्षा में एक विधि यह करने के लिए है, तो का उपयोग करता है या आप (mysql के मामले में) mysql_real_escape_string इस्तेमाल कर सकते हैं।

किसी भी तरह से आप db बोली कार्यों में से एक का उपयोग नहीं होता

मैं आश्चर्य है, लेकिन मुझे पता नहीं है कि वहां एक होना चाहिए।

1

यह बहुत सरल है:

$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?",'%' . $input . '%'); 

//Will output: SELECT FROM t WHERE myname LIKE '%inputtedvalue%' 


$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?",'%' . $input); 

//Will output: SELECT FROM t WHERE myname LIKE '%inputtedvalue' 


$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?", $input . '%'); 

//Will output: SELECT FROM t WHERE myname LIKE 'inputtedvalue%' 


$sql=$DB->quoteInto("SELECT * 
        FROM t 
        WHERE myname LIKE ?", $input); 

//Will output: SELECT FROM t WHERE myname LIKE 'inputtedvalue' 

prolem क्या है?

:)

1

समस्या है, हम विशेष वर्ण मैन्युअल की जगह उन्हें थोड़ा गंदा होगा, लेकिन हो, तो कोई समाधान ...

1

इसे और अधिक सरल है की तरह से बचने के लिए करना चाहते हैं:

$table->select()->where("myname LIKE ?", '%'.$input.'%'); 
3

समाधान वास्तव में सरल है।Zend_Db में ईडन अभिव्यक्ति वर्ग है जो आपको इसके आसपास काम करने में मदद करता है।

$select = $this->select() 
->where('value LIKE("?")', new Zend_Db_Expr('%' . $value . '%')) 

$this->fetchAll($select); 
संबंधित मुद्दे

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