2012-05-08 11 views
48

मान लें मैं एक सरणी है:पीएचपी फटना लेकिन लपेटें प्रत्येक तत्व में उद्धरण

$elements = array('foo', 'bar', 'tar', 'dar'); 

तो मैं एक DELETE IN SQL क्वेरी का निर्माण करना चाहते हैं:

$SQL = "DELETE FROM elements 
       WHERE id IN ('" . implode(',', $elements) . "')"; 

समस्या में है कि आईडी है तत्व सरणी प्रत्येक व्यक्तिगत रूप से उद्धृत नहीं हैं। I.E क्वेरी इस तरह दिखती है:

$SQL = "DELETE FROM elements 
       WHERE id IN ('foo,bar,tar,dar'); 

इसे ठीक करने के लिए सबसे अच्छा, सबसे सुंदर तरीका क्या है?

+0

बहुत सावधान रहो ... आप कर रहे हैं संभवतः कुछ गंभीर एसक्यूएल इंजेक्शन के लिए खुला है। – Brad

+0

तब 'निकब' द्वारा प्रदान किए गए समाधान के साथ एसक्यूएल इंजेक्शन के खिलाफ रोकने का सबसे अच्छा तरीका क्या है? धन्यवाद। – Justin

उत्तर

93

उद्धरण implode कॉल में जोड़ें: (मैं यह सोचते करती हूं कि आप implode मतलब)

$SQL = 'DELETE FROM elements 
      WHERE id IN ("' . implode('", "', $elements) . '")'; 

यह पैदा करता है:

DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar") 

एसक्यूएल इंजेक्शन के खिलाफ रोकने के लिए सबसे अच्छा तरीका यह सुनिश्चित करना है आपके तत्व ठीक से बच निकले हैं।

$elements = array(); 
$elements = array_map('mysql_real_escape_string', $elements); 
+0

बिल्कुल सही, तो इस समाधान के साथ ब्रैड के रूप में एसक्यूएल इंजेक्शन के खिलाफ रोकने का सबसे अच्छा तरीका क्या है? – Justin

+1

@ जुसिन मैंने एसक्यूएल इंजेक्शन को रोकने पर एक सुझाव के साथ अपना जवाब संपादित किया है। – nickb

+3

@ जस्टिन तैयार कथन का उपयोग करने का सबसे अच्छा तरीका है http://php.net/manual/en/pdo.prepared-statements.php http://php.net/manual/en/mysqli.prepare.php – Petah

0

आप array_walk उपयोग कर सकते हैं दोहराने में:

करने के लिए है कि काम करना चाहिए (लेकिन मैं यह परीक्षण नहीं किया) एक आसान बात तो की तरह, या तो array_map या array_walk, और हर पैरामीटर से बचने के उपयोग करने के लिए है तत्व के संदर्भ को पारित करने वाले सरणी के सभी तत्व और निम्न तरीकों से उद्धरण जोड़ें।

<?php 

$arr = ['a','b','c']; 

array_walk($arr, function(&$x) {$x = "'$x'";}); 

echo implode(',', $arr); // 'a','b','c' 

?> 
+0

कृपया स्पष्टीकरण जोड़ें कि यह एक उत्तर क्यों है। यह आपके लिए तुच्छ लग सकता है, लेकिन चूंकि आप कोई स्पष्टीकरण नहीं जोड़ते हैं, इसलिए आपका सुझाव इसके उपयोग के बारे में व्याख्या के लिए खुला है। – Glubus

0

आप उद्धरण में तार लपेट और फिर लपेट कि फटना() के आसपास के लिए अल्पविराम जोड़ने के लिए के लिए एक सरल array_map() फ़ंक्शन चला सकते हैं:

$array = ["one", "two", "three", "four"]; 

implode(",", array_map(function($string) { 
    return '"' . $string . '"'; 
}, $array)); 
संबंधित मुद्दे