GET 매개 변수를 추가하여 URL 문자열 조작
반복하지 않고 GET 매개 변수를 포함할 수도 있고 포함하지 않을 수도 있는 URL에 GET 매개 변수를 추가하고 싶다.?
또는&
.
예:
추가하고 싶은 경우category=action
$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
물음표가 발견되면 다시 물음표를 찍지 않으려고 하는 거 알아채시면 됩니다.
URL은 문자열일 뿐입니다.
특정 GET 파라미터를 추가하는 신뢰성 높은 방법은 무엇입니까?
기본 방법
$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';
}
고도의
$url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great';
$url_parts = parse_url($url);
// If URL doesn't have a query string.
if (isset($url_parts['query'])) { // Avoid 'Undefined index: query'
parse_str($url_parts['query'], $params);
} else {
$params = array();
}
$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'];
클래스는 아니더라도 적어도 함수에 넣어야 합니다.
다음은 승인된 답변의 간략한 버전입니다.
$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';
편집: 승인된 답변에서 설명한 바와 같이 이 오류는 확인되지 않는다는 점에서 발생합니다.category
는 이미 존재합니다.더 나은 해결책은 치료법일 것입니다$_GET
어레이와 같은 기능을 사용할 수 있습니다.in_array()
.
$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
이 함수는 기존 인수를 덮어씁니다.
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 ) );
}
기존 매개 변수를 업데이트하는 예제입니다.
또한 url_encode가 사용되며 파라미터 값을 지정하지 않을 수 있습니다.
<?
/**
* 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;
}
strpos를 사용하여 를 검출합니다.?는 쿼리 문자열의 선두에 있는 URL에만 표시할 수 있으므로 get param이 이미 존재하는지 알고 &를 사용하여 param을 추가해야 합니다.
function addGetParamToUrl(&$url, $varName, $value)
{
// is there already an ?
if (strpos($url, "?"))
{
$url .= "&" . $varName . "=" . $value;
}
else
{
$url .= "?" . $varName . "=" . $value;
}
}
<?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";
/**
* @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;
}
$parameters = array();
foreach ($get as $key => $value)
{
$parameters[] = $key.'='.$value;
}
$url = 'http://example.com/movies?'.implode('&', $parameters);
원라이너:
$url .= (strpos($url, '?') ? '&' : '?') . http_build_query($additionalParams);
사용.http_build_query
특수 문자(스페이스 또는 스페이스 등)를 인코딩하기 때문에 권장됩니다.@
(이메일 주소)
2022년 버전 개선
이를 통해 기존 파라미터를 대체할 수 있으며 기존 URL fragment(다음 부분)도 유지됩니다.#
(URL 끝)
function addParametersToUrl(string $url, array $newParams): string
{
$url = parse_url($url);
parse_str($url['query'] ?? '', $existingParams);
$newQuery = array_merge($existingParams, $newParams);
$newUrl = $url['scheme'] . '://' . $url['host'] . ($url['path'] ?? '');
if ($newQuery) {
$newUrl .= '?' . http_build_query($newQuery);
}
if (isset($url['fragment'])) {
$newUrl .= '#' . $url['fragment'];
}
return $newUrl;
}
테스트:
$newParams = [
'newKey' => 'newValue',
'existingKey' => 'new',
];
echo addParametersToUrl('https://www.example.com', $newParams);
// https://www.example.com?newKey=newValue&existingKey=new
echo addParametersToUrl('https://www.example.com/', $newParams);
// https://www.example.com/dir/?newKey=newValue&existingKey=new
echo addParametersToUrl('https://www.example.com/dir/', $newParams);
// https://www.example.com/dir/?newKey=newValue&existingKey=new
echo addParametersToUrl('https://www.example.com/dir/file?foo=bar', $newParams);
// https://www.example.com/dir/file?foo=bar&newKey=newValue&existingKey=new
echo addParametersToUrl('https://www.example.com/dir/file?foo=bar&existingKey=old', $newParams);
// https://www.example.com/dir/file?foo=bar&existingKey=new&newKey=newValue
echo addParametersToUrl('https://www.example.com/dir/file?foo=bar&existingKey=old#hash', $newParams);
// https://www.example.com/dir/file?foo=bar&existingKey=new&newKey=newValue#hash
echo addParametersToUrl('https://www.example.com/dir/file#hash', $newParams);
// https://www.example.com/dir/file?newKey=newValue&existingKey=new#hash
echo addParametersToUrl('https://www.example.com/dir/file?foo=bar#hash', $newParams);
// https://www.example.com/dir/file?foo=bar&newKey=newValue&existingKey=new#hash
이런 식으로 하는 게 좋을 것 같아요.
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;
이 주제에 대해 많은 자원/응답자를 검색한 후, 나는 나만의 코드를 만들기로 결정했다.여기에 있는 @TaylorOtwell의 답변을 바탕으로 $_GET 요청을 처리하고 각 요소를 수정/조작합니다.
url이 http://domain.com/category/page.php?a=b&x=y이라고 가정하고 정렬을 위한 파라미터는 ?desc=column_name 또는 ?asc=column_name 중 하나뿐입니다.이렇게 하면 단일 URL 파라미터로 정렬과 오더를 동시에 수행할 수 있습니다.따라서 연관된 테이블의 헤더 행을 처음 클릭하면 URL은 http://domain.com/category/page.php?a=b&x=y&desc=column_name이 됩니다.
그런 다음 첫 번째 클릭 시 DESC를 정렬하고 같은 제목의 두 번째 클릭 시 ASC를 정렬합니다.(첫 번째 클릭 시 ORDER BY column DESC가 먼저) 정렬되지 않은 경우 기본적으로는 "날짜 후 ID"로 정렬됩니다.
각 $_GET 컴포넌트에 클리닝/필터링 기능을 추가하는 것과 같이, 한층 더 개선할 수 있습니다만, 아래의 구조는 기반이 됩니다.
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, '&');}
(http://domain.com부터 시작하는 풀 URL에는 $_SERVER[SCRIPT_URI]를 사용할 수 있습니다.)
그 후 MySQL 쿼리에서 위의 결과 $ORDER를 사용합니다.
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
이전 정렬(및 순서부여) 파라미터가 있는지 URL을 확인하고 순서에 따라 "?" 또는 "&"를 사용하여 URL에 정렬(및 순서부여) 파라미터를 추가합니다.
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";
}
}
}
마지막으로 다음 함수를 사용하기 위한 테이블 행 머리글입니다.
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
개요: URL을 읽고 각 $_GET 컴포넌트를 변경하여 "?"와 "&"의 올바른 형식의 파라미터로 최종 URL을 작성합니다.
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;
}
또 다른 향상된 기능 버전입니다.기존의 답변과 약간의 개선(포트 지원)과 버그 수정(키 확인)이 혼재되어 있습니다.
/**
* @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;
}
URL 파라미터를 추가하려면 이 기능을 사용해 보십시오.
그런 다음 URL 파라미터가 중복되지 않도록 파라미터가 설정되어 있을 때 링크를 디세블로 할 수 있습니다.
<?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>
WordPress를 사용하는 경우 간단히 사용할 수 있습니다.
add_query_args(['sort' => 'asc'], 'http:/example.com/?search=news')
문서 https://developer.wordpress.org/reference/functions/add_query_arg/
언급URL : https://stackoverflow.com/questions/5809774/manipulate-a-url-string-by-adding-get-parameters
'source' 카테고리의 다른 글
"The object was not found"를 의미하는 표준 Java 예외 클래스가 있습니까? (0) | 2022.11.25 |
---|---|
유사한 태그를 가진 SQL 게시물 선택 (0) | 2022.11.25 |
실행으로 데이터 조작 문을 발행할 수 없습니다.쿼리() (0) | 2022.11.25 |
날짜 범위 비교 (0) | 2022.11.25 |
임시 테이블 mariadb에 결과 삽입 (0) | 2022.11.05 |