Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CSV上载可与本地WAMP一起使用,但不能与使用负载数据的远程LAMP一起使用_Php_Mysql_File Upload_Nginx_Permissions - Fatal编程技术网

Php CSV上载可与本地WAMP一起使用,但不能与使用负载数据的远程LAMP一起使用

Php CSV上载可与本地WAMP一起使用,但不能与使用负载数据的远程LAMP一起使用,php,mysql,file-upload,nginx,permissions,Php,Mysql,File Upload,Nginx,Permissions,新建: 使用结构正确的WinSCP将实际.csv文件上载到/tmp文件夹到服务器,然后从mysqlCLI运行LOAD DATA LOCAL infle。但是如果你从表单上传,我会触发“对不起”错误。我已经echo'ed和var_转储了几个全局$_文件变量,下面是它们的结果: $\u文件['csv']['tmp\u名称]: dirname是/tmp basename是php8k4jFN(每次运行脚本时都不同,没有.csv结尾) filename是php8k4jFN 完整文件路径: /tmp/php

新建:

使用结构正确的WinSCP将实际.csv文件上载到/tmp文件夹到服务器,然后从
mysql
CLI运行
LOAD DATA LOCAL infle
。但是如果你从表单上传,我会触发“对不起”错误。我已经echo'ed和var_转储了几个全局$_文件变量,下面是它们的结果:

$\u文件['csv']['tmp\u名称]

dirname
/tmp

basename
php8k4jFN
(每次运行脚本时都不同,没有.csv结尾)

filename
php8k4jFN

完整文件路径:

/tmp/php8k4jFN

$\u文件['csv']['error']:

0

权限:

mysql
www-data
root
组的一部分,它们都可以读/写
/tmp

/tmp
中使用
mycsv.csv
文件从
mysql
CLI执行
LOAD DATA infle LOCAL…
可以正常工作,但会出现一些警告(这会触发错误吗?)

删除apparmor并授予root 1775权限t/tmp


我的表单允许您上传一个CSV文件

我使用
LOAD DATA LOCAl infle
将CSV的内容上传到MySQL表中。 想法是:用户使用我的表单将其计算机上的本地CSV上传到我的远程LAMP服务器

如果我在本地环境(我的计算机上运行的WAMP)中测试所有内容,那么所有内容都正常工作。我已经解决了所有的语法、逻辑和CSV结构错误

当我将整个源文件上传到远程LAMP服务器并尝试将笔记本电脑中的CSV上传到该服务器时,我会触发自定义错误:
“抱歉,无法上传CSV”

我对它进行了测试,在本地从未出现过这种错误。后来,我发现我必须在LAMP服务器上的
[mysqld]
[mysql]
下启用
local infle
内部
my.cnf
,才能使用
local
关键字

在进行更改之前,我通常会得到:
此MySQL版本不允许使用used命令

我试图在我的PHP脚本中回显查询,并通过mysql命令行手动执行它,但出现了以下错误(这是有意义的,因为临时文件已经不存在了):
错误2(HY000):未找到文件“/tmp/phpINUea0”(错误代码:2)

回音查询:

LOAD DATA LOCAL INFILE '/tmp/phpINUea0' 
INTO TABLE mydb.suites
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '\"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(suite, business_name, business_phone, business_email) 
SET location_id = 2 
然后,我还尝试使用PHP的
echo
var\u dump
print\u r
调试我的表单,但这三条语句都返回空/假结果:

$query_add_suite_csv = $this->db_connection->query($query);

echo $query_add_suite_csv;          // returns nothing
var_dump($query_add_suite_csv);     // returns boolean false
print_r($query_add_suite_csv);      // return nothing

if ($query_add_suite_csv) {
    // success message
}else{
    echo "Sorry, couldn't upload the CSV"
}
目前还不清楚为什么会发生这种情况。如果有必要,我已经使用指南设置了我的远程LAMP服务器

文件上传PHP函数:

private function addSuiteCSV()
{
    if (empty($_POST['suite_location_csv'])) {
        $this->errors[] = "Must select location of suite";
    }else{

        // create a database connection
        $this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

        if (!$this->db_connection->set_charset("utf8")) {
            $this->errors[] = $this->db_connection->error;
        }

        if (!$this->db_connection->connect_errno) {
            $suite_location_csv = $this->db_connection->real_escape_string(strip_tags($_POST['suite_location_csv'], ENT_QUOTES));
            if ($_FILES['csv']['size'] > 0) {
                $file = addslashes($_FILES['csv']['tmp_name']);

                $query =<<<EOF
                    LOAD DATA LOCAL INFILE '$file'
                    INTO TABLE mydb.suites
                    FIELDS TERMINATED BY ',' 
                    OPTIONALLY ENCLOSED BY '\"'
                    LINES TERMINATED BY '\n'
                    IGNORE 1 LINES
                    (suite, business_name, business_phone, business_email)
                    SET location_id = $suite_location_csv
EOF;

                $query_add_suite_csv = $this->db_connection->query($query);

                if ($query_add_suite_csv) {
                    // success
                } else {
                    // sorry
                }               

            }else{
                // empty file
            }
        }else{
            // db connection error
        }
    }
}
}
专用函数addSuiteCSV()
{
if(空($\u POST['suite\u location\u csv'])){
$this->errors[]=“必须选择套件的位置”;
}否则{
//创建数据库连接
$this->db\u connection=newmysqli(db\u主机、db\u用户、db\u密码、db\u名称);
if(!$this->db\u connection->set\u字符集(“utf8”)){
$this->errors[]=$this->db\u connection->error;
}
如果(!$this->db\u connection->connect\u errno){
$suite\u location\u csv=$this->db\u connection->real\u escape\u string(带标签($\u POST['suite\u location\u csv'],ENT\u引号));
如果($_文件['csv']['size']>0){
$file=addslashes($_FILES['csv']['tmp_name']);

$query=必须将生产移动到WAMP而不是LAMP。在Linux中肯定存在一些我不知道的权限问题。

必须将生产移动到WAMP而不是LAMP。在Linux中肯定存在一些我不知道的权限问题。

您测试过文件是否收到了吗?@frz3993如果我没有错
/tmp
在e之后被清除非常重新启动。从那以后我就没有重新启动我的LAMP服务器,而且
/tmp
文件夹中没有任何内容。因此,我认为说没有收到文件是安全的。我还尝试手动将文件上载到
/tmp
以查看是否存在读/写权限问题,但我能够毫无问题地上载文件。我想PHP脚本执行完毕后,
/tmp
文件中的文件将被删除。请尝试
echo pathinfo($\u FILES['filename']['tmp\u name']);
。查看是否有任何结果。将文件名更改为您的csv文件名。@frz3993
echo
ing给了我
数组的输出。
我还对
pathinfo()进行了
var\u转储
得到了这个:
数组(3){[“dirname”]=>string(4)“/tmp”[“basename”]=>string(9)“php61HnlJ”[“filename”]=>string(9)“php61HnlJ”}
这意味着该文件已上载到服务器。为什么不尝试将上载的文件移动到另一个文件夹中。是否已测试该文件是否已收到?@frz3993如果我没有错
/tmp
在每次重新启动后都会被清除。此后,我没有重新启动我的LAMP服务器,并且
/tmp
文件夹中没有任何内容。因此,我假设可以肯定地说,没有收到文件。我还尝试手动将文件上载到
/tmp
以查看是否存在读/写权限问题,但我能够毫无问题地上载文件。我认为
/tmp
文件中的文件将在PHP脚本完成执行后被删除。请尝试
echo pathinfo($\u files['filename']['tmp_name']];
看看你有什么收获。把文件名改成你的csv文件名。@frz3993
echo
ing给了我
Array
的输出。我也在
pathinfo()
上做了
var_dump
得到了这个:
Array(3){[“dirname”=>string(4)”/tmp”[“basename”=>string(9)“php61HnlJ”[“filename”]=>string(9)“php61HnlJ”}
这意味着该文件已上载到服务器。为什么不尝试移动