2010-05-20 13 views
10

देखो मैं पंक्तियाँ, जहां name = something और order = somevalueचुनें ... जहां id = कोई मान। क्या यह संभव है? इस तालिका में

तो मैं लिखने

select `id` from `table` where `name` = 'something' and `order` = 'somevalue' 

लेकिन php तर्क पर निर्भर प्राप्त करना होगा कृपया

table 
|id| |name| |order| 

, कभी कभी मैं सभी प्राप्त करने की आवश्यकता पंक्तियां, जहां name = something, order मूल्य से स्वतंत्र रूप से। मैं क्वेरी संरचना को बदलना नहीं चाहता, क्योंकि अभ्यास में कई फ़ील्ड हैं, और प्रश्नों की संभावित गणना बहुत बड़ी हो जाएगी। तो मैं बचाने क्वेरी की संरचना करना चाहते हैं, और जब मैं सिर्फ नाम से चयन करने के लिए की जरूरत है, मैं कुछ इस तरह लिखना चाहते हैं:

select `id` from `table` where `name` = 'something' and `order` = any value 

यह संभव है?

धन्यवाद

+1

मैं जिस तरह से आप अपने प्रश्नों का निर्माण कर रहे हैं बदल जाएगा ... – nickf

उत्तर

10

खैर, यह एक हैक की तरह है, लेकिन अगर तुम सच में ऐसा करने की जरूरत है, यह इस तरह काम करेंगे:

select `id` from `table` where `name` = 'something' and `order` = `order` 

तो फिर तुम सिर्फ कह रहे हैं "जहाँ भी आदेश है खुद के जैसा ही ", तो यह हमेशा सच है।

+2

मैं इस संरचना को बदलने पर विचार होता है, के बाद से वाक्य रचना एक क्षेत्र का उल्लेख करने के लिए एक ही रूप में है कि एक स्ट्रिंग का उल्लेख नहीं है। –

+0

यह करने का यह सही तरीका नहीं है। PHP कोड को समायोजित करने की आवश्यकता है। – vonPetrushev

5

नहीं, यह संभव नहीं है। आपको संरचना को बदलने की जरूरत है (वैकल्पिक रूप से एक पसंद के लिए ताकि आप '%' का उपयोग कर सकें, लेकिन यह बहुत बदसूरत है)।

हालांकि, आपको हर संभावित संयोजन को संभालने के लिए एक अलग क्वेरी लिखने की आवश्यकता नहीं है। आप बस क्वेरी गतिशील बना सकते हैं:

//create base query 
$query = "select `id` from `table` where `name` = 'something' "; 

//add order if we need it 
if ($use_order) 
    $query .= "and `order` = 'somevalue' "; 

//repeat for any other optional part 

ध्यान दें कि आप निश्चित रूप से अभी भी उचित उपायों एसक्यूएल इंजेक्शन और अन्य सुरक्षा मुद्दों से बचने के ले जाना चाहिए - मैं आदेश चीजों को सरल रखने के लिए यहाँ इस शामिल नहीं किया है।

+0

एसक्यूएल इंजेक्शन क्या है? शायद आप mysql_real_escape_string() और ऐसे फ़ंक्शंस के बारे में बात करते हैं? मुझे "एसक्यूएल इंजेक्शन" – Simon

+0

@ स्यॉम का अर्थ समझ में नहीं आता है: एसक्यूएल इंजेक्शन डेटा प्रदान करने का कार्य है जो क्वेरी की संरचना को प्रभावित करता है, जिससे इसे करने के लिए कुछ और करना पड़ता है। mysql (i) _real_escape_string वास्तव में अधिकांश लोग इसका उपयोग रोकने के लिए उपयोग करते हैं (हालांकि पैरामीटरयुक्त प्रश्न कड़ाई से एक बेहतर दृष्टिकोण बोल रहे हैं, लेकिन यह एक अलग विषय है)। यदि आप और जानना चाहते हैं, तो एसओ पर और Google के माध्यम से उपलब्ध बहुत सारे अच्छे संसाधन हैं। मैं बस इतना कहने की कोशिश कर रहा हूं कि गतिशील रूप से निर्माण करते समय आपको अभी भी इस तरह की चीज करने की याद रखना होगा। –

2

यदि आप बाध्य पैरामीटर का उपयोग कर रहे हैं, तो यह असंभव होगा।

तुम सिर्फ मानों को बदल देते हैं, तो आप क्या कर सकते हैं निम्नलिखित:

select `id` from `table` where `name` = 'something' and `order` = `order` 
0

मुझे नहीं लगता कि आप किसी भी विकल्प नहीं है ... एक बार चयन कर आप कर सकते हैं "unfilter" नहीं और मिल अधिक पंक्तियां

आपको केवल दो प्रश्नों का उपयोग करना चाहिए - या तो दो स्वतंत्र प्रश्न, या एक नाम जो किसी टेम्पलेट टेबल में नाम पर चयन करता है, और फिर (वैकल्पिक रूप से) जो ऑर्डर विशेषता पर आगे बढ़ता है।

0

चाड ने ऊपर कहा, बस कॉलम को अपने आप के बराबर सेट करें। लेकिन, सावधान रहना कुछ प्लेटफार्मों पर/स्थापित विन्यास, शून्य = शून्य:

select `id` from `table` where `name` = 'something' and coalesce(`order`,'') = coalesce(`order`,'') 
+4

नूल! = एनएलएल वास्तव में अपेक्षित व्यवहार है, जैसा कि SQL मानक में परिभाषित किया गया है। –

0

इस डेटाबेस प्रश्नों के साथ एक आम बात है - आप कितना छानने आप डेटा इसे करने के लिए आवेदन करना चाहते हैं पर निर्भर करता है एक चर क्वेरी की जरूरत है! प्रश्नों। आप अपने प्रश्न को पूरे कोड में एक स्ट्रिंग के रूप में दोहराए जाने का मार्ग जा सकते हैं, लेकिन यह खराब अभ्यास है क्योंकि यह कोड की जटिलता को बिना किसी आवश्यकता के बढ़ाता है। त्रुटियों की संभावना होती है यदि आपको किसी कारण से क्वेरी को बदलने की आवश्यकता है, और परिणामस्वरूप इसे कई स्थानों में बदलना है।

बेहतर समाधान एक समारोह जो आपके लिए क्वेरी बनाता है बनाने के लिए है निष्पादित करें:

function buildMyQuery($name, $order = null) { 
    $sql = "SELECT `id` FROM `table` WHERE `name`='$name'"; 

    if ($order != null) { 
     $sql .= " AND `order`='$order'"; 
    } 

    return $sql; 
} 

आप तो बस 'नाम' क्षेत्र का उपयोग करने के लिए इस चला सकते हैं:

$query = buildMyQuery("somename"); 

या यह दोनों फ़ील्ड का उपयोग करने के लिए:

$query = buildMyQuery("somename", "someorder"); 

जैसा ऊपर बताया गया है, यह कोड जानबूझकर सिंप है लिफाफा और $ नाम या $ आदेश के माध्यम से संभवतः खतरनाक डेटा के लिए कोई आकस्मिकता नहीं है। डेटा के टुकड़े का उपयोग करने से पहले आपको फ़ंक्शन की शुरुआत में, पहले डेटा को साफ करने के समान mysql_real_escape_string या कुछ ऐसा करने की आवश्यकता होगी।

डायनामिक क्वेरी पीढ़ी जीवन का एक तथ्य है क्योंकि बायरन कहते हैं, इसलिए मैं हैक-आश वर्कअराउंड का उपयोग करने के बजाय अब इसका आदी हो जाऊंगा।

0

प्रतिबिंब पर, मेरे पास एक बेहतर जवाब है। मेरे सहयोगी ने मुझे एक तरीका दिखाया जो यह किया जा सकता है।

मेरे उदाहरण ...

Select rentals.* From rentals Where ((? = '') OR (user_id = ?)) 

चर एक ही होना चाहिए।

वे कर रहे हैं दोनों 5 उदाहरण के लिए, पहले बूलियन झूठा होगा, लेकिन दूसरा सच हो जाएगा, पंक्तियों जहाँ उपयोगकर्ताओं को आईडी 5.

है आप की आवश्यकता होती है "सभी" के लिए, एक के रूप में स्थापित करने के रिक्त स्ट्रिंग के परिणामस्वरूप सभी पंक्तियों को क्लॉज की स्थिति को पूरा करने के लिए देखा जा रहा है।

0

क्या आप यहां not null क्वेरी का उपयोग नहीं कर सकते?

select `id` from `table` where `name` = 'something' and `order` is not null; 
संबंधित मुद्दे