Php $\u服务器未返回查询字符串
我只是尝试将用户正在查看的当前页面存储在数据库中。当页面加载时,我插入Php $\u服务器未返回查询字符串,php,query-string,Php,Query String,我只是尝试将用户正在查看的当前页面存储在数据库中。当页面加载时,我插入$\u服务器['REQUEST\u URI']$_服务器['QUERY_STRING']进入我的数据库,但只有页面(例如index.php?)显示,没有查询字符串(我已验证URL中有查询字符串) 我尝试了$\u服务器['PHP\u SELF'],结果相同 编辑以添加: 下面是$\u服务器的转储: Array ( . . . [REQUEST_METHOD] => GET [QUERY_STRING
$\u服务器['REQUEST\u URI']$_服务器['QUERY_STRING']
进入我的数据库,但只有页面(例如index.php?
)显示,没有查询字符串(我已验证URL中有查询字符串)
我尝试了$\u服务器['PHP\u SELF']
,结果相同
编辑以添加:
下面是$\u服务器的转储:
Array
(
. . .
[REQUEST_METHOD] => GET
[QUERY_STRING] => view=scores&yr=2010&wk=1
[REQUEST_URI] => /index.php?view=scores&yr=2010&wk=1
. . .
)
因此,查询字符串存在于数组中,甚至作为请求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数据库是否可能除去?
之外的所有输入?字段是varchar
使用部分解决方案更新:将SQL输入更改为仅$\u服务器['QUERY\u STRING']
(无请求\u URI)成功输入查询字符串。因此,它让我相信PHP或MySQL在?
之后从输入字符串中剥离了所有内容。因此,输入参数是正确的;结果被截断了
有人知道为什么会这样吗?不同的服务器将不同的
$\u服务器
全局文件传递到页面。我假设您使用的是Apache而不是NGINX,您可能需要检查FASTCGI_参数中是否定义了QUERY_STRING
解决方案是按照@hakre所说的做,只需看看哪个$\u服务器密钥具有您想要的内容
<?php
print '<pre>';
print_r($_SERVER);
print '</pre>';
您不能直接使用$\u服务器['REQUEST\u URI']
?它将查询字符串作为输出的一部分…您能否向我们展示表的定义clickstream
如果页面列只有10个字符长,那么我们发现了问题:)
“index.php?”(10个字符)
要查看表结构,可以发出以下MySQL命令:
感谢您的反馈,尤其是@nachito。问题已经被隔离到MySQL,而不是PHP。PHP的输出是正确的,但MySQL在插入数据库后会从URL中剥离所有内容。您测试过什么是var\u转储($\u服务器)
必须提供?有趣的是,您是否检查了.htaccess的存在?另外请注意,POST请求通常不附带查询字符串。(否则这是一个不太可能出现的错误,因为CGI规范规定了GET请求的参数。)@mario这是一个GET请求,我验证请求是否通过,因为没有它,正确的页面将无法加载。:)您使用的是框架还是任何其他重定向?请参阅原始问题的补充。您应该使用mysql\u查询(“插入到clickstream(user\u id,page)值(((int)$\u SESSION['user\u id']。,'”)。mysql\u real\u escape\u string($\u SERVER['REQUEST\u URI'])。“;”)或die($mysql错误:'.mysql\u error())
为了避免SQL注入您是对的,由于值本身的故障排除,我忽略了这一步。您的编辑说只添加$\u服务器['QUERY\u STRING']
有效,只添加$\u服务器['REQUEST\u URI']
也有效吗?不。数据库中的结果在?
之后会被删除(例如:。“index.php?”而不是“index.php?query=string&bla=yada”)。请参阅对原始问题的补充。@praguian,我刚刚检查过,您需要在应用程序发生错误之前停止正在执行的任何操作。我更新了代码以转义SQL查询的输入值,以避免SQL注入。这已经在我的代码的其他地方完成。不过,感谢您的提醒。页面
字段长度为200个字符,以避免此问题。:)
SHOW CREATE TABLE clickstream;