php - 如何使用SELECT INTO OUTFILE写入/tmp以外的目录?

标签 php mysql into-outfile

我正在尝试使用 SELECT INTO OUTFILE 将文件写入另一个目录中的自定义目录,该目录比我的文档根目录高一级。我可以写入/tmp,这样我就知道其他一切都正常。

我使用的是文件的绝对完整路径。我可以使用 PHP 创建目录并 chmod 到 0777。目录已成功创建,模式已正确设置(通过 SSH 和 FTP 查看)。

我想使用的路径示例:

/var/www/vhosts/mysite/private_www/data_export/newdir/

我原以为只要目录是全局可读/可写/可执行的,MySQL就能够写入它。但我仍然收到此错误。

Can't create/write to file (Errcode: 13)

我发现了很多关于此错误的帖子,但除了写入/tmp之外没有其他解决方案。但是,如果我写入/tmp,我必须添加更多代码来处理文件名,然后将文件复制到我想要的位置。

我认为 MySQL 可能需要与 PHP 不同的路径。有没有办法检查 MySQL 将什么视为服务器根目录?但是,我不确定这可能是问题,因为我能够使用相同的路径加载数据内文件。

我的设置

  • CentOS 6
  • PHP 5.3
  • MySQL 5.5
  • 带有 Plesk 控制面板的专用服务器
  • PHP 作为 Apache 模块运行

我错过了什么?

最佳答案

尽管您已正确设置目标目录的可写权限,但为了让用户能够遍历目录树进入该目标目录,您必须为该用户提供对每个更高目录的执行权限进入你的目标目录。这是因为在目录上下文中,执行实际上意味着查看内部以列出内容

这意味着路径中每个目录的最小值(忽略所有者/组权限)

/var/www/vhosts/mysite/private_www/data_export

将是0751,其中最后的1是“其他”用户类别的执行权限。因此,请验证目标路径中的每个目录至少都具有 MySQL 服务器用户(可能是 CentOS 系统中的 mysql)的执行权限。

允许在所有这些目录上执行(列表内容)确实意味着任何系统用户都可以检查它们,而不仅仅是 MySQL 用户。在决定最终路径时请考虑这一点。如果可以的话,您可能希望将其与 www 文件分开。

在您的设置中,您已将目标目录设置为0777,世界可读,世界可写。如果可以避免的话,这是不可取的。由于 MySQL 确实需要能够对其进行写入,因此请考虑将其组所有权更改为 mysql 组。这将使您能够避免使其全局可写。

# Give group ownership to mysql
chown :mysql /var/www/vhosts/mysite/private_www/data_export/newdir
# And just make it writable by the group, not everyone
chmod 0770 /var/www/vhosts/mysite/private_www/data_export/newdir

关于php - 如何使用SELECT INTO OUTFILE写入/tmp以外的目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20479662/

相关文章:

php - 数据被提交到一个表而不是另一个(PHP)

php - 如何调试 Silex Framework 中的 php fatal error

使用 "IN"子句的 MySql JOIN 多个表

mysql - 多个查询,还是嵌套?

c++ - 将奇怪的符号打印到输出文件,C++

mysql - 使用 Zend 选择进入 outfile 时访问被拒绝错误

javascript - 为什么 PHP strlen() 和 Javascript xxx.length 不相等?

php - 无法从函数 mysqli_connect() 获得响应

php - 使用 yajra 数据表作为服务器端数据表