2010-02-16 22 views
15

पर फ़ंक्शन को लागू करने का आसान तरीका मुझे array_walk() और array_map() से अवगत है। लेकिन जब (एक पुरानी परियोजना पर) तो जैसे पूर्व का उपयोग कर यह असफलएक सरणी

array_walk($_POST, 'mysql_real_escape_string'); 

चेतावनी: mysql_real_escape_string() उम्मीद पैरामीटर 2 संसाधन, स्ट्रिंग दिया जाना है।

तो मैं इस से थोड़ा अधिक बदसूरत संस्करण

foreach($_POST as $key => $value) { 
    $_POST[$key] = mysql_real_escape_string($value); 
} 

तो साथ चला गया क्यों नहीं पहले जिस तरह से काम किया है? किसी फ़ंक्शन में सरणी के मानों को मैप करने का सबसे अच्छा तरीका क्या है?

+0

बदसूरत संस्करण वास्तव में काम करता है? –

+2

बदसूरत संस्करण * करता है * काम करता है। – alex

उत्तर

28
कर सकता है

कॉलबैक फ़ंक्शन array_walk पर पारित होने की अपेक्षा दो पैरामीटर स्वीकार करने की उम्मीद है, एक मान के लिए और एक कुंजी के लिए:

आमतौर पर, funcname दो मापदंडों पर ले जाता है। सर पैरामीटर का मान पहला, और कुंजी/अनुक्रमणिका दूसरा है।

लेकिन mysql_real_escape_string दूसरे पैरामीटर को संसाधन होने की अपेक्षा करता है। यही कारण है कि आपको वह त्रुटि मिल रही है।

उपयोग array_map बजाय, यह केवल प्रत्येक आइटम के मूल्य लेता है और दिए गए कॉलबैक फ़ंक्शन पर गुजरता है:

array_map('mysql_real_escape_string', $_POST); 

दूसरा पैरामीटर लोप हो जाएगा और इसलिए पिछली बार खोले कनेक्शन प्रयोग किया जाता है।

यदि आपको दूसरा पैरामीटर पास करने की आवश्यकता है, तो आपको फ़ंक्शन कॉल को किसी अन्य फ़ंक्शन में लपेटने की आवश्यकता है, उदा। एक anonymous function:

array_map(function($string) use ($link) { return mysql_real_escape_string($string, $link); }, $_POST); 
+3

'array_map()' भी एक बेहतर विकल्प है क्योंकि यह मूल सरणी को संशोधित नहीं करता है, यह फ़ंक्शन लागू होने के बाद एक नई सरणी देता है। – kapa

2

ऐसा इसलिए है क्योंकि mysql_real_escape_string दोनों स्ट्रिंग दोनों स्ट्रिंग को दिया जा रहा है।

http://php.net/manual/en/function.mysql-real-escape-string.php

http://www.phpbuilder.com/manual/en/function.array-map.php:

array_map() हर एक को कॉलबैक फ़ंक्शन लागू करने के बाद एक सरणी arr1 सभी तत्वों वाली देता है। पैरामीटर की संख्या कॉलबैक फ़ंक्शन स्वीकार करता है कि सरणियों array_map() के लिए पारित की संख्या से मेल खाना चाहिए

आप

function myescape($val) 
{ 
    return mysql_real_escape_string($val); 
} 

... तो

array_walk($_POST, 'myescape'); 
+0

तो 'array_walk()' फ़ंक्शन के सभी मानकों पर प्रत्येक सरणी मान को मैप करेगा? वह थोड़ा सा नहीं है * * अजीब *? किसी भी तरह से मैं कह सकता हूं "केवल प्रथम परम कृपया"? – alex

+0

पहले प्रश्न का उत्तर नहीं है। –

+0

मुझे लगता है कि माइस्केप में दूसरा तर्क गुम है: $ key –

2

http://php.net/manual/en/function.array-walk.php का कहना है कि array_walk 2 तर्कों, मूल्य और कुंजी के साथ समारोह कॉल करेंगे।Mysql_real_escape_string को लपेटने के लिए आपको एक नया फ़ंक्शन लिखना चाहिए।

function wrapper($val, $key){ 
    return mysql_real_escape_string($val); 
} 

और फिर: की तरह कुछ

array_walk($_POST, 'wrapper'); 

क्षमा करें यदि मेरे पीएचपी सही नहीं है, लेकिन मुझे लगता है कि आप सामान्य विचार को पकड़ने के लिए होगा।

+1

आपका मतलब है, 'array_walk()' का दूसरा तर्क 'wrapper' होना चाहिए। – alex

2

mysql_real_escape_string() तब तक काम नहीं करेगा जब तक कि आपने पहले एक MySQL कनेक्शन नहीं बनाया हो। कारण यह बहुत अच्छा है कि यह टेबल प्रकार फिट करने के लिए पात्रों से बच जाएगा। दूसरा [वैकल्पिक] तर्क mysql कनेक्शन का संदर्भ है।

$_POST हमेशा key->value के रूप में स्थापित किया जाता है। तो, आप array_walk कॉल mysql_real_escape_string(value, key) पर कॉल करते हैं। ध्यान दें कि दूसरा तर्क संदर्भ नहीं है।

यही कारण है कि यह काम नहीं करता है। ऊपर उल्लेखित कई समाधान हैं।

-2

मुझे स्वीकार्य उत्तर का उपयोग करने में परेशानी थी क्योंकि इससे मुझे उन कारणों से त्रुटियां हुईं जिनसे मैं काम नहीं कर सका। इसलिए किसी को भी array_walk या array_map में परेशानी होने के कारण मुझे यह काम मिल गया।

foreach($_POST as $pk => $pv) $_POST[$pk] = mysql_real_escape_string($pv); 
+0

क्या आपने समस्या के बारे में एक प्रश्न पूछा है? इस तरह यह जवाब बस एक मिथक फैल रहा है कि 'array_map()' के साथ किसी प्रकार की समस्या है। -1 – kapa

+0

@ bažmegakapa यह किसी भी मिथक को फैल नहीं रहा है। यह सिर्फ एक वैकल्पिक, समझने में आसान है, जो PHP के कार्यों से कम परिचित लोगों के लिए समाधान प्रदान कर रहा है। ओपी ने एक सरणी में एक फ़ंक्शन को लागू करने का एक आसान तरीका पूछा, जो यह करता है ... आप वास्तव में किस बारे में बात कर रहे हैं? –

+0

मैंने यह भी उल्लेख नहीं किया कि आपके द्वारा उत्तर के रूप में पोस्ट किया गया एक ही कोड पहले से ही प्रश्न में है ... – kapa

1

मैं जानता हूँ कि ओ पी, एक समारोह फोन करने के लिए कहा लेकिन ऐसे मामलों में जहां आप वास्तव में एक समारोह कॉल करने के लिए की जरूरत नहीं है में आप एक anonymous one परिभाषित कर सकते हैं:

$ids = [1,2,3]; 
array_walk($ids,function(&$id){$id += 1000;});