2009-09-19 7 views
0

Je crée des pagages pour certaines données. Par exemple, j'ai une page:PHP - url-address pour send-script

http://example.com/news.php?type=bla&smth=bla 

Il y a j'ai une liste de nouvelles avec des liens vers d'autres pages. Lien vers la première page:

 
http://example.com/news.php?type=bla&smth=bla&page=1 

est le script ici, ce qui crée des liens de pages:

print '<a href="?'.$_SERVER['QUERY_STRING'].'&page=1"><<</a>'; 

Mais après avoir cliqué sur à une autre page l'URL du lien est très grand et il ressemble à:

http://example.com/news.php?type=bla&smth=bla&page=1&page=2&page=1&page=3 

Comment puis-je changer cela?

Répondre

6

Vous ajoutez juste la nouvelle paremeter aux anciens, mais vous ne remplacez pas si elles existent déjà. Vous avez donc besoin plutôt de fusionner l'ancienne chaîne de requête avec la nouvelle:

// either by merging both arrays 
$query = array_merge($_GET, array('page'=>1)); 
// or by the union of both 
$query = array('page'=>1) + $_GET; 
// or by altering the array 
$query = $_GET; 
$query['page'] = 1; 

Et PHP ne dispose déjà d'un http_build_str qui peut vous construire une chaîne de requête à partir d'un tableau associatif:

print '<a href="?' . htmlspecialchars(http_build_str($query)) . '">&lt;&lt;</a>'; 

Modifier Voici une autre définition de http_build_str:

if (!function_exists('http_build_str')) { 
    function http_build_str($query, $prefix='', $arg_separator='') { 
     if (!is_array($query)) { 
      return null; 
     } 
     if ($arg_separator == '') { 
      $arg_separator = ini_get('arg_separator.output'); 
     } 
     $args = array(); 
     foreach ($query as $key => $val) { 
      $name = $prefix.$key; 
      if (!is_numeric($name)) { 
       $args[] = rawurlencode($name).'='.urlencode($val); 
      } 
     } 
     return implode($arg_separator, $args); 
    } 
} 
+0

Hm ... Appel à la fonction indéfinie http_build_str() Pourquoi? – Ockonal

+0

exigence pour http_build_str() - PECL pecl_http> = 0.23.0 – mauris

+0

Existe-t-il une fonction comme http_build_str? Ou puis-je faire fonctionner votre code d'une autre manière? – Ockonal

0

Chaque fois que vous exécutez ce script, un paramètre de page est ajouté à la chaîne de requête. Par exemple, lorsque vous arrivez à la première page de la chaîne de requête sera:

http://site.com/news.php?type=bla&smth=bla 

et quand vous arrivez à la page à la chaîne de requête sera

http://site.com/news.php?type=bla&smth=bla&page=1 

et ainsi de suite pour la page de tout le monde que vous allez à.

Je suggérerais plutôt d'écrire une fonction qui prend les paramètres d'un tableau et les formate comme une chaîne de requête, puis les modifie si nécessaire.

donc quelque chose le long des lignes de:

<?php 

$parameters = array(
    'type' => 'bla', 
    'smth' => 'bla', 
    'page' => 1, // Of course, logic up front to change the value of this 
); 

print print '<a href="?' . format_url_parameters($parameters) .'>Link</a>'; 

// format_url_parameters producing a valid query string here 
+0

Je comprends mon problème, mais je ne savais pas, comment le réparer. Maintenant, je comprends et j'ai quelques idées. Je vous remercie. – Ockonal

-1

Vous pouvez également utiliser simplement

print '<a href="http://'. $_SERVER["HTTP_HOST"] . $_SERVER['REQUEST_URI'].'?page=1"><<</a>'; 

cela génère une URL absolue à chaque fois.

1

Le plus simple est de faire ce qui suit:

$params = $_GET;  // make a copy of the querystring params 
$params['page'] = 1; // will replace any existing 'page' parameter 
echo '<a href="?'.http_build_query($params)'">Page 1</a>'; 
1

L'alternative http_build_str ne gère pas des réseaux internes, à cet effet, je suggère ce qui suit:

function http_build_str_inner($query, $prefix, $arg_separator,&$args) { 
    if (!is_array($query)) { 
     return null; 
    } 
    foreach ($query as $key => $val) { 
     $name = $prefix."[".$key."]"; 
     if (!is_numeric($name)) { 
      if(is_array($val)){ 
       http_build_str_inner($val,$name,$arg_separator,$args); 
      }else{ 
       $args[] = rawurlencode($name).'='.urlencode($val); 
      } 
     } 
    } 
} 

function http_build_str($query, $prefix='', $arg_separator='') { 
    if (!is_array($query)) { 
     return null; 
    } 
    if ($arg_separator == '') { 
     $arg_separator = ini_get('arg_separator.output'); 
    } 
    $args = array(); 
    foreach ($query as $key => $val) { 
     $name = $prefix.$key; 
     if (!is_numeric($name)) { 
      if(is_array($val)){ 
       http_build_str_inner($val,$name,$arg_separator,$args); 
      }else{ 
       $args[] = rawurlencode($name).'='.urlencode($val); 
      } 
     } 
    } 
    return implode($arg_separator, $args); 
} 

Profitez ...