Php CSV上载可与本地WAMP一起使用,但不能与使用负载数据的远程LAMP一起使用
新建: 使用结构正确的WinSCP将实际.csv文件上载到/tmp文件夹到服务器,然后从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
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文件名。@frz3993echo
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文件名。@frz3993echo
ing给了我Array
的输出。我也在pathinfo()
上做了var_dump
得到了这个:Array(3){[“dirname”=>string(4)”/tmp”[“basename”=>string(9)“php61HnlJ”[“filename”]=>string(9)“php61HnlJ”}
这意味着该文件已上载到服务器。为什么不尝试移动