2013-02-13 37 views
6

我正在設計一個Web應用程序,可以根據最終用戶來自哪個零售位置進行定製。例如,如果用戶來自稱爲Farmer's Market的商店,那麼可能會爲該用戶提供特定於該特定商店的定製內容或額外鏈接。 file_exists()用於確定是否存在需要導入的頁面的任何自定義部分。file_exists()期望參數1是一個有效的路徑,給出的字符串

到目前爲止,我們一直使用一種相對不安全的方法,其中項目ID#和商店被簡單地作爲GET參數傳入,並且系統知道將它們應用於頁面中的每個鏈接。但是,我們切換到可逆散列方法,其中存儲和項目編號被加密(看起來像「gd651hd8h41dg0h81」),並且頁面簡單地解碼它們並分配存儲和ID變量。

然而,自那時起,我們一直在遇到一個錯誤,谷歌搜索廣泛沒有找到我的答案。有代碼的幾個類似的塊,但他們都看起來像這樣:

$buttons_first = "../stores/" . $store . "/buttons_first.php"; 

if(file_exists($buttons_first)) 
{ 
    include($buttons_first); 
} 

(在/專賣店/目錄實際上是在一個工作的上級目錄,因此../)

相當直截了當。但是,儘管在常規的ID和存儲傳入做工精細,使用加密ID拋出這個錯誤對那些類似的語句中的每一個:

警告:file_exists()預計參數1是一個有效的路徑,串在第11行[網址刪除]給出

我已經有腳本吐回完整的URL,它似乎是正確地分配$存儲。我正在運行PHP 5.4.11 1 & 1託管(因爲我知道他們的服務器工作方式有些異常),如果有幫助的話。

+0

你能提供一個路徑失敗的例子嗎? – Raad 2013-02-13 15:36:00

+0

'var_dump($ store)'的結果是什麼?也許它包含將構成無效路徑的保留字符('?','*'等)。 [以下是可能保留的字符列表](http://en.wikipedia.org/wiki/File_name#Reserved_characters_and_words)。 – cmbuckley 2013-02-13 15:39:38

+0

「../stores/shoprite/buttons_first.php」是我玩的一個。 在這種情況下,var_dump($ store)會導致** string(28)「shoprite」**。 – Sean 2013-02-13 15:43:35

回答

0

添加/前門店/,你最好使用絕對路徑關閉...

+0

仍然得到相同的錯誤,它實際上原來是這樣,我想改變它,希望能解決這個問題。 – Sean 2013-02-13 15:38:05

+0

我相信在你的全局配置文件中包含應用程序絕對路徑的值會爲你節省很多麻煩.. – phpalix 2013-02-13 15:39:45

1

,因爲它取決於你在哪裏運行該腳本可能與路徑的問題。使用絕對路徑更安全。要獲取執行當前腳本的目錄的路徑,可以使用dirname(__FILE__)

+0

如果你使用PHP 5.3或更高版本,使用'__DIR__'而不是'dirname(__ FILE __)'' – SDC 2013-02-13 15:48:59

+0

已經嘗試過了,還有$ _SERVER ['DOCUMENT_ROOT'] – Sean 2013-02-13 15:55:16

2

運行一個var_dump(strpos($ buttons_first,「\ 0」)),出於安全原因,當路徑有一個空字節時會出現此警告。如果這不起作用,請檢查字符串的長度並確保它是您所期望的,以防萬一還有其他不可見的字節。

11

我之前同樣的錯誤,但你需要刪除「\ 0」試圖取代它,我不知道我的這個解決方案適用於您的問題:

$cleaned = strval(str_replace("\0", "", $buttons_first)); 

它的工作對我來說, 。

+0

非常感謝!這個對我有用! – GeekHades 2017-06-06 09:26:33

相關問題