【问题标题】:PHP is_writable error returns not writablePHP is_writable 错误返回不可写
【发布时间】:2013-12-12 22:34:23
【问题描述】:

我有这个代码

if(is_writable($destination)){ 
  print "destination is writable"; 
}
else { 
 print "destination is not writable"; 
}

$destination 是像../subdir/dir/currectDir/ 这样的相对路径,我已经检查过,权限是 777,但上面的代码返回“目标不可写”,我不明白为什么。有人能帮我吗?谢谢

【问题讨论】:

  • 问题已解决,我必须通过 ISP 而不是通过 FTP 更改权限...

标签: php permissions directory


【解决方案1】:

除了权限之外,目录不可写的原因有很多。其中一些是:

  • 由于 open_basedir 限制,该目录位于 PHP 能够写入的路径之外
  • 目录位于以只读方式挂载的驱动器上
  • 目录设置了不可变或仅附加属性
  • 文件系统损坏

但是,在这种情况下,我的猜测是您使用的路径不正确。尝试运行

echo getcwd();

就在您的 is_writable() 调用之前。

它会告诉你 PHP 脚本正在运行的当前目录,从那里你应该能够计算出正确的相对路径。并不是说如果从命令行运行 PHP 脚本,它的路径将是当前目录的路径,而通过诸如 Apache 之类的 Web 服务器运行,它通常是 public_html 或 httpdocs 目录。它也可能在脚本执行的早期被更改。

您还可以指定绝对路径(例如 /home/youruser/public_html/subdir/dir/currectDir)

【讨论】:

  • 谢谢克里斯的回答,现在我有另一个问题,我必须这样做:“if(@move_uploaded_file($tempNameFile, $destination.$FileName)) { ... }else{ print "UPLOADING ERROR"; }" 尽管 $destination 是一个可写目录,但它返回 "UPLOADING ERROR"。
  • echo $tempNameFileecho $destination.$FileName 以确保它们是正确的。还要检查 PHP error_log 文件以查看是否有任何更具体的错误或警告。网上也有很多例子或者用PHP处理文件上传。
  • "$tempNameFile" 和 "$destination.$FileName" 是正确的。对不起,我的经验不足,但我找不到“PHP错误日志”
  • 创建一个名为 phpinfo.php 的空 php 脚本并将其放入 <?php phpinfo(); ?>,然后在浏览器中查看它,搜索“error_log”,它会告诉你日志在哪里。确保在代码上线之前删除 phpinfo.php 文件!
【解决方案2】:

我无法发表评论,所以我必须在这里回复,但看起来路径(您发布的是相对路径,而不是绝对路径)不正确 - 您尝试过吗

var_dump(file_exists($destination));

首先,确定您是否正在为您的目录寻找正确的位置?

【讨论】:

  • 感谢您的回答并对我的错误表示歉意。路径是正确的,我必须这样做: "if(@move_uploaded_file($tempNameFile, $destination.$FileName)) { ... }else{ print "UPLOADING ERROR"; } " 如果我​​使用可写目录,它返回“上传错误”。对不起,如果我在这里也犯了一些错误。
  • 这真的是在上面答案的 cmets 中的评论。但我又不能添加 cmets 所以我必须在这里做!在您执行此操作之前,请按照 Chris Wheeler 的建议检查 PHP error_log。从函数调用中删除 @ 符号,因为这是一个错误抑制器,这意味着即使调用失败也不会产生错误。
  • 如果服务器上没有错误日志,请尝试将以下代码添加到项目根目录中的 .htaccess 文件中,以将错误输出到浏览器:php_flag display_startup_errors on php_flag display_errors on php_flag html_errors on php_flag log_errors on
  • 对不起,我不明白我必须做什么:(
  • 在您的项目根目录中,如果您有一个名为 .htaccess 的文件,请在其中添加以下行 php_flag display_startup_errors on php_flag display_errors on php_flag html_errors on php_flag log_errors on(以 'on' 结尾的每一行都应该在一个新行上,这将设置php 配置以在浏览器中显示错误),然后从 move_uploaded_file 函数调用中删除 @ 符号,然后尝试再次运行脚本 - 当您尝试移动上传的文件时收到的任何错误都应显示在浏览器中
猜你喜欢
  • 2015-06-03
  • 2012-06-29
  • 1970-01-01
  • 2012-09-07
  • 2015-03-16
  • 2019-07-21
  • 2011-09-30
  • 2011-01-28
  • 2015-03-18
相关资源
最近更新 更多