2011-03-29 24 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(); 
     } 
    } 
}