2009-06-29 20 views
8

मैं क्वेरी स्ट्रिंग में डॉट के साथ वैरिएबल पास कर रहा हूं। पीएचपी डॉट को स्कोर के साथ बदल रहा है। तो मैं कैसे चर नाम जो नाम में डॉट रहा है बनाए रख सकते हैंवैरिएबल नाम में डॉट

http://localhost/sample.php?one.txt=on&two.txt=on

sample.php

$ सेवानिवृत्त = $ _ अनुरोध [ 'one.txt']; // काम नहीं कर

+3

अपने चर नाम में डॉट्स न रखें। – Sampson

+3

क्या होगा यदि आप ओपनआईडी के साथ एकीकृत करने की कोशिश कर रहे हैं, जो उनके क्वेरी पैरामीटर में डॉट्स रखता है? – defines

उत्तर

27

PHP आपके परिवर्तनीय नाम को one.txt से one_txt में परिवर्तित कर रहा है क्योंकि डॉट्स वेरिएबल नामों में मान्य नहीं हैं।

अधिक जानकारी के लिए PHP Documentation को देखो:

चर नाम PHP में अन्य लेबल के रूप में वही नियम का पालन करें। एक वैध परिवर्तनीय नाम किसी पत्र या अंडरस्कोर से शुरू होता है, इसके बाद अक्षरों, संख्याओं या अंडरस्कोर की संख्या के बाद। '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

आप: एक नियमित अभिव्यक्ति के रूप में, यह इस प्रकार व्यक्त किया जाएगा या तो परिवर्तन के लिए खाता कर सकते हैं (. से _) और $_REQUEST['one_txt'] के लिए जांचें या आप अपने HTML फॉर्म को इसके बजाय एक वैध चर नाम दे सकते हैं।

संपादित करें:

अनुवर्ती करने के लिए माइकल Borgwardt की टिप्पणी पर, यहाँ PHP's documentation about handling variables from external sources से पाठ है: भेजे चर नाम

में

डॉट्स

आमतौर पर, पीएचपी की नाम में परिवर्तन नहीं करता परिवर्तनीय जब वे एक स्क्रिप्ट में पारित होते हैं। हालांकि, यह ध्यान दिया जाना चाहिए कि डॉट (अवधि, पूर्ण स्टॉप) एक PHP चर नाम में मान्य वर्ण नहीं है। कारण से, यह पर देखो:

<?php 
$varname.ext; /* invalid variable name */ 
?> 

अब, क्या पार्सर देखता है एक चर नामित $ VARNAME, स्ट्रिंग संयोजन ऑपरेटर, barestring (यानी गैर उद्धृत स्ट्रिंग जो नहीं करता है के द्वारा पीछा किया जिसके बाद किसी ज्ञात कुंजी या आरक्षित शब्द से मेल नहीं खाता) 'ext'। जाहिर है, इसका उद्देश्य इच्छित परिणाम नहीं है।

इस कारण से, यह नोट करना महत्वपूर्ण है कि PHP स्वचालित रूप से अंडरस्कोर द्वारा भेजे चर नाम पर कोई भी डॉट्स की जगह लेगा।

यह वास्तव में एक PHP विशिष्ट बात है।

+4

मुझे नहीं पता कि पहचानकर्ताओं के लिए PHP के नियम किस क्वेरी स्ट्रिंग कुंजी नाम मान्य हैं के लिए प्रासंगिक हैं। यदि कुछ भी हो, तो यह एक PHP-विशिष्ट सम्मेलन है जो register_globals की वजह से मौजूद है कि किसी को भी किसी भी तरह का उपयोग नहीं करना चाहिए क्योंकि यह बेहद असुरक्षित है। –

+2

@ माइकल बोर्गवर्ड: वास्तव में आप एक वैध बिंदु बनाते हैं। यह एक PHP विशिष्ट बात है, संभवतया उस समय से एक विरासत रजिस्टर_ग्लोबल्स डिफ़ॉल्ट थी। और मुझे आशा है कि कोई भी अब भी उपयोग नहीं कर रहा है :) –

6

उपयोग $ _SERVER (पर [two.txt] => पर [one.txt] =>) [ 'QUERY_STRING'] अपने उदाहरण सरणी के लिए

$get = array(); 
foreach(explode('&', $_SERVER['QUERY_STRING']) as $part) 
    { 
    $part = explode('=', $part); 
    if($key = array_shift($part)) 
     { 
     $get[ $key ] = implode('', $part); 
     } 
    } 
print_r($get); 

परिणाम

+0

काम करता है। पागल है कि PHP बिंदीदार पैराम के लिए अनुमति नहीं देता है। –

4

PHP डेवलपर register_globals() का समर्थन करने के लिए इसे कार्यान्वित किया गया, लेकिन यदि वे परिणामों पर विचार करने के लिए एक से अधिक सेकंड तक रुक गए थे तो वे केवल वैश्विक चर नामस्थान में आयात किए गए नामों को बदल चुके होंगे, न कि $ _POST में। अनुरोध चर को बदलने के लिए कोई कारण नहीं है ... अच्छी तरह से, मानक फॉर्म सबमिशन को संभालने में PHP को अक्षम करने के अलावा।

यहाँ पोस्ट चर के लिए समाधान के रूप में अच्छी तरह से है, जो शायद प्राप्त समाधान की तुलना में अधिक उपयोगकर्ताओं के लिए जटिल काम है:

function post_data(){  
    $data=explode('&',file_get_contents("php://input")); 
    $post=array(); 
    foreach ($data as $var){ 
     list($key,$value)=explode('=',$var,2); 
     $post[$key]=urldecode($value); 
    } 
    return $post; 
} 
संबंधित मुद्दे