2013-10-10 46 views
0

我建立一個動態的網站,但網頁無法顯示,因爲錯誤的PHP錯誤函數名稱必須是一個字符串PHP

致命錯誤:函數名稱必須是一個字符串PHP

上線

$p= $_GET('p'); 

爲包括文件的整個代碼是

$folder = 'de/'; 
$folder = 'en/'; 
if(!empty($_GET['p'])){ 

$pages = scandir($folder,0); 
unset($pages[0],$pages[1]); 
$p= $_GET('p'); 
if(in_array($p.'.inc.php', $pages)){ 
include($folder.'/'.$p.'.inc.php'); 

}else{ 
echo 'error message'; 
} 
}else{ 
    include($folder.'home.inc.php');  
} 

我的代碼有什麼問題?

UPDATE

我已經更新了代碼,但現在我得到我的工作在本地服務器上的錯誤

*failed to open stream: No such file or directory* 

+0

你應該首先檢查'$ _GET'數組中是否存在'p'。 –

回答

1

您的代碼效率很低。爲什麼目錄的內容啜了到一個數組,然後搜索數組時,你可以簡單地有:

if (isset($_GET['p']) { 
    $file = $folder . $_GET['p'] .'.inc.php'; 
    if (is_readable($file)) { 
     include($file); 
    } else { 
     die('error'); 
    } 
} else { 
    include($folder.'home.inc.php');  
} 

這比你的令人費解的邏輯迄今爲止簡單。但是,它也容易受到完全相同的漏洞攻擊:您允許用戶指定服務器上任何知道路徑名的文件的完整路徑。根據您的設置,這可能允許用戶包含您曾經打算以這種方式執行的文件,並泄漏系統/配置的內部細節。

+0

我以爲我會確定一個.htaccess文件,但是你的代碼肯定會更好,無論如何,現在我得到一個錯誤,該目錄不存在,請看我的更新請 – Someone33

+0

.htaccess不能保護你,除非你列出你希望允許包含的每個VALID文件。 –

+0

與你的代碼我得到了語法錯誤的'{'brac在第一行。最後一個'['在同一行上應該是']',我試圖用你的代碼糾正它。但是第一行的'{'似乎是正確的。 – Someone33

6
$p= $_GET('p'); 

應該

$p= $_GET['p']; 
+0

現在我得到錯誤_failed打開流:沒有這樣的文件或目錄_,但爲什麼?目錄是否存在? – Someone33

+0

爲什麼你定義'$文件夾'兩次? – j08691

+0

因爲有兩個文件夾;每一種語言。 – Someone33

0
$p= $_GET('p'); 

你真的沒注意到你正在使用括號?

用途:

$p = $_GET['p']; 
+0

(Bah ...失去了一分鐘因爲愚蠢的驗證碼驗證...) – bwoebi

0

$p= $_GET('p');應該$p= $_GET['p'];

0

的錯誤似乎$ _GET( 'P')應爲$ _GET [ 'P']來代替。

幾個方面的考慮:

的如果,可以改變,如果(array_key_exists( 'P',$ _ GET)& &空($ _ GET(空($ _ GET [ 'P'])!)! ['p'])。PHP總是抱怨數組索引,並且它是防止它的一種好方法。

on unset($ pages [0],$ pages [1]);,如果數組沒有返回2個元素,它將返回null,並且PHP未設置函數將會投訴。更好的方法是檢查$ pages變量中是否有元素;

如果scandir沒有返回任何e lement,不知道它是否會返回null或數組,所以在這種情況下,如果(in_array($ p。'。inc.php',$ pages))會拋出一個錯誤。

乾杯

相關問題