【问题标题】:$_SERVER not returning query string$_SERVER 不返回查询字符串
【发布时间】:2011-09-28 17:01:44
【问题描述】:

我只是想将用户正在查看的当前页面存储在数据库中。当页面加载时,我将$_SERVER['REQUEST_URI'] . $_SERVER['QUERY_STRING'] 插入到我的数据库中,但只显示页面(例如index.php?),没有查询字符串(我已验证 URL 中有查询字符串)。

我尝试了$_SERVER['PHP_SELF'],结果相同。

编辑添加: 这是 $_SERVER 的转储:

Array
(
    . . .
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => view=scores&yr=2010&wk=1
    [REQUEST_URI] => /index.php?view=scores&yr=2010&wk=1
    . . .
)

所以查询字符串存在于数组中,甚至作为 REQUEST_URI 的一部分。所以我的查询...

mysql_query("insert into clickstream
               (user_id, page)
             values
               (" . $_SESSION['user_id'] . ", '" . mysql_real_escape_string($_SERVER['REQUEST_URI']) . mysql_real_escape_string($_SERVER['QUERY_STRING']) . "');")
  or die('mysql error: ' . mysql_error());

...实际上应该插入两次查询字符串,而不是一次!

想法?

补充思想:MySQL DB 是否有可能从输入中删除 ? 之外的所有内容?该字段是 varchar。

使用部分解决方案更新: 将 SQL 输入更改为 只是 $_SERVER['QUERY_STRING'](没有 REQUEST_URI)成功输入了查询字符串。因此,它让我相信 PHP 或 MySQL 正在? 之后的输入字符串中剥离所有内容。所以输入参数是正确的;结果刚刚被截断。

有人知道为什么会这样吗?

【问题讨论】:

  • 您测试过var_dump($_SERVER); 提供的功能吗?
  • 有趣,您检查过 .htaccess 的存在吗?
  • 另请注意,POST 请求通常不带有QUERY_STRING。 (否则这是一个不太可能出现的错误,因为 CGI 规范规定它存在于带参数的 GET 请求中。)
  • @mario 这是一个 GET 请求,我验证该请求正在通过,因为没有它,正确的页面将无法加载。 :)
  • 您使用的是框架还是其他重定向?

标签: php query-string


【解决方案1】:

不同的服务器将不同的$_SERVER 全局变量传递给页面。我假设您使用的是 Apache 而不是 NGINX,您可能需要检查 QUERY_STRING 是否在 FASTCGI_PARAMS 中定义。

解决方案是像@hakre 所说的那样做,看看哪个 $_SERVER 键有你想要的。

<?php
print '<pre>';
print_r($_SERVER);
print '</pre>';

【讨论】:

  • 查看对原始问题的补充。
  • 我更新了代码以转义 SQL 查询的输入值以避免 SQL 注入。这已经在我的代码中的其他地方完成了。不过感谢您的提醒。
【解决方案2】:

你不能只使用$_SERVER['REQUEST_URI'] 吗?它将查询字符串作为输出的一部分...

【讨论】:

  • 查看对原始问题的补充。
  • 你应该使用mysql_query("insert into clickstream (user_id, page) values (" . (int)$_SESSION['user_id'] . ", '" . mysql_real_escape_string($_SERVER['REQUEST_URI']) . "');") or die('mysql error: ' . mysql_error());来避免SQL注入
  • 你说得对,由于值本身的故障排除,我忽略了这一步。
  • 您的编辑说添加 just $_SERVER['QUERY_STRING'] 有效,添加 just $_SERVER['REQUEST_URI'] 也有效吗?
  • 没有。数据库中的结果被删除? 之后的所有内容(例如“index.php?”而不是“index.php?query=string&bla=yada”)。
【解决方案3】:

感谢您的反馈,尤其是@nachito。该问题已被隔离到 MySQL,而不是 PHP。 PHP 的输出是正确的,但 MySQL 在将 ? 插入数据库后会从 URL 中删除所有内容。

【讨论】:

    【解决方案4】:

    你能告诉我们clickstream表的定义吗?

    如果 page 列只有 10 个字符长,那么我们就发现了问题 :)

    'index.php?' (10 个字符)

    要查看表结构,您可以发出以下 MySQL 命令:

    SHOW CREATE TABLE clickstream;
    

    【讨论】:

    • page 字段的长度为 200 个字符,以避免这个问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2014-05-19
    • 2021-02-19
    相关资源
    最近更新 更多