2011-03-29 29 views
0
require("$_SERVER[DOCUMENT_ROOT]mysql.php"); 
$id = $_GET["id"]; 
$result = mysql_query("SELECT * FROM Setting WHERE ID = \"$id\""); 
$row = mysql_fetch_array($result); 
switch ($_GET["action"]) 
{ 
    case "update": 
    if (!unlink("$_SERVER[DOCUMENT_ROOT]setting/$row[Filename]")) 
    { 
     echo "Non è stato possibile cancellare il vecchio file."; 
     header("Refresh: 2.5; url=index.php"); 
     exit(); 
    } 

的錯誤是「警告目錄:取消鏈接(/網絡/ htdocs中/ WWW .vhannibal.net /家庭/設置/):是在一個目錄[...]上線43" ,第43行是警告:取消鏈接(/web/htdocs/www.vhannibal.net/home/setting/):在[...]

if (!unlink("$_SERVER[DOCUMENT_ROOT]setting/$row[Filename]")) 

這有什麼錯呢?

+0

如果你這樣做$ row的var_dump,是否設置了文件名?這可能是mysql查詢沒有返回結果。 – 2011-03-29 10:26:53

回答

1

$ row [Filename]中沒有任何數據或其空字符串。

+0

你仍然可以使用'$ row [Filename]'這不是問題你自己試一試,你會驚訝 – 2011-03-29 10:12:56

+1

@Shakti:檢查我的第一行。我不是說你必須使用$ row ['Filename'] ;,我說你應該使用$ row ['Filename']; – Gaurav 2011-03-29 10:14:13

+1

應該或必須 - 要麼會產生解析錯誤。 – 2011-03-29 10:16:19

2

首先,您應該考慮回到基礎知識並閱讀輸入驗證。

忽略了嚴重的mysql注入問題unlink()只能在文件上調用。在您的代碼中,在刪除之前,您不檢查$row['Filename']是否爲文件。

你可以做的最少的是檢查文件是否存在

if (is_file("$_SERVER[DOCUMENT_ROOT]setting/{$row['Filename']}")) { 
    //delete code 
} 
0

由於仍然沒有正確的答案我將它寫自己。

由於拉夫指出了這一點,你不檢查,如果MySQL查詢返回的數據
因此,你的代碼應該是(不過,我會寫串更通常的方式):

require($_SERVER['DOCUMENT_ROOT']."/mysql.php"); 
$sql = "SELECT * FROM Setting WHERE ID = ".intval($_GET["id"]); 
$res = mysql_query() or trigger_error(mysql_error().$sql); 
$row = mysql_fetch_array($result); 

if ($row) // <-- here it is! 
{ 
    switch ($_GET["action"]) 
    { 
     case "update": 
     if (!unlink($_SERVER['DOCUMENT_ROOT']."setting/".$row['Filename'])) 
     { 
      echo "Non è stato possibile cancellare il vecchio file."; 
      header("Refresh: 2.5; url=index.php"); 
      exit(); 
     } 
    } 
}