PHP chmod函数失效及unlink报错问题求助
解决cPanel中PHP删除文件的两个报错问题
咱们先逐个拆解你遇到的错误,再给出针对性的修复方案:
1. chmod(): No such file or directory 错误
这个问题的核心是你用错了文件路径。从数据库取出的SUBSTR(materialLink, 27)得到的是网站的相对路径(比如/uploads/lesson.pdf),但chmod需要的是服务器本地的绝对文件路径(比如/home/edutopia/public_html/uploads/lesson.pdf)。
你可以用$_SERVER['DOCUMENT_ROOT']来自动拼接网站根目录,它会直接指向cPanel中你的网站根目录(也就是/home/edutopia/public_html/),这样就能得到正确的本地路径。
2. unlink(): Unable to locate stream wrapper 错误
这个报错是因为你把$oldFile改成了https://www.edutopia.co.ke开头的URL,但unlink函数只能操作本地文件系统里的文件,根本不能直接删除HTTP/HTTPS链接指向的资源,必须用本地文件路径才行。
修复后的完整代码
<?php // 先从数据库获取文件相对路径 $result = mysql_query("SELECT SUBSTR(`materialLink`, 27) FROM `documents` WHERE `iddocuments` = '$iddoc'"); $relativePath = mysql_result($result, 0); // 转换为服务器本地绝对路径 $localFilePath = $_SERVER['DOCUMENT_ROOT'] . $relativePath; // 先检查文件是否存在,再执行权限修改 if (file_exists($localFilePath)) { chmod($localFilePath, 0777); // 注意:0777是八进制值,不需要用octdec转换 } else { echo "<script>alert('要删除的文件不存在');</script>"; } if(isset($_POST['Fild'])){ $msg1 = '<script type="text/javascript">alert("File successfully deleted");</script>'; $msg2 = '<script type="text/javascript">alert("There was an error deleting that file.");</script>'; $tFile= $_POST['Fild']; // 先执行数据库记录删除 $delFile = "DELETE FROM `documents` WHERE `iddocuments`='$tFile'"; $dbDeleteSuccess = mysql_query($delFile); // 只有数据库删除成功且文件存在时,再删除本地文件 if ($dbDeleteSuccess && file_exists($localFilePath)) { unlink($localFilePath); echo $msg1; } else { echo $msg2; } } ?>
额外的重要提醒
- 废弃函数风险:你现在用的
mysql_*系列函数早就被PHP废弃了,PHP7及以上版本完全移除了这些函数,建议尽快迁移到mysqli_*或者PDO,避免后续网站崩溃。 - SQL注入漏洞:代码里直接把
$iddoc和$_POST['Fild']拼进SQL语句,存在严重的SQL注入风险,一定要用预处理语句(mysqli/PDO的prepare+execute)来处理用户输入。 - 权限安全问题:给文件设置
0777权限非常不安全,建议目录用0755、文件用0644,只保留必要的读写权限,防止被恶意利用。
内容的提问来源于stack exchange,提问作者Enabla
相关产品推荐
相关产品推荐

