2011-09-28 137 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

相關問題