मैं एक LIKE स्टेटमेंट के साथ PDO पैरामीटराइज्ड क्वेरी कैसे बना सकता हूँ?


107

यहाँ मेरा प्रयास है:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');

$query->execute(array('value'));

while ($results = $query->fetch()) 
{
    echo $results['column'];
}

जवाबों:


124

मेरे पोस्ट करने के बाद ही यह पता चला:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}

1
@ और: क्या होगा यदि कई likeका उपयोग किया जाता है? कैसे क्रम सरणी निष्पादित होना चाहिए?
लोगन

धन्यवाद। सीएसआर + मैसूरल + ओडीबीसी के साथ इसी तरह का मुद्दा था, जैसे "तालिका" जहां कॉलम "%!%" का उपयोग करके किसी भी पंक्तियों को वापस नहीं लौटाएगा। लेकिन अगर मैं आपको पसंद करता हूं तो "तालिका का चयन करें" जहां कॉलम पसंद है? " और पैरामीटर स्ट्रिंग सेट करें: स्ट्रिंग नाजुक = $ "% {searchFragment}%"; फिर पैरामीटर मान के लिए नाजुक का उपयोग करें। अजीब
sdjuan

2
पीडीओ को निष्पादन कॉल में उस% से बचना चाहिए। कैकई का जवाब बेहतर है
पीटर

यह ध्यान देने योग्य है कि PDOStatement :: bindParam प्रलेखन पृष्ठ पर शीर्ष उपयोगकर्ता द्वारा योगदान किया गया नोट एक अलग दृष्टिकोण प्रदान करता है : इसे बाइंड करने से पहले वेरिएबल पर प्रतिशत चिह्न (s) जोड़ें।
डैन रॉबिन्सन

इस धागे के नीचे के पास, आपके कॉमन सेंस के पेज से लिए गए गेविन के घोल को देखें। सरल। तार्किक।
RationalRabbit

85

नामित मापदंडों का उपयोग करने वालों के लिए, यहां MySQL डेटाबेस के लिए आंशिक मिलान के LIKEसाथ कैसे उपयोग किया जाए :%

जहां कॉलम_नाम कॉन्कैट ('%'): खतरनाक, '%')

जहां नामित पैरामीटर है :dangerousstring

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

संपादित करें: ओरेकल डेटाबेस के लिए कॉनटेनटेशन सिंटैक्स कॉन्सेटेशन ऑपरेटर का उपयोग करता है: ||इसलिए यह बस बन जाएगा:

जहाँ कॉलम_नाम '%' को पसंद करता है || : खतरनाक || '%'

हालाँकि, @bobince उल्लेख के रूप में यहाँ चेतावनी दी गई है कि:

कठिनाई आता है जब आप एक शाब्दिक अनुमति देना चाहते हैं %या _यह एक वाइल्डकार्ड के रूप में कार्य बिना, खोज स्ट्रिंग में चरित्र।

तो जब और जैसे संयोजन के लिए बाहर देखने के लिए कुछ और है।


6
+1 - यह मेरे लिए एक अच्छे दृष्टिकोण की तरह लगता है क्योंकि प्लेसहोल्डर को प्रतिस्थापित किए जाने के बाद डेटाबेस में सभी का उपयोग होता है, और इसका मतलब है कि नामित प्लेसहोल्डर का उपयोग किया जा सकता है। यह ध्यान देने योग्य है कि उपरोक्त सिंटैक्स Oracle के लिए है - MySQL में सिंटैक्स है LIKE CONCAT('%', :something, '%')। संदर्भ: stackoverflow.com/a/661207/201648
हारून न्यूटन

1
यह मेरे लिए बिल्कुल काम नहीं आया, लेकिन मुझे सही रास्ते पर ले गया। मुझे काम करने के लिए LIKE '%': कुछ '%' करना पड़ा।
क्रिस्टोफर स्मिट

मुझे पता है कि यह ऑफ-टॉपिक है, लेकिन मैं इस स्टैटिमेंट का उपयोग करने के साथ एसक्यूएल इंजेक्शन लगाने में सक्षम था, क्यों?
थियागो डायस

यह मेरे लिए काम नहीं किया, मैंने इसे SQL कमांड के साथ भी परीक्षण किया, इससे SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )मुझे त्रुटि मिलेगी।
लूजान बराल

@AaronNewton and it means named placeholders can be used। जब आप PHP में सम्‍मिलित होते हैं तो नामित प्लेसहोल्‍डर्स के साथ भी यह एक समस्‍या कैसे है? जाहिर तौर पर PHP में कॉन्फैनेटिंग नाम और स्थिति और अधिक पोर्टेबल दोनों का समर्थन करता है क्योंकि आप किसी भी डेटाबेस के लिए एक ही क्वेरी का उपयोग कर सकते हैं। मुझे वास्तव में यह समझ में नहीं आता है कि इतने सारे लोग क्यों सोचते हैं कि नामित और स्थैतिक प्लेसहोल्डर के बीच कोई अंतर है।
आपका कॉमन सेंस

18
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();

if (!$query->rowCount() == 0) 
{
    while ($results = $query->fetch()) 
    {
        echo $results['column'] . "<br />\n";
    }       
} 
else 
{
    echo 'Nothing found';
}

1
क्या स्वीकृत उत्तर पर इसका उपयोग करने का कोई फायदा है? क्या bindValueइंजेक्शन के हमलों से बचाव करता है ? स्वीकृत उत्तर मूल रूप से पुराने के दिनों में पसंद ?करने के लिए खोज स्ट्रिंग का उपयोग करके प्लेसहोल्डर्स का उपयोग करने के मूल्य को नकारता है %
felwithe

$ क्वेरी से पहले नकार का उपयोग करने की बात क्या है-> rowCount () == 0? क्या यह वास्तव में समझ में आता है?
ssi-aik

14

आप भी इसे आजमा सकते हैं। मैं इसी तरह की समस्या का सामना करता हूं, लेकिन शोध के बाद परिणाम मिला

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');

$stmt= $pdo_connection->prepare($query);

$stmt->execute(array(':search' => '%'.$search_term.'%'));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($result);

मैंने कोड को एक कोड ब्लॉक में डालने के लिए आपकी पोस्ट को संपादित किया - आप stackoverflow.com/help/formatting पर पोस्ट फ़ॉर्मेटिंग के बारे में अधिक पढ़ सकते हैं । कुछ अन्य उपयोगकर्ता ने एक टिप्पणी छोड़ने के बिना आपके उत्तर को अस्वीकार करने का विकल्प चुना, इसलिए मैं डाउनवोट के कारण के बारे में निश्चित नहीं हूं।
josliber

2
दोहराने के लिए, मैंने आपके प्रश्न पर वोट नहीं दिया; किसी और ने नीचा दिखाया।
josliber


2

मुझे यह php भ्रम से मिला

$search = "%$search%";
$stmt  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();

और यह मेरे लिए बहुत सरल है। जैसे वह कहता है, आपको क्वेरी भेजने से पहले "हमारा पूरा शाब्दिक तैयार करना होगा"


0

पीडीओ "%" से बच जाता है (मई सीक्वल इंजेक्शन के लिए नेतृत्व कर सकता है) : पिछले कोड का उपयोग आंशिक परिणाम का मिलान करने के लिए इच्छा परिणाम देगा, लेकिन अगर कोई आगंतुक चरित्र "%" टाइप करता है तो भी आपको परिणाम मिलेगा भले ही आप डॉन ' t डेटा बेस में कुछ भी संग्रहीत है (यह sql इंजेक्शन का नेतृत्व कर सकता है)

मैंने एक ही परिणाम के साथ सभी भिन्नता की बहुत कोशिश की है पीडीओ "%" बच रहा है जिससे अवांछित / अस्पष्ट खोज परिणाम निकल रहे हैं।

मैं हालांकि यह साझा करने के लायक था, अगर किसी को इसके चारों ओर एक शब्द मिल गया है तो कृपया इसे साझा करें


1
यह मैनुअल से है: us3.php.net/manual/en/pdo.prepared-statements.php यह एक और पोस्ट है जहां विषय के बारे में: stackoverflow.com/questions/22030451/… मैं वास्तव में आपके बारे में आपकी राय जानना चाहता हूं यह जारी।
ओजकर आर

1
संभावित समाधान (कोई परीक्षण नहीं किया गया) CONCAT का उपयोग करें , जैसे: $ sql = "आइटम से आइटम का चयन करें / आइटम से जहां आइटम_टाइट लें कॉनकैट ('%'; ','% ')"; संदर्भ: blog.mclaughlinsoftware.com/2010/02/21/php-binding-a-wildcard
Ozkar R

3
PDO% नहीं बचता यह आपका कोड है जो इसे गलत करता है। समाधान के लिए आपको पहले से दिए गए उत्तरों
योर कॉमन सेंस

आपके सुझाव के लिए धन्यवाद। वैसे भी कोड का परीक्षण मैनुअल से कोड था, SQL इंजेक्शन से बचने के लिए प्लेसहोल्डर का उपयोग करना, मुझे अभी भी वही परिणाम मिल रहा है उदाहरण # 6 प्लेसहोल्डर का अमान्य उपयोग पीडीओ उपरोक्त कोड का उपयोग करके% से बच जाता है, मेरे कोड से नहीं। मैं मंच पर नया हूं और मुझे समझ में नहीं आ रहा है कि यहां टिप्पणी, पोस्ट और प्रतिष्ठा की प्रक्रिया कैसे काम करती है, मैं इसे अपने अगले के लिए ध्यान में रखूंगा, क्योंकि पिछली टिप्पणी के आधार पर आपको दूसरों की मदद करने या टिप्पणी करने के लिए प्रतिष्ठा की आवश्यकता है। धन्यवाद।
ओजकर आर सेप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.