Ich möchte GET-Parameter zu URLs hinzufügen, die GET-Parameter enthalten können und nicht, ohne ?
oder &
zu wiederholen.
Beispiel:
Wenn ich category=action
hinzufügen möchte
$url="http://www.acme.com";
// will add ?category=action at the end
$url="http://www.acme.com/movies?sort=popular";
// will add &category=action at the end
Wenn Sie feststellen, versuche ich, das Fragezeichen nicht zu wiederholen, wenn es gefunden wurde.
Die URL ist nur eine Zeichenfolge.
Was ist ein zuverlässiger Weg, um einen bestimmten GET-Parameter anzufügen?
Grundmethode
$query = parse_url($url, PHP_URL_QUERY);
// Returns a string if the URL has parameters or NULL if not
if ($query) {
$url .= '&category=1';
} else {
$url .= '?category=1';
}
Fortgeschrittener
$url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great';
$url_parts = parse_url($url);
parse_str($url_parts['query'], $params);
$params['category'] = 2; // Overwrite if exists
$params['tags'][] = 'cool'; // Allows multiple values
// Note that this will url_encode all values
$url_parts['query'] = http_build_query($params);
// If you have pecl_http
echo http_build_url($url_parts);
// If not
echo $url_parts['scheme'] . '://' . $url_parts['Host'] . $url_parts['path'] . '?' . $url_parts['query'];
Sie sollten dies zumindest in eine Funktion schreiben, wenn nicht in eine Klasse.
Hier ist eine kürzere Version der akzeptierten Antwort:
$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';
Bearbeiten: Wie in der akzeptierten Antwort besprochen, ist dies fehlerhaft, da nicht geprüft wird, ob category
bereits existiert. Eine bessere Lösung wäre, den $_GET
für das, was er ist - ein Array - zu behandeln und Funktionen wie in_array()
zu verwenden.
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
$queryString = http_build_query($data);
//$queryString = foo=bar&baz=boom&cow=milk&php=hypertext+processor
echo 'http://domain.com?'.$queryString;
//output: http://domain.com?foo=bar&baz=boom&cow=milk&php=hypertext+processor
Diese Funktion überschreibt ein vorhandenes Argument
function addToURL( $key, $value, $url) {
$info = parse_url( $url );
parse_str( $info['query'], $query );
return $info['scheme'] . '://' . $info['Host'] . $info['path'] . '?' . http_build_query( $query ? array_merge( $query, array($key => $value ) ) : array( $key => $value ) );
}
Verwenden Sie strpos , um ein? Zu erkennen. Schon seit ? kann nur in der URL am Anfang einer Abfragezeichenfolge angezeigt werden, Sie wissen, ob dort bereits Params vorhanden sind und Sie müssen Params mit & hinzufügen
function addGetParamToUrl(&$url, $varName, $value)
{
// is there already an ?
if (strpos($url, "?"))
{
$url .= "&" . $varName . "=" . $value;
}
else
{
$url .= "?" . $varName . "=" . $value;
}
}
Beispiel mit Aktualisierung vorhandener Parameter.
Außerdem wird url_encode verwendet und es ist nicht möglich, den Parameterwert .__ anzugeben.
<?
/**
* Add parameter to URL
* @param string $url
* @param string $key
* @param string $value
* @return string result URL
*/
function addToUrl($url, $key, $value = null) {
$query = parse_url($url, PHP_URL_QUERY);
if ($query) {
parse_str($query, $queryParams);
$queryParams[$key] = $value;
$url = str_replace("?$query", '?' . http_build_query($queryParams), $url);
} else {
$url .= '?' . urlencode($key) . '=' . urlencode($value);
}
return $url;
}
<?php
$url1 = '/test?a=4&b=3';
$url2 = 'www.baidu.com/test?a=4&b=3&try_count=1';
$url3 = 'http://www.baidu.com/test?a=4&b=3&try_count=2';
$url4 = '/test';
function add_or_update_params($url,$key,$value){
$a = parse_url($url);
$query = $a['query'] ? $a['query'] : '';
parse_str($query,$params);
$params[$key] = $value;
$query = http_build_query($params);
$result = '';
if($a['scheme']){
$result .= $a['scheme'] . ':';
}
if($a['Host']){
$result .= '//' . $a['Host'];
}
if($a['path']){
$result .= $a['path'];
}
if($query){
$result .= '?' . $query;
}
return $result;
}
echo add_or_update_params($url1,'try_count',1);
echo "\n";
echo add_or_update_params($url2,'try_count',2);
echo "\n";
echo add_or_update_params($url3,'try_count',3);
echo "\n";
echo add_or_update_params($url4,'try_count',4);
echo "\n";
Ich denke, du solltest so etwas tun.
class myURL {
protected $baseURL, $requestParameters;
public function __construct ($newURL) {
$this->baseurl = $newURL;
$this->requestParameters = array();
}
public function addParameter ($parameter) {
$this->requestParameters[] = $parameter;
}
public function __toString () {
return $this->baseurl.
( count($this->requestParameters) ?
'?'.implode('&', $this->requestParameters) :
''
);
}
}
$url1 = new myURL ('http://www.acme.com');
$url2 = new myURL ('http://www.acme.com');
$url2->addParameter('sort=popular');
$url2->addParameter('category=action');
$url1->addParameter('category=action');
echo $url1."\n".$url2;
$parameters = array();
foreach ($get as $key => $value)
{
$parameters[] = $key.'='.$value;
}
$url = 'http://example.com/movies?'.implode('&', $parameters);
/**
* @example addParamToUrl('/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
* @example addParamToUrl('//example.com/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
* @example addParamToUrl('https://example.com/path/to/?find=1&FILTER=Y', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
*
* @param $url string url
* @param array $addParams
*
* @return string
*/
function addParamToUrl($url, array $addParams) {
if (!is_array($addParams)) {
return $url;
}
$info = parse_url($url);
$query = array();
if ($info['query']) {
parse_str($info['query'], $query);
}
if (!is_array($query)) {
$query = array();
}
$params = array_merge($query, $addParams);
$result = '';
if ($info['scheme']) {
$result .= $info['scheme'] . ':';
}
if ($info['Host']) {
$result .= '//' . $info['Host'];
}
if ($info['path']) {
$result .= $info['path'];
}
if ($params) {
$result .= '?' . http_build_query($params);
}
return $result;
}
Nachdem ich zu diesem Thema viele Ressourcen/Antworten gesucht hatte, entschied ich mich, meine eigenen zu kodieren. Basierend auf der Antwort von @ TaylorOtwell hier verarbeite ich die eingehende $ _GET-Anfrage und modifiziere/manipuliere jedes Element.
Angenommen, die URL lautet: http://domain.com/category/page.php?a=b&x=y Und ich möchte nur einen Parameter zum Sortieren: Entweder? Desc = spaltenname oder? Asc = spaltenname . Auf diese Weise reicht ein einzelner URL-Parameter aus, um gleichzeitig zu sortieren und zu sortieren. Die URL lautet also http://domain.com/category/page.php?a=b&x=y&desc=column_name , wenn Sie auf die zugehörige Tabellenkopfzeile klicken.
Dann habe ich Tabellenzeilenüberschriften, die ich DESC beim ersten Klick sortieren möchte, und ASC beim zweiten Klick derselben Überschrift. (Jeder erste Klick sollte zuerst "ORDER BY-Spalte DESC" sein.) Wenn keine Sortierung erfolgt, wird standardmäßig nach "Datum, dann ID" sortiert.
Sie können es weiter verbessern, indem Sie jeder $ _GET-Komponente Reinigungs-/Filterfunktionen hinzufügen. Die untenstehende Struktur bildet jedoch die Grundlage.
foreach ($_GET AS $KEY => $VALUE){
if ($KEY == 'desc'){
$SORT = $VALUE;
$ORDER = "ORDER BY $VALUE DESC";
$URL_ORDER = $URL_ORDER . "&asc=$VALUE";
} elseif ($KEY == 'asc'){
$SORT = $VALUE;
$ORDER = "ORDER BY $VALUE ASC";
$URL_ORDER = $URL_ORDER . "&desc=$VALUE";
} else {
$URL_ORDER .= "&$KEY=$VALUE";
$URL .= "&$KEY=$VALUE";
}
}
if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';}
if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');}
if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}
(Sie können $ _SERVER [SCRIPT_URI] für die vollständige URL verwenden, die mit http://domain.com beginnt.)
Dann verwende ich die resultierende $ ORDER, die ich oben in der MySQL-Abfrage bekomme:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
Nun die Funktion zum Anzeigen der URL, wenn zuvor ein Sortierparameter (und Sortierparameter) mit "?" Hinzugefügt wurde. oder "&" entsprechend der Reihenfolge:
function sort_order ($_SORT){
global $SORT, $URL_ORDER, $URL;
if ($SORT == $_SORT){
return $URL_ORDER;
} else {
if (strpos($URL, '?') !== false){
return "$URL&desc=$_SORT";
} else {
return "$URL?desc=$_SORT";
}
}
}
Schließlich den Tabellenzeilenkopf, um die Funktion zu verwenden:
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
Zusammenfassung: Hiermit wird die URL gelesen, jede $ _GET-Komponente geändert und die endgültige URL mit Parametern Ihrer Wahl mit der korrekten Verwendungsform von "?" und "&"
Versuchen Sie diese Funktion, um URL-Parameter hinzuzufügen .
Dann können Sie die Verknüpfung deaktivieren, wenn der Parameter so festgelegt ist, dass keine doppelten URL-Parameter vorhanden sind.
<?php
function addQueryString($a)
{
if (empty($_SERVER['QUERY_STRING']))
return '?' . $a;
else if (!empty($_SERVER['QUERY_STRING']))
return '?' . $_SERVER['QUERY_STRING'] . '&' . $a;
}
?>
<a href="<?php echo addQueryString('lang=en'); ?>">test</a>
<a href="<?php echo addQueryString('category=5'); ?>">sat</a>
Ich denke, das ist was Sie suchen:
public function addGetParamToUrl($url, $params)
{
foreach ($params as $param) {
if (strpos($url, "?"))
{
$url .= "&" .http_build_query($param);
}
else
{
$url .= "?" .http_build_query($param);
}
}
return $url;
}
eine weitere verbesserte Funktionsversion. Mischung aus vorhandenen Antworten mit kleinen Verbesserungen (Port-Unterstützung) und Bugfixes (Schlüssel richtig prüfen).
/**
* @param string $url original url to modify - can be relative, partial etc
* @param array $paramsOverride associative array, can be empty
* @return string modified url
*/
protected function overrideUrlQueryParams($url, $paramsOverride){
if (!is_array($paramsOverride)){
return $url;
}
$url_parts = parse_url($url);
if (isset($url_parts['query'])) {
parse_str($url_parts['query'], $params);
} else {
$params = [];
}
$params = array_merge($params, $paramsOverride);
$res = '';
if(isset($url_parts['scheme'])) {
$res .= $url_parts['scheme'] . ':';
}
if(isset($url_parts['Host'])) {
$res .= '//' . $url_parts['Host'];
}
if(isset($url_parts['port'])) {
$res .= ':' . $url_parts['port'];
}
if (isset($url_parts['path'])) {
$res .= $url_parts['path'];
}
if (count($params) > 0) {
$res .= '?' . http_build_query($params);
}
return $res;
}