Вам необходимо удалить предыдущее значение из строки запроса, например ::
preg_replace('/¤tpage=\\d+/', '', $_SERVER["QUERY_STRING"]);
вместо просто $_SERVER["QUERY_STRING"]
.
Я предпочитаю использовать такой класс для манипулирования строкой запроса:
final class QueryString
{
private $data;
private function __construct($start=null) {
if ($start === null)
$this->data = $_GET;
elseif (!is_array($start))
throw new InvalidArgumentException();
}
public function __isset($nm) {
return isset($this->data[$nm]);
}
public function __unset($nm) {
unset($this->data[$nm]);
}
public function __get($nm) {
return isset($this->data[$nm])?$this->data[$nm]:"";
}
public function __set($nm, $val) {
$this->data[$nm] = $val;
}
public function getString() {
return $this->getStringInternal(false);
}
public function getStringHTML() {
return $this->getStringInternal(true);
}
public function __toString() {
return $this->getString();
}
private function getStringInternal($HTML=false) {
if (empty($this->data))
return "";
$res = "?";
foreach ($this->data as $k => $v) {
if (!is_array($v)) {
if ($v === "")
$res .= urlencode($k).'&';
else
$res .= urlencode($k)."=".urlencode($v).'&';
}
else
foreach ($v as $vv) {
$res .= urlencode($k)."[]=".urlencode($vv).'&';
}
}
$res = substr($res,0,-1);
if ($HTML)
$res = htmlspecialchars($res);
return $res;
}
}
Тогда я могу просто сделать:
$qs = new QueryString();
$qs->currentpage = 7;
$url = "list.php" . $qs;
Он сохранит все предыдущие параметры, создаст «текущую страницу», если она не существует, и изменит ее, если она существует.
Примечание: вы можете заменить цикл getStringInternal на http_build_query
, если хотите. Мне не нравится поведение http_build_query
, когда ключ имеет несколько значений; Я предпочитаю «a = 1 & a = 2» вместо «a [0] = 1 & a [1] = 2», а оригинал не добавил «[]» к ключу; однако PHP не очень хорошо поддерживает множественные значения без скобок в ключе (я должен вручную анализировать строку запроса), веб-сервисы Java, с которыми я иногда взаимодействую, делают).