2011-09-28 95 views
4

我只是试图存储用户在数据库中查看的当前页面。当页面加载时,我将$_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。

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

有谁知道为什么这可能是这种情况?

+4

你测试过var_dump($ _ SERVER);'必须提供什么吗? – hakre

+0

有趣的是,您是否检查过.htaccess的存在? –

+0

另请注意,POST请求通常不会与'QUERY_STRING'一起提供。 (否则,这是一个不太可能的错误,因为CGI规范规定了它带有参数的GET请求。) – mario

回答

1

感谢您的反馈,特别是@nachito。这个问题已经被孤立到MySQL,而不是PHP。 PHP的输出是正确的,但是在插入数据库后,MySQL将剥离?之后的所有内容。

2

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

解决的办法就是像@hakre说的那样,只是看看哪个$ _SERVER键有你想要的。

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

请参阅原始问题的补充。 – hannebaumsaway

+0

@praguian,我刚刚检查了一下,你需要停止你正在做的事情[去看这个视频](http://videos.code2design.com/video/play/PHP/11) 。 – Xeoncross

+0

我更新了代码以避免SQL查询的输入值,以避免SQL注入。这已经在我的代码中的其他地方完成了。尽管感谢您的领导。 – hannebaumsaway

1

难道你只是使用$_SERVER['REQUEST_URI']?它具有查询字符串作为输出的一部分...

+0

请参阅原始问题的补充。 – hannebaumsaway

+3

您应该使用'mysql_query(“insert into clickstream(user_id,page)values(”。(int)$ _ SESSION ['user_id']。“,'”。mysql_real_escape_string($ _ SERVER ['REQUEST_URI'])。'') ;“)或死('mysql error:'。mysql_error());'以避免SQL注入 – nachito

+0

你是对的,我忽略了这一步,因为这些值本身的故障排除。 – hannebaumsaway

0

您能告诉我们表clickstream的定义

如果页面栏只有10个字符长的话,我们已经发现了问题:)

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

要看到表结构,你可以发出此MySQL命令:

SHOW CREATE TABLE clickstream; 
+0

'page'字段的长度为200个字符以避免这种情况问题。 :) – hannebaumsaway

相关问题