سؤال

يحتوي أحد مواقعي على بعض وظائف الفرز المعقدة للغاية، أعلى ترقيم الصفحات، وتضاف المتغيرات المختلفة إلى عنوان URL معقد جدًا، وهو ما يمثل صعوبة كبيرة في إدارته.هل هناك طريقة لإدارة QUERY_STRING بكفاءة؟

ومن هذا انا اعني...إذا كان عنوان url هو Index.php?catid=3&sort=date&year=2009&page=2 وأرغب في انتقال المستخدم إلى الصفحة 3، أو تغيير طريقة الفرز.....كيف يمكنني الحفاظ على المتغيرات المتبقية دون التحقق من كل متغير فردي بشرط if/else وتكرارها في الرابط الذي قد يرتبط بالصفحة 3 أو طريقة الفرز البديلة.

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

المحلول

للتعامل مع الاستعلام الفعلي سلاسل (تنسيق السلسلة)، يمكنك استخدامه parse_str().عندما تريد إنشاء سلسلة استعلام، استخدم http_build_query().

هناك عدد غير قليل من الأمثلة على صفحات الوثائق تلك.

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

<?php
$QueryString = 'catid=3&sort=date&year=2009&page=2'; // sample querystring
parse_str($QueryString, $HttpQuery);

print_r($HttpQuery); // will be an associative array

$HttpQuery['page'] = 3; // change any values

$NewQueryString = http_build_query($HttpQuery); // rebuild the querystring

نصائح أخرى

وPHP وازم انت عالمي $ _GET التي تملك سلسلة الاستعلام الخاص بك كل تحليل لطيف إلى عناصر

$_GET['catid'] will be '3'
$_GET['sort'] will be 'date'
$_GET['year'] will be '2009'

وغيرها

هل يمكن إلغاء تعيين تلك التي لا تريد أن يمر على طول ثم الانتقال إلى رابط جديد عبر شيء من هذا القبيل:

$get = array_intersect_key($_GET, array_keys($_GET));
unset($get['sort']);
$url = 'target.php?' . http_build_query($get);

إذا كنت تعني أنك ترغب أن تصل إلى صفحة 3 سيكون فقط

index.php?page=3

وأو رابط لتغيير طريقة الفرز سيكون فقط

index.php?sort=date

وعملتم لتخزين المتغيرات الأخرى في متغيرات جلسة (أو ملفات تعريف الارتباط، إذا كنت تريد لها أن تستمر لفترة أطول).

وشيء من هذا القبيل:

<?php

  session_start();

  foreach($_GET as $var => $val) {
    // filter any malicious stuff and invalid variables out of $var and $val here
    // like
    if (in_array($var, $array_of_valid_variable_names)) {
      if ($var == 'page') $val = intval($val);

      $_SESSION[$var] = $val;
    }
  }

  // do stuff based on the values stored in $_SESSION

  echo '<a href="index.php?page='.($_SESSION['page'] + 1).'">Next page</a>';
?>

وعلى الرغم من أن معظم الحلول المقدمة هنا سوف أعمل، وأنا أعتقد أن الطريقة الأكثر بسيطة للقيام بذلك سيكون

// parse query string into an array
$queryData = array();
parse_str($_SERVER['QUERY_STRING'], $queryData);
/*
 * ... manipulate array $queryData
 */
// rebuild query string
$queryString = http_build_query($queryData, null, '&amp;'); // or use & if you don't need XHTML compliance

وهذا كل شيء. يرجى الاطلاع على وثائق على http_build_query() و <لأ href = "http://de2.php.net/manual /en/function.parse-str.php "يختلط =" نوفولو noreferrer "> parse_str() (وهذا هو واحد من تلك الوظائف التي تم افسدت completey حتى اسم - لا أحد يتوقع وظيفة لتفعل ما تفعله فقط من خلال النظر في الاسم).

ولقد كان لي نفس المشكلة بالضبط مع جنرال "بناء لي للفرز، الجدول القابلة للتجميع" الطبقة. هذا هو السبب في شخص اخترع subprocedures يسمى "وظائف" في بي.

لديك لإنشاء دالة الذي يعالج بالضبط عملية بناء وصلة. مثل ذلك:

/**
* $set: associative array of changing vars
* $unset : normal array of vars to delete
**/
function get_link($set,$unset=array())
{
 $set+=$_GET;
 if ($unset && is_array($unset))
   foreach($unset as $idx) 
      unset($set[$idx]);

 if ($set)
   foreach($set as $name=>$value)
      $pairs[]=$name.'='.urlencode($value);

 return $_SERVER['SCRIPT_NAME']."?".join('&',$pairs);
}

وCODE لم تختبر! استخدام عقلك

وأو هل يمكن استخدام $ _SESSION-فار لpageing والفرز (وهي "الاشياء) ولها صلات فقط تغيير تلك (وهو ما كنت تفعل في الغالب في الوقت الحاضر)

وإضافة اسم المتغير والقيمة في نهاية سلسلة الاستعلام (تغيير الصفحة ل3):

index.php?catid=3&sort=date&year=2009&page=2&x=page&y=3

وبعد ذلك، بعد استخراج $ _GET، واستخدام وظيفة بسيطة لمعرفة ما اذا كان يتم تعيين x و y.

إذا هم، تعيين المتغير الذي يرد في العاشر الى ذ قيمة الاسم.

ويمكنك استخدام نفس الرابط في كل مكان مع إضافة بسيطة في النهاية، وكمية من البرمجة هو الحد الأدنى.

ولا إدارة سلسلة مباشرة ولكن إدارة مجموعة (الرئيسية => قيمة) تمثيل منه، وإلا ترجمتها إلى سلسلة عند الحاجة.

واحد وسيلة ممكنة لفعل ذلك:

function explodeQueryString( $queryString )
{
    $parts = array();
    if ( strlen( $queryString ) > 1 && substr( $queryString, 0, 1 ) == '?' )
    {
        $q = explode( '&', substr( $queryString, 1 ) );
        foreach( $q as $part )
        {
            list( $key, $value ) = explode( '=', $part );
            $parts[ urldecode( $key ) ] = urldecode( $value );
        }
    }
    return $parts;
}

function implodeQueryString( array $arguments )
{
    $parts = array();
    foreach( $arguments as $key => $value )
    {
        $parts[ ] = sprintf( '%s=%s', urlencode( $key ), urlencode( $value ) );
    }
    return sprintf( '?%s', implode( '&', $parts ) );
}

// $query = $_GET;

$query = '?something=1&somethingelse=2&page=1&yetsomethingelse=3';

$q = explodeQueryString( $query );

print_r( $q );

$q[ 'page' ] += 1;

$query = implodeQueryString( $q );

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