2008-11-18 6 views
27

मेरे पास कुछ खोज फ़ॉर्म हैं, 1 ~ 50 फ़ील्ड के साथ और दूसरा ~ 100 के साथ। आमतौर पर, जैसा कि एचटीएमएल स्पेक कहता है, मैं जीईटी विधि का उपयोग करके खोज करता हूं क्योंकि कोई डेटा नहीं बदला जाता है। मैंने अभी तक इस समस्या में भाग नहीं लिया है, लेकिन मुझे आश्चर्य है कि क्या मैं जल्द ही यूआरएल स्पेस से बाहर हो जाऊंगा?एक खोज फ़ॉर्म के लिए GET या POST का उपयोग करें

Internet Explorer की सीमा 2083 वर्ण है। अन्य ब्राउज़रों में much higher limit है। मैं अपाचे चला रहा हूं, इसलिए सीमा 4000 वर्ण है, जो आईआईएस 16384 वर्ण है।

100 फ़ील्ड पर, औसत फ़ील्ड नाम की लंबाई 10 अक्षरों का कहना है, जो पहले से ही 5000 वर्ण हैं ... 100 फ़ील्ड फॉर्म पर अद्भुत है, मुझे अभी तक कोई त्रुटि नहीं है। (फ़ील्ड का 25% एकाधिक चयन हैं, इसलिए फ़ील्ड की लंबाई बहुत अधिक है।)

तो, मुझे आश्चर्य है कि मेरे विकल्प क्या हैं।

  • उपयोग पोस्ट: यहाँ मेरे विचारों (रूपों छोटा एक विकल्प नहीं है।)। मुझे यह बहुत पसंद नहीं है क्योंकि फिलहाल उपयोगकर्ता अपनी खोजों को बुकमार्क कर सकते हैं और बाद में उन्हें निष्पादित कर सकते हैं - वास्तव में एक बहुत अच्छी सुविधा है।
  • यह निर्धारित करने के लिए फॉर्म के माध्यम से जावास्क्रिप्ट लूप है कि कौन से फ़ील्ड डिफ़ॉल्ट से अलग हैं, एक और फॉर्म पॉप्युलेट करें और उसे सबमिट करें। उपयोगकर्ता निश्चित रूप से संक्षिप्त संस्करण बुकमार्क करेगा।

कोई अन्य विचार?

इसके अलावा, क्या किसी को पता है कि लंबाई एन्कोडेड लंबाई या सिर्फ सादा पाठ है या नहीं?

मैं PHP में विकास कर रहा हूं, लेकिन शायद यह कोई फर्क नहीं पड़ता है।

संपादित करें: मैं किसी भी फ़ील्ड को हटाने में असमर्थ हूं; मैं फॉर्म को छोटा करने में असमर्थ हूं। क्लाइंट ने यही पूछा है और वे अक्सर विभिन्न श्रेणियों में फ़ील्ड की एक श्रृंखला का उपयोग करते हैं। मुझे पता है कि इस फार्म के बारे में सोचना मुश्किल है जो इस कई क्षेत्रों के साथ अच्छा दिखता है, लेकिन उपयोगकर्ताओं को यह समझने में कोई समस्या नहीं है कि यह कैसे काम करता है।

उत्तर

6

क्या आपके उपयोगकर्ता वास्तव में अपनी खोज करने के लिए सभी 50-100 फ़ील्ड का उपयोग करने जा रहे हैं? यदि वे केवल कुछ का उपयोग कर रहे हैं, तो खोजशब्द को "बीच में" पृष्ठ पर पोस्ट क्यों न करें, जो हेडर() - उन्हें परिणाम पृष्ठ पर रीडायरेक्ट करता है केवल यूआरएल में उपयोगकर्ता द्वारा बदला गया फ़ील्ड? परिणाम पृष्ठ तब उन फ़ील्ड के लिए डिफ़ॉल्ट मानों का उपयोग करेगा जो URL में मौजूद नहीं हैं।

+1

आप इस विधि चुनते हैं, तो सुनिश्चित हो नहीं देखेंगे ब्राउज़र को जीईटी के साथ पुनर्निर्देशित अनुरोध लाने के लिए, पोस्ट से "303 अन्य देखें" प्रतिक्रिया वापस करने के लिए। अन्यथा, यह पुनर्निर्देशित यूआरएल में एक पोस्ट करने का प्रयास कर सकता है। –

2

परोक्ष रूप से आपके प्रश्न को हल करने के लिए, अगर मैं एक 100 क्षेत्र प्रपत्र एक पृष्ठ पर में भरने के साथ सामना करना पड़ा था, मैं सबसे अधिक संभावना अपना ब्राउज़र बंद करना चाहते हैं, यह एक पूरी प्रयोज्य बुरा सपना तरह लगता है।

मेरा जवाब है, वहाँ एक खतरा यह है कि मैं, मैं शायद यह गलत कर रहा हूँ फार्म के सामान्य उपयोग के लिए है कि सीमा के पास कहीं भी हो रही है कि अगर है।

वरीयता के क्रम में, मैं

  1. स्प्लिट पत्र और
  2. स्विच पोस्ट करने के लिए कुछ सर्वर-साइड स्थिति बनाए रखने का प्रयोग करेंगे, और फिर पैदा करते हैं और कि का संकल्प लिया पोस्ट पर एक छोटा URL पर रीडायरेक्ट एक ही परिणाम
  3. अप दें;)
+0

ठीक है, 3 चीजें: (1) उपयोगकर्ता एक समय में सभी 100 फ़ील्ड नहीं देखते हैं। वे छिपे हुए हैं और आवश्यकतानुसार खोले जा सकते हैं। (2) यह एक खोज क्षेत्र है जिसे लोगों को पता है कि कैसे उपयोग करें - यह 100 फ़ील्ड पंजीकरण फॉर्म नहीं है। (3) खेतों से निपटना वास्तव में आसान है क्योंकि मैंने कोड को बहुत अनुकूलित किया है! –

2

आप एक टिप्पणी है कि क्षेत्रों में से कई "छिपे हुए हैं और के रूप में आवश्यक खोला जा सकता है" में उल्लेख है।

यदि आप सुंदर गिरावट को त्यागने के इच्छुक हैं, तो आप हमेशा छिपाने और उन्हें दिखाने के बजाय फ़ॉर्म से खेतों को जोड़ और निकाल सकते हैं: ब्राउज़र उन फ़ॉर्म को सबमिट नहीं करेगा जो फ़ॉर्म में शामिल नहीं हैं । मेकअप का चयन करें, सर्वर पर प्रस्तुत करे तथा निर्माता के लिए मॉडल की सूची प्राप्त -

यह "बनाओ और मॉडल" रूपों है कि ऑनलाइन बीमा आदि पृष्ठों का उपयोग का एक प्रकार है।

+0

हां ... जब मैंने पहली बार देखा कि फॉर्म के रूप में (दृश्यमान) फ़ील्ड का सेट बदलता है क्योंकि उपयोगकर्ता इसके माध्यम से जाता है, तो मेरा तत्काल विचार "आवश्यकतानुसार फ़ील्ड जोड़ने के लिए AJAX (या समान) का उपयोग करता था"। प्रारंभिक पृष्ठ लोड पर आपको उन सभी को शॉटगन करने की आवश्यकता नहीं है। –

+0

दुर्भाग्यवश, केवल कुछ फ़ील्ड को छिपाने/दिखाने के लिए बहुत कठिन होगा, क्योंकि ऐसे क्षेत्र हो सकते हैं जहां वे नहीं देख सकें कि उनमें मूल्य हैं (लेकिन उन्हें अंग्रेजी स्ट्रिंग द्वारा दर्शाया जाता है) क्योंकि वे अपनी पिछली खोज में जोड़ रहे हैं। –

+0

संकेत: ब्राउज़र अक्षम फ़ील्ड सबमिट नहीं करते हैं। – Tom

2

आप जावास्क्रिप्ट का उपयोग कर तो आप इसके क्वेरी स्ट्रिंग की लंबाई से काम करते हैं और अगर यह बहुत लंबा है तो एक पोस्ट करने के लिए स्विच कर सकता था कोई आपत्ति नहीं है। फिर इन पोस्ट की गई खोजों को बुकमार्क करने की अनुमति देने के लिए कुछ प्रकार का यूआरएल मैपर है।

1

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

TinyURL एक अच्छा उदाहरण है: आप इसे एक बहुत लंबा यूआरएल देते हैं, यह इसे डीबी में सहेजता है, आपको उस यूआरएल के लिए एक अद्वितीय पहचानकर्ता देता है और बाद में आप उस पहचानकर्ता का उपयोग करके लंबे यूआरएल का अनुरोध कर सकते हैं।

PHP में यह की तर्ज पर कुछ होगा:

<?php 
if (isset($_GET['token'])) 
{ 
    $token = addslashes($_GET['token']); 
    $qry = mysql_query("SELECT fields FROM searches WHERE token = '{$token}'"); 
    if ($row = mysql_fetch_assoc($qry)) 
    { 
     performSearch(unserialize($row['fields'])); 
     exit; 
    } 
    showError('Your saved search has been removed because it hasn\'t been used in a while'); 
    exit; 
} 
$fields = addslashes(serialize($_POST)); 
$token = sha1($_SERVER['REMOTE_ADDR'].rand()); 
mysql_query("INSERT INTO searches (token, fields, save_time) Values ('{$token}', '{$fields}', NOW())"); 
header('Location: ?token='.$token); 
exit; 
?> 

और एक स्क्रिप्ट दैनिक चलाएँ:

<?php 
mysql_query('DELETE FROM searches WHERE save_time < DATE_ADD(NOW(), INTERVAL -200 DAY)'); 
?> 
+1

एक विचार, हालांकि डेटाबेस पक्ष में जोड़ सकता है - शायद एक दिन में कुछ हज़ार रिकॉर्ड और मुझे नहीं लगता कि मैं उन्हें कभी भी हटा सकता हूं। सिस्टम पर कुछ "परियोजनाएं" 5+ साल के लिए सक्रिय हैं और शायद 10 अन्य के लिए सक्रिय होंगी ... –

+0

ठीक है, हर बार पूछे जाने पर save_time अपडेट करें। और जब तक आप 50,000,000 से अधिक रिकॉर्ड से निपट नहीं रहे हैं, तो इस बारे में चिंता करने की कोई बात नहीं है कि आपने टोकन कॉलम पर एक इंडेक्स डाला है या नहीं। – Tom

1

इसके अलावा, अगर लंबाई इनकोडिंग लंबाई है किसी को पता है या सिर्फ सादा पाठ?

मेरा अनुमान है एन्कोडेड लंबाई के लिए किया गया था। मैंने एक साधारण परीक्षण किया: एक textarea और एक सरल PHP स्क्रिप्ट के लिए सबमिट बटन।
IE6 में पेज लोड किया गया, पाठ क्षेत्र में 2000 वर्ण में कुछ फ्रेंच पाठ चिपकाया। अगर मैं सबमिट बटन दबाता हूं, कुछ भी नहीं। सबमिट करने में सक्षम होने के लिए मुझे टेक्स्ट की लंबाई कम करना पड़ा।

दूसरे शब्दों में, 2083 अक्षरों की सीमा वास्तव में URL प्राप्त अनुरोध सबमिट करने के बाद पता पट्टी में पाया की अधिकतम लंबाई है।

मैं जावास्क्रिप्ट समाधान के लिए जाना होगा: सबमिट पर, फॉर्म का विश्लेषण करें, hidden विशेषताओं के साथ एक माध्यमिक रूप बनाएं, और सबमिट करें।

उत्पादन को कम करने पर कुछ रणनीतियों:

  • आप बाहर बिंदु के रूप में, आप पहले से ही छोड़ सकते हैं सब सामान्य मानों पर छोड़ दिया (कोई क्षेत्र, कोई मूल्य नहीं)।
  • यदि आपके पास Processing forum search पर एक जैसा फॉर्म है तो आप सभी चेकबॉक्स राज्यों को केवल एक चर में समूहित कर सकते हैं, उदाहरण के लिए। अक्षर एन्कोडिंग का उपयोग कर।
  • उदाहरण के लिए value विशेषताओं का उपयोग करें (उदाहरण के लिए select में)।

नोट: यदि खोज पृष्ठ वास्तव में कई स्वतंत्र रूपों से बना है, जहां उपयोगकर्ता केवल एक सेक्शन या दूसरे को भरते हैं, तो आप कई अलग-अलग रूप बना सकते हैं।
आपके मामले पर लागू नहीं हो सकता है और रिकॉर्ड के लिए उल्लेखनीय लग सकता है ...^_^

0

कोई भी सहेजी गई खोज के निर्माण के रूप में खोज सबमिशन POST पर दार्शनिक रूप से देख सकता है (विशेष रूप से जब कोई खोज होती है एक वस्तु के रूप में जटिल है जितना आपके उपयोगकर्ता बना रहे हैं)। इस मामले में, आप एक खोज के निर्माण के लिए पोस्ट स्वीकार कर सकते हैं और फिर उचित खोज परिणामों (पोस्ट/रीडायरेक्ट/प्राप्त) लाने के लिए जीईटी का उपयोग करके रीडायरेक्ट कर सकते हैं।

यह उपयोगकर्ताओं को खोज परिणामों को फिर से चलाने के लिए किसी भी समय वापस आने के लिए खोज परिणामों (जीईटी) को बुकमार्क करने की अनुमति देगा।

0

प्राप्त एक लाभ हो सकता है अपने खोज परिणामों को पोस्ट अनुरोध के मामले में, साझा किया जा सकता है, तो अगर आप किसी के लिए लिंक भेजने के लिए, उस व्यक्ति के किसी भी खोज परिणाम

संबंधित मुद्दे