MySQL LOAD_FILE返回NULL

8
我正在执行以下命令:SELECT LOAD_FILE("/home/user/domains/example.com/public_html/robots.txt") AS tmp FROM tmpTable,但返回值为NULL。我如何检查是否因为我没有FILE权限或其他原因导致的?MySQL不会给出错误信息。(我使用PHP)请有经验的人告诉我关于LOAD_FILE函数的相关信息。
<?php
$result = mysql_query('SELECT LOAD_FILE("/home/user/domains/example.com/public_html/robots.txt") AS tmp FROM tmpTable') or die(mysql_error());
while($row = mysql_fetch_assoc($result))
{
var_dump( $row['tmp'] );
}

请展示您正在使用的完整代码以运行查询。 - Pekka
这是完整的代码(测试代码) - Simon
你是否已经授予用户权限?GRANT FILE ON . TO me; - Phill Pafford
我也听说LOAD_FILE是只在Windows操作系统中支持的函数,而不支持Linux:http://forums.mysql.com/read.php?20,218333 - Phill Pafford
仅拥有“USAGE”权限(共享主机) - Simon
3个回答

5

虽然这个解决方法很丑陋,但我发现你不必把图片放在 /var/lib/mysql/all_images 中。我使用了 /var/lib/mysql/foo_images,它也可以正常工作。由于这个原因,我让我的数据库模式安装程序(一个 Debian 包)创建了 /var/lib/mysql/foo_images,将其填充了图像文件,然后在我的 postinst 中运行了我的 SQL 语句,其中包含 LOAD_FILE,并删除了 /var/lib/mysql/foo_images。最终结果非常干净,对 MySQL 安装的破坏性最小,中间阶段也不错。我很满意。 - Randall Cook
1
其他目录失败的原因是AppArmor阻止了它们。 - ivo Welch
这个技巧在我的Ubuntu 14.04 LTS上也适用。具体来说,将文件放在/var/lib/mysql/目录下,然后使用相对文件名,例如,LOAD_FILE('foobar.txt')将加载/var/lib/mysql/foobar.txt - Arto Bendiken

4

看起来一些Linux发行版上的MySQL版本在LOAD_FILE函数上有一个bug。这里是该帖子。在帖子的最后似乎有一个解决方法。

编辑:

由于你在共享主机上,考虑到你想要的功能,你可以直接读取文件吗?使用file()函数应该会将文件读入数组格式。


1

要查看您拥有的权限,请使用show grants命令。

我已记录了一些其他命令,您可以使用它们来检查是否满足条件:

http://pastebin.com/Dvsdxh9Y

我需要对文档进行补充说明。请确保:

  • 父目录有执行权限
  • 必须明确授予FILE权限。(GRANT FILE on . TO user@localhost)
  • 您已刷新权限
  • 您已注销并重新登录

父目录权限示例:

mysql> \! ls -ld `dirname /home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg`
drwxrwxr--. 2 jlam jlam 4096 May 12 14:22 /home/jlam/code/projectName/doc/filesForTesting/images
mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); +-------------------------------------------------------------------------------------------------------------+ | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) | +-------------------------------------------------------------------------------------------------------------+ | NULL | +-------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
mysql> \! chmod o+x /home/jlam/code/projectName/doc/filesForTesting/images mysql> \! ls -ld `dirname /home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg` drwxrwxr-x. 2 jlam jlam 4096 May 12 14:22 /home/jlam/code/projectName/doc/filesForTesting/images mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487 +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 row in set (0.00 sec)

用户权限示例:

16:38:09 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal
输入密码:
mysql> show grants; +-----------------------------------------------------------------------------------------------------------------+ | Grants for eventCal@localhost | +-----------------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'eventCal'@'localhost' IDENTIFIED BY PASSWORD '*xxxxx' | | GRANT ALL PRIVILEGES ON `tmp`.* TO 'eventCal'@'localhost' | | GRANT ALL PRIVILEGES ON `eventCalTesting`.* TO 'eventCal'@'localhost' | | GRANT ALL PRIVILEGES ON `eventCal`.* TO 'eventCal'@'localhost' | | GRANT ALL PRIVILEGES ON `eventCal_categoryMigration`.* TO 'eventCal'@'localhost' | +-----------------------------------------------------------------------------------------------------------------+ 共 5 行(0.00 秒)
mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); +-------------------------------------------------------------------------------------------------------------+ | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) | +-------------------------------------------------------------------------------------------------------------+ | NULL | +-------------------------------------------------------------------------------------------------------------+ 共 1 行(0.00 秒)

在其他 root 会话中:

mysql> grant file ON *.*  to eventCal@localhost;
授权成功,受影响的行数为0,用时0.00秒
mysql> flush privileges; 刷新权限成功,受影响的行数为0,用时0.00秒

回到用户会话,我仍然无法加载文件

mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'));
+-------------------------------------------------------------------------------------------------------------+
| hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) |
+-------------------------------------------------------------------------------------------------------------+
| NULL                                                                                                        |
+-------------------------------------------------------------------------------------------------------------+
1行记录已返回,用时0.00秒

.....但是如果我注销并重新登录:

mysql> exit
再见
16:40:14 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal 输入密码:
mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')); +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487 +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1
此外,在Ubuntu Linux和其他地方,AppArmor可能会干扰。 - ivo Welch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接