سؤال

لدي نموذجان للبحث، أحدهما يحتوي على 50 حقلًا والآخر يحتوي على 100 حقل تقريبًا.عادةً، كما تنص مواصفات HTML، أقوم بإجراء عمليات بحث باستخدام طريقة GET حيث لا يتم تغيير أي بيانات.لم أواجه هذه المشكلة بعد، ولكنني أتساءل عما إذا كانت مساحة عنوان URL ستنفد قريبًا؟

الحد من متصفح الانترنت هو 2083 حرفا.المتصفحات الأخرى، لديها حد أعلى بكثير.أنا أقوم بتشغيل Apache، لذا فإن الحد الأقصى هو حوالي 4000 حرف، بينما IIS هو 16384 حرفًا.

عند وجود 100 حقل، لنفترض أن متوسط ​​طول اسم الحقل يبلغ 10 أحرف، فهذا يعني بالفعل 5000 حرف... وهو أمر مذهل في نموذج الحقل المكون من 100 حقل، ولم أواجه أية أخطاء حتى الآن.(25% من الحقول عبارة عن تحديدات متعددة، وبالتالي فإن طول الحقل أطول بكثير.)

لذلك، أنا أتساءل ما هي خياراتي.(تقصير النماذج ليس خيارًا.) إليك أفكاري:

  • استخدم البريد.لا يعجبني هذا كثيرًا لأنه في الوقت الحالي يمكن للمستخدمين وضع إشارة مرجعية على عمليات البحث الخاصة بهم وتنفيذها مرة أخرى لاحقًا - وهي ميزة رائعة حقًا.
  • اطلب من JavaScript تكرار النموذج لتحديد الحقول المختلفة عن الحقول الافتراضية، وملء نموذج آخر وإرساله.سيقوم المستخدم بالطبع بوضع إشارة مرجعية على النسخة المختصرة.

هل هناك أي أفكار أخرى؟

أيضًا، هل يعرف أحد ما إذا كان الطول هو الطول المشفر أم مجرد نص عادي؟

أقوم بالتطوير في لغة PHP، ولكن ربما لا يحدث ذلك فرقًا.

يحرر: لا أستطيع إزالة أية حقول؛لا أستطيع تقصير النموذج.هذا هو ما طلبه العميل وغالبًا ما يستخدم مجموعة من الحقول في فئات مختلفة.أعلم أنه من الصعب التفكير في نموذج يبدو جميلًا مع هذه الحقول العديدة، لكن المستخدمين ليس لديهم مشكلة في فهم كيفية عمله.

هل كانت مفيدة؟

المحلول

هل سيستخدم المستخدمون بالفعل جميع الحقول التي يتراوح عددها بين 50 و100 لإجراء عمليات البحث الخاصة بهم؟إذا كانوا يستخدمون القليل فقط، فلماذا لا ينشرون البحث إلى صفحة "بينية" حيث يعيد الرأس () توجيههم إلى صفحة النتائج مع الحقول التي قام المستخدم بتغييرها في عنوان URL فقط؟ستستخدم صفحة النتائج بعد ذلك القيم الافتراضية للحقول غير الموجودة في عنوان URL.

نصائح أخرى

للإجابة على سؤالك بشكل غير مباشر، إذا واجهت نموذجًا مكونًا من 100 حقل لملءه في صفحة واحدة، فمن المرجح أن أغلق المتصفح الخاص بي، يبدو ذلك بمثابة سهولة استخدام كاملة كابوس.

جوابي هو، إذا كان هناك خطر سأقترب منه في أي مكان بالقرب من هذا الحد طبيعي باستخدام النموذج، ربما أفعل ذلك بشكل خاطئ.

حسب الأفضلية سأفعل

  1. قم بتقسيم النموذج واستخدم بعض الاحتفاظ بالحالة من جانب الخادم
  2. قم بالتبديل إلى POST، ثم قم بإنشاء وإعادة التوجيه إلى عنوان URL أقصر على POST والذي يؤدي إلى نفس النتيجة
  3. يستسلم ؛)

لقد ذكرت في تعليق أن العديد من الحقول "مخفية ويمكن فتحها حسب الحاجة".

إذا كنت على استعداد لتجاهل التدهور السلس، فيمكنك دائمًا إضافة الحقول وإزالتها من النموذج، بدلاً من مجرد إخفائها وإظهارها:لن يرسل المتصفح العناصر غير المضمنة في النموذج.

هذا هو البديل من نماذج "التصنيع والنموذج" التي يتم التأمين عليها عبر الإنترنت وما إلى ذلك.استخدام الصفحات - حدد الطراز وأرسله مرة أخرى إلى الخادم واحصل على قائمة النماذج الخاصة بتلك الشركة المصنعة.

إذا كنت لا تمانع في استخدام جافا سكريبت، فيمكنك جعلها تعمل على تحديد طول سلسلة الاستعلام، وإذا كانت طويلة جدًا، فانتقل إلى منشور.ثم احصل على نوع من مخطط URL للسماح لهم بوضع إشارة مرجعية على عمليات البحث المنشورة هذه.

استخدم النشر وإذا قام المستخدم بوضع إشارة مرجعية على البحث، فاحفظه في قاعدة بيانات وامنحه رمزًا مميزًا فريدًا، ثم أعد التوجيه إلى صفحة البحث باستخدام GET وتمرير الرمز المميز كمعلمة.

TinyURL هو مثال جيد:تمنحه عنوان URL طويلًا جدًا، ويحفظه في قاعدة بيانات، ويمنحك معرفًا فريدًا لعنوان URL هذا ويمكنك لاحقًا طلب عنوان URL الطويل باستخدام هذا المعرف.

في 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)');
?>

أيضا ، هل يعرف أي شخص ما إذا كان الطول هو الطول المشفر أم مجرد نص عادي؟

كان تخميني للطول المشفر.لقد قمت بإجراء اختبار بسيط:منطقة نصية وزر إرسال إلى برنامج نصي PHP مبسط.
تم تحميل الصفحة في IE6، ولصق بعض النصوص الفرنسية في منطقة النص، 2000 حرف.إذا ضغطت على زر الإرسال، لا شيء.اضطررت إلى تقليل طول النص حتى أتمكن من تقديمه.

بمعنى آخر، الحد الأقصى لعدد الأحرف وهو 2083 هو بالضبط الحد الأقصى لطول عنوان URL الموجود في شريط العناوين بعد إرسال طلب GET.

سأختار حل JavaScript:عند الإرسال، قم بتحليل النموذج، وإنشاء نموذج ثانوي باستخدام hidden الصفات، وتقديم ذلك.

بعض الاستراتيجيات لتقصير الناتج:

  • كما أشرت، يمكنك بالفعل تخطي كافة القيم المتبقية إلى الوضع الافتراضي (لا يوجد حقل، ولا قيمة).
  • إذا كان لديك نموذج مثل الذي في معالجة بحث المنتدى يمكنك تجميع كافة حالات خانة الاختيار في متغير واحد فقط، على سبيل المثال.باستخدام ترميز الحروف.
  • استخدم قصيرًا value الصفات (في select على سبيل المثال).

ملحوظة:إذا كانت صفحة البحث تتكون بالفعل من عدة نماذج مستقلة، حيث يقوم المستخدمون بملء قسم واحد فقط أو آخر، فيمكنك إنشاء عدة نماذج منفصلة.
قد لا ينطبق ذلك على حالتك وقد يبدو واضحًا ولكنه جدير بالذكر للسجل...^_^

يمكن للمرء أن ينظر فلسفيًا إلى إرسال البحث POST باعتباره إنشاء بحث محفوظ (خاصة عندما يكون البحث كائنًا معقدًا مثل الكائن الذي يقوم به المستخدمون).في هذه الحالة، يمكنك قبول المنشور لإنشاء بحث ثم إعادة التوجيه باستخدام GET لجلب نتائج البحث المناسبة (نشر/إعادة توجيه/حصول على).

سيسمح هذا أيضًا للمستخدمين بوضع إشارة مرجعية على نتائج البحث (GET) للعودة في أي وقت لإعادة تشغيل البحث.

يمكن أن يكون لـ Get ميزة واحدة إذا كان من الممكن مشاركة نتائج البحث الخاصة بك، في حالة طلب النشر إذا قمت بإرسال الرابط إلى شخص ما، فلن يرى هذا الشخص أي نتائج بحث

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top