【问题标题】:How do I get all GET values from a URL? (Missing Values)如何从 URL 获取所有 GET 值? (缺失值)
【发布时间】:2019-12-28 04:34:46
【问题描述】:

我正在遍历 GET 值并且只获得 13 个值,无论我提交什么 URL。此外,它没有按顺序获取值...

当我循环时,我只得到 13 个值,以及当我在 $_GET 本身上使用 var_dump 时;即使有更多的值要检索。

这里是网址:

website.com/Questionaire.php?SurveyName=TV%20Quiz&SurveyType=MultipleChoice&Q1=选择%20a%20character%20off%20of%20Happy%20Days?&A1=Benny%20the%20bull&A2=The%20Fonz&A3=Jack%20Cracker&Q3=Favorite %20Friends%20character?&A1=Ross&A2=Monica&A4=Joey&A5=Rachel&A6=Chandler&A7=Phoebe&Q8=Favorite%20Nickelodeon%20show?&A1=Hey%20Arnold!&A2=Rugrats&A8=Ahhhhh!%20Real%20Montsters

这是我的结果:

SurveyName: TV Quiz

SurveyType: MultipleChoice

Q1: Choose a character off of Happy Days?

A1: Hey Arnold!

A2: Rugrats

A3: Jack Cracker

Q3: Favorite Friends character?

A4: Joey

A5: Rachel

A6: Chandler

A7: Phoebe

Q8: Favorite Nickelodeon show?

A8: Ahhhh! Real Montsters

如您所见,结果不是按顺序排列的,有些值甚至丢失了。

var_dump($_GET);

foreach ($_GET as $key => $value) { 
    echo $key.": ".$value."<br/>\n";
}

我期待这些结果:

SurveyName=TV Quiz

SurveyType=MultipleChoice

Q1=Choose a character off of Happy Days?

A1=Benny the bull //<- missed

A2=The Fonz //<- missed

A3=Jack Cracker

Q3=Favorite Friends character?

A1=Ross //<- missed

A2=Monica //<- missed

A4=Joey

A5=Rachel

A6=Chandler

A7=Phoebe

Q8=Favorite Nickelodeon show?

A1=Hey Arnold!

A2=Rugrats

A8=Ahhhh! Real Montsters

【问题讨论】:

  • 你知道查询字符串中有多个A1...这是不正确的。
  • 你到底为什么要通过 URL 传递所有这些数据?

标签: php get query-string


【解决方案1】:

您的查询字符串中不能有相同的参数名称,否则最后一个值将覆盖以前的值。您需要有唯一的答案名称,否则您将丢失数据。您可以想象 PHP 使用以下伪代码将参数添加到 $_GET

foreach($param as $key=>$val) {
    $_GET[$key] = $val;
}

因此,参数按照它们在请求中首次出现的顺序出现。所以查询字符串?A=1&amp;B=2&amp;A=3&amp;C=4将首先出现A,然后是B,最后是C。相同参数的最后一个值是使用的那个,因此我们得到以下$_GET 结果:

array(
    'A'=>3,
    'B'=>2,
    'C'=>4
);

考虑添加问题标识符作为每个答案的前缀。例如,用Q1A1Q2A1 代替A1。这将确保您的数据不会被覆盖。

【讨论】:

  • 天哪,我不敢相信我没有早点抓住它,天哪……谢谢你指出这一点!
  • @Christhemist 没问题!有时你只需要一双新鲜的眼睛。编码时很容易获得隧道视野:)
  • 请注意,如果您使用方括号作为数组表示法,您的查询字符串中可以有多个重复的键。 ?Q1=Question one&amp;Q1A[]=Answer One&amp;Q1A[]Answer Two
  • @GrumpyCrouton 只是为了详细说明您的观点以避免其他读者混淆:通过添加方括号,将参数视为数组并添加新元素。没有方括号意味着参数被视为原始值并发生简单的赋值。简而言之,就是数组压入操作和变量赋值操作的区别。
  • @B.Fleming 谢谢你的扩展,我觉得你说的比我要清楚得多。
【解决方案2】:

我建议对查询字符串参数名称使用数组表示法,以便保持顺序。比如:

?SurveyName=TV Quiz
&SurveyType=MultipleChoice
&Q[1]=Choose a character off of Happy Days?
&A[1][1]=Benny the bull
&A[1][2]=The Fonz
&A[1][3]=Jack Cracker
&Q[3]=Favorite Friends character?
&A[3][1]=Ross
&A[3][2]=Monica
&A[3][4]=Joey
&A[3][5]=Rachel
&A[3][6]=Chandler
&A[3][7]=Phoebe
&Q[8]=Favorite Nickelodeon show?
&A[8][1]=Hey Arnold!
&A[8][2]=Rugrats
&A[8][8]=Ahhhh! Real Montsters

当你这样命名查询字符串参数时,PHP 会将它们解析为数组:

array(4) {
  ["SurveyName"]=>
  string(7) "TV Quiz"
  ["SurveyType"]=>
  string(14) "MultipleChoice"
  ["Q"]=>
  array(3) {
    [1]=>
    string(37) "Choose a character off of Happy Days?"
    [3]=>
    string(27) "Favorite Friends character?"
    [8]=>
    string(26) "Favorite Nickelodeon show?"
  }
  ["A"]=>
  array(3) {
    [1]=>
    array(3) {
      [1]=>
      string(14) "Benny the bull"
      [2]=>
      string(8) "The Fonz"
      [3]=>
      string(12) "Jack Cracker"
    }
    [3]=>
    array(6) {
      [1]=>
      string(4) "Ross"
      [2]=>
      string(6) "Monica"
      [4]=>
      string(4) "Joey"
      [5]=>
      string(6) "Rachel"
      [6]=>
      string(8) "Chandler"
      [7]=>
      string(6) "Phoebe"
    }
    [8]=>
    array(3) {
      [1]=>
      string(11) "Hey Arnold!"
      [2]=>
      string(7) "Rugrats"
      [8]=>
      string(21) "Ahhhh! Real Montsters"
    }
  }
}

【讨论】:

  • @Christhemist 虽然我的回答是指出您的问题的原因,但请考虑将此处提到的方法用于您的实际代码。到目前为止,有序数组方法更容易处理。
猜你喜欢
  • 2014-06-17
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多