找回密码
 立即注册
搜索
查看: 248|回复: 0

phpMyAdmin导入文件错误的解决办法

[复制链接]

991

主题

92

回帖

5万

积分

管理员

积分
55457
发表于 2022-7-4 17:01:12 | 显示全部楼层 |阅读模式
! j3 y) F6 m, E7 V4 |
phpMyAdmin 这货的升级速度确实是快,今天已然升级到 4.2.3 了,打算升级一下 phpMyAdmin 并简单测试一下,在导入文件的时候发生以下错误:- {* a6 y3 |; Y. z! e
Uploaded file cannot be moved, because the server has open_basedir enabled without access to the directory (for temporary files).
+ L8 m4 f! E* U2 W% ~% ]" T而在之前的版本 4.2.2 的时候,导入文件是没有问题的。相同的环境,因为版本升级而导致的问题,那肯定是代码有变动了。于是开始比较两个版本之间有什么不同。
# V4 U" T% x7 m        ! i0 ~4 Q5 p9 d' ]4 j% l+ S
既然是导入文件出的问题,那就来比较一下 phpMyAdmin 根目录下的 import.php 文件。
" K  L% i$ h0 o/ G* a/ M$ W) w7 F版本 4.2.2 的 import.php 中第 376 行:
9 h" Y5 B/ n0 V! W6 s! h$tmp_subdir = sys_get_temp_dir();版本 4.2.3 的 import.php 中第 376 行:# O6 M6 W" y6 B  ?- a  y
$tmp_subdir = ini_get('upload_tmp_dir');从代码中可以看出,导入文件的临时目录的获取方式变更了。前者使用了 PHP 的函数 sys_get_temp_dir 返回用于临时文件的目录;后者使用了 PHP 的函数 ini_get 来获取 php.ini 配置文件里 upload_tmp_dir 的值。如果在 php.ini 中 upload_tmp_dir 的值没有定义的话,那就会出现以上的错误。3 r6 s: v  J/ x; b) l) D2 e
LAMP一键安装脚本中,默认的 php.ini 中没有设置 upload_tmp_dir 的值(此处在官方的 php.ini-production 中也未定义),所以解决办法就是:
+ j3 `2 R8 \! Z/ ~9 `) s$ s在 php.ini 中将 upload_tmp_dir 设为 /tmp 即可。* U7 g+ H4 c" m% G- e
如果安装环境是 LAMP一键安装脚本 的话,则修改文件位于 /usr/local/php/etc/php.ini,其他的环境则根据实际情况找到 php.ini 来修改。
, R4 Z9 W( K7 g( e. o修改前:: R1 v% I4 U3 a& H4 R8 x+ c
;upload_tmp_dir =修改后:5 R7 R* M6 `4 s7 F: a9 Z  H
upload_tmp_dir = /tmp在 Apache 的配置文件 httpd-vhosts.conf 中定义的 php_admin_value open_basedir 已包含了 /tmp 目录。而关于 /tmp 目录的权限一般已默认是 777 ,具备了可写权限。" K7 {" F( I* T
按照上述步骤修改完 php.ini 后,需重启 Apache 。+ j/ ], B, U2 d1 m3 m
service httpd restart重启完毕,再次登录 phpMyAdmin 并导入文件就一切正常了。
- T+ h3 x4 R' H. Q) ?  u: {7 I最后吐槽 phpMyAdmin:/ N+ e. H! O4 X1 l" y2 H
phpMyAdmin 导入文件的代码(import.php)中,导入文件的临时目录的获取方式几度变更,在版本4.0.8 中则是这样的:
( _7 ]1 x5 p: O3 R( \* }4 O) I$tmp_subdir = (PMA_IS_WINDOWS ? '.\\tmp\\' : 'tmp/');在设置了 open_basedir 的情况下,最终(最新版 4.2.3)的解决方案是跟 php.ini 里的设置绑定了。那如果用户不能设置(比如虚拟主机用户) php.ini 中的 upload_tmp_dir 那不就意味着无法使用导入文件功能了么。  c& {  M/ [6 N) k0 \, z, J
个人觉得,可以加个判断条件,如果从  php.ini 中读到的 upload_tmp_dir 的值为空,则改用 sys_get_temp_dir 函数获取用于临时文件的目录,然后再来判断获得的目录是否具备可写权限。这里给出的参考代码如下:$ K$ [+ t5 b  k$ N& N! C: |1 {
$tmp_subdir = ini_get('upload_tmp_dir'); if (empty($tmp_subdir)) {    $tmp_subdir = sys_get_temp_dir();}
/ y) ~# Z* o  j/ J9 U2 u2014年06月21日更新:2 p' l' D; f  V! ~$ _/ E% `
phpMyAdmin 更新到 4.2.4 后,import.php 如我所料地改成了以上我给出的建议代码。
7 J  ?/ E2 G0 @- y' n) ~+ C参考链接:6 v# `7 j3 D8 h- @) F
http://docs.phpmyadmin.net/en/latest/faq.html#i-cannot-insert-a-text-file-in-a-table-and-i-get-an-error-about-safe-mode-being-in-effect, {( ]% X3 A+ ~" }$ n
http://sourceforge.net/p/phpmyadmin/bugs/4405/
6 o2 M9 M2 L4 d+ `7 _# K8 c, `0 `% u; @  ~- H7 |* F1 W
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-8-5 03:30 PM , Processed in 0.124777 second(s), 32 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表