2013-06-15 4 views
6

से एकल वैरिएबल वैल्यू जोड़ी को हटाएं मेरे पास एक ऐसा पृष्ठ है जो कई मानकों यानी मानों के साथ चर के अनुसार आइटम सूचीबद्ध करता है।PHP; querystring

listitems.php?color=green&size=small&cat=pants&pagenum=1&edit=1 

अब तक तो अच्छा:

listitems.php?color=green&size=small&cat=pants&pagenum=1 etc. 

सूची का संपादन सक्षम करने के लिए, मैं एक पैरामीटर संपादित = 1 जो ऊपर क्वेरी स्ट्रिंग में जोड़ा जाता है देना है।

जब उपयोगकर्ता संपादन कर लेता है, तो मेरे पास एक लिंक है जो संपादन मोड से बाहर निकलता है। मैं चाहता हूं कि यह लिंक पूरे क्वेरीस्ट्रिंग को निर्दिष्ट करे - जो कुछ भी हो सकता है क्योंकि यह उपयोगकर्ता विकल्पों के अधीन है - संपादन = 1 को छोड़कर।

जब मेरे पास केवल कुछ चर थे, तो मैंने उन्हें लिंक में मैन्युअल रूप से सूचीबद्ध किया लेकिन अब और भी कुछ है, मैं केवल संपादन = 1 को हटाने के लिए प्रोग्रामेटिक रूप से सक्षम होना चाहता हूं।

क्या मुझे संपादन = 1 के लिए कुछ प्रकार की खोज करना चाहिए और फिर इसे कुछ भी नहीं बदला जाना चाहिए?

$qs = str_replace("&edit=1, "", $_SERVER['QUERY_STRING']); 
<a href='{$_SERVER['PHP_SELF']}?{$qs}'>return</a>; 

या ऐसा करने के लिए सबसे अधिक त्रुटि-मुक्त तरीका क्या होगा।

नोट: पृष्ठ से पृष्ठ पर जाने पर मुझे एक समान स्थिति है जहां मैं पेगेनम लेना चाहता हूं और इसे एक अलग से बदलना चाहता हूं। वहां, चूंकि पेगेनियम भिन्न होता है, इसलिए मैं केवल पेगेनम = 1 की खोज नहीं कर सकता, लेकिन अगर 0xखोजना होगा तो इससे कोई फर्क पड़ता है।

धन्यवाद।

उत्तर

16

मैं http_build_query है, जो अच्छी तरह से मानकों और यह प्रारूपों की एक सरणी सही ढंग से स्वीकार करता है का उपयोग करेंगे। आप $_GET से संपादन पैरामीटर को अनसेट करने में सक्षम होंगे और शेष को इस फ़ंक्शन में दबाएंगे।

ध्यान दें कि आपके कोड में htmlspecialchars() पर एक लापता कॉल है। एक यूआरएल में ऐसे अक्षर हो सकते हैं जो HTML में सक्रिय हैं। तो जब इसे एक लिंक में आउटपुट करते हैं: एस्केप!

कुछ उदाहरण:

unset($_GET['edit']); // delete edit parameter; 
$_GET['pagenum'] = 5; // change page number 
$qs = http_build_query($_GET); 

... output link here. 
+0

मैं कैसे $ _SERVER [ 'QUERY_STRING'] से करना होगा? – user1904273

+0

'parse_url()' और 'parse_str()' है, लेकिन $ _GET हमेशा उपलब्ध और भरा हुआ है, इसलिए यह आवश्यक नहीं है। – Sven

+1

मैं $ _GET वैरिएबल (या उस मामले के लिए किसी भी सुपरग्लोबल्स) को संशोधित नहीं करता क्योंकि उन्हें एप्लिकेशन में कहीं और आवश्यकता हो सकती है। इसके बजाय, एक अस्थायी चर बनाएँ जैसे '$ edit_query = $ _GET;'। फिर आप अपने सुपरग्लोब को प्रभावित किए बिना 'अनसेट ($ edit_query [' edit ']) कर सकते हैं; – Number1SuperGuy

0

अगर edit=1 पहले चर रहा है यह कार्य नहीं करेगा:

listitems.php?edit=1&color=green&... 

आप क्वेरी स्ट्रिंग अपने आप को बनाने के लिए $_GET चर का उपयोग कर सकते हैं। कुछ की तरह:

$qs = ''; 
foreach ($_GET as $key => $value){ 
    if ($key == 'pagenum'){ 
     // Replace page number 
     $qs .= $key . '=' . $new_page_num . '&'; 
    }elseif ($key != 'edit'){ 
     // Keep all key/values, except 'edit' 
     $qs .= $key . '=' . urlencode($value) . '&'; 
    } 
} 
2

एक अन्य समाधान भी &amp; समस्याओं से बचने के !!!

remove_query('http://example.com/?a=valueWith**&amp;**inside&b=value'); 

कोड:

function remove_query($url, $which_argument=false){ 
    return preg_replace('/'. ($which_argument ? '(\&|)'.$which_argument.'(\=(.*?)((?=&(?!amp\;))|$)|(.*?)\b)' : '(\?.*)').'/i' , '', $url); 
} 
संबंधित मुद्दे