【问题标题】:PHP add value to a existing query string [closed]PHP向现有查询字符串添加值[关闭]
【发布时间】:2014-08-03 14:42:46
【问题描述】:

问题来了:

我有一个完全基于查询字符串的页面,例如:

localhost\sandbox\hotsite.php?id=14665&open=hot_promocoes&titulo=127121

我正在为这个 CMS 开发一个分页功能,所以我想为我做一些事情:

localhost\sandbox\hotsite.php?id=14665&open=hot_promocoes&titulo=127121&pg=1

现在,我创建了一个获取整个 URL 并添加 pg=1 的代码,但是当我这样做并单击一些新页面链接(例如第 3 页)时,链接如下所示:

localhost\sandbox\hotsite.php?id=14665&open=hot_promocoes&titulo=127121&pg=1&pg=3.

当我点击页面链接时,它会永远重复(titulo=127121&pg=1&pg=3&pg=2&pg=4&pg=8&pg=9&pg=2&pg=3),当它发生时,我的分页代码会发疯,如果我继续点击我的代码就会发疯。我被困在这个问题上,我只是想不出办法。

附加信息:每个页面都有不同的结构,所以

  • 如果内容是照片,则链接如下所示:

    localhost\sandbox\hotsite.php?id=14665&open=hot_albums&titulo=127991

  • 如果内容是视频,则链接如下所示:

    localhost\sandbox\hotsite.php?id=14665&open=videos&album=1348&titulo=11121

所以我不能使用 php 的构建字符串函数构建任何东西,因为我确定的唯一查询字符串值是 id 值,它将在所有页面上,但其他页面不是恒定的。

所以,我需要你的帮助:)。

        // START OF FUNCTION
        function stringadd($query_text) {

            $query = $query_text;

                $pound = "";
                $poundPos = -1;

                    //Is there a #?
                    if ( ( $poundPos = strpos( $url_atual, "#" ) ) !== false )
                        {
                            $pound = substr( $url_atual, $poundPos );
                            $url_atual = substr( $url_atual, 0, $poundPos );
                        }

                $separator = (parse_url($url_atual, PHP_URL_QUERY) == NULL) ? '?' : '&';
                $url_atual .= $separator . $query . $pound;

          echo "".$url_atual;
        }
      // here is what i do to execute the function:



<?php echo stringadd('pg=').$total_paginas ;?>  

【问题讨论】:

  • 在继续之前,您必须了解 URL 使用斜杠而不是反斜杠。另外,您没有发布代码。
  • 我知道这是旧的,但用于遗留目的;只需使用:echo http_build_url($url_atual, array("query" =&gt; "pg=".$total_paginas), HTTP_URL_JOIN_QUERY);。但是您需要pecl install pecl_http 或通过composer 安装jakeasmith/http_build_url

标签: php query-string duplicate-removal


【解决方案1】:

parse_str 函数将为您提供来自查询字符串值的键值对数组。处理数组会使事情变得更干净,因为现有的键本质上会被覆盖而不是附加。

function setQueryString($url, $key, $val){
    $pUrl = parse_url($url);
    if(isset($pUrl['query']))
        parse_str($pUrl['query'], $pUrl['query']);
    else $pUrl['query'] = [];
    $pUrl['query'][$key] = $val;

    $scheme = isset($pUrl['scheme']) ? $pUrl['scheme'].'://' : '';
    $host = isset($pUrl['host']) ? $pUrl['host'] : '';
    $path = isset($pUrl['path']) ? $pUrl['path'] : '';
    $path = count($pUrl['query'])>0 ? $path.'?' : $path;

    return $scheme . $host . $path . http_build_query($pUrl['query']);
}

fiddle

【讨论】:

  • 我知道这是旧的,但用于遗留目的;只需使用:echo http_build_url($url, array("query" =&gt; $key."=".$val), HTTP_URL_JOIN_QUERY);。但是您需要pecl install pecl_http 或通过composer 安装jakeasmith/http_build_url
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多