使用PHP将CSV文件上传到mysql数据库 | 珊瑚贝

Uploading CSV file into mysql database using PHP


我在将 CSV 文件上传到我的 MySQL 数据库时遇到问题。我不是一个非常有经验的编码人员,如果我试图解决问题的尝试已经结束,我很抱歉,但我将包括我迄今为止尝试过的内容。

这是代码的 HTML 部分:

1
2
3
4
5
<form enctype=“multipart/form-data” action=“camperUpload.php” method=“POST”>
<input type=“hidden” name=“MAX_FILE_SIZE” value=“100000” />
Choose a file to upload: <input name=“uploadedfile” type=“file” /><br />
<input type=“submit” value=“Upload File” class=“btn btn-border” />
</form>

这里是 PHP 部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function processFile($uploadedFile) {

    // file contents
    $file_contents = $uploadedFile[“tmp_name”];

    $SQL_statement =“LOAD DATA LOCAL INFILE ‘$file_contents‘ INTO TABLE C_CAMPER FIELDS TERMINATED BY ‘,’
                        LINES TERMINATED BY ‘\
‘ IGNORE 3 LINES
                        (camperFName,campLName,camperAddress,camperCity,camperZip,camperCountry,camperPhone,camperEmail,@camperAltEmail,@camperDOB,camperAge,camperSchool,camperGradYear,camperGPA,camperACT/SAT,camperPar,camperParPhone,camperPrimPos,camperSecPos);”
;
SET camperDOB = STR_TO_DATE(@camperDOB, ‘%b-%d-%Y’),
    camperAltEmail = NULLIF(@camperAltEmail, ‘null’);
    // Run SQL query
    $DB->execute($SQL_statement);

CSV 文件的前两行并不重要,只有一行是标题,所以我让它跳过前三行。文件中的日期格式是 1999 年 6 月 5 日,所以我认为我必须尝试更改它。我把”LINES TERMINATED BY ‘\\
‘ IGNORE 3 LINES” 但我不确定我是否应该拥有它,这些行不会被任何东西终止。

我正在为我的数据库使用 phpMyAdmin,以防万一这很重要。

当我尝试执行此操作时,它只会转到一个页面,该页面显示该页面无法正常工作……所以我知道我可能已经离开或丢失了一些东西。任何帮助将不胜感激,谢谢!

编辑:
这是我的 PHP 文件,其中包含 Vasiliy Zverev 建议的更改。现在它不起作用,因为显然 phpMyAdmin 的 LOAD DATA LOCAL INFILE 命令有问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 <?php
    // version 1.02
    // display errors for debugging
    ini_set(“display_errors”, true);
    error_reporting(E_ALL);

    // Open a connection to the SQL server so we can run queries later.
    $conn = new mysqli(removed for privacy); // DON’T FORGET TO EDIT THIS PART!
    // Output error info if there was a connection problem
    if ($conn->connect_errno) {
        die(” Uh oh! It looks like we’re having trouble connecting to the
 website at the moment. Try again soon! {$conn->connect_error}
);
    }

    // file name
    $file_contents = $_FILES[“uploadedfile”][“tmp_name”];

    $SQL_statement =“LOAD DATA LOCAL INFILE ‘$file_contents‘ INTO TABLE C_CAMPER FIELDS TERMINATED BY ‘,’
                        LINES TERMINATED BY ‘\
‘ IGNORE 3 LINES
                        (camperFName,campLName,camperAddress,camperCity,camperZip,camperCountry,camperPhone,camperEmail,@camperAltEmail,@camperDOB,camperAge,camperSchool,camperGradYear,camperGPA,`camperACT/SAT`,camperPar,camperParPhone,camperPrimPos,camperSecPos)
                        SET camperDOB = STR_TO_DATE(@camperDOB, ‘%m/%d/%Y’),
                            camperAltEmail = NULLIF(@camperAltEmail, ‘null’);”
;
    // Run SQL query
    if( !$conn->query($SQL_statement)) {
        echo $conn->error;
    }

    // Close the SQL connection
    $conn->close();
?>

  • 以 SET camperDOB 开头的行不是字符串 $SQL_statement 的一部分。打开 PHP 错误报告。错误消息将向您显示发生了什么问题。
  • 此外,您的 SET 语句应该是一个更新,因为它将在 LOAD DATA 之后执行。
  • camperSecPos);”; set 必须是 camperSecPos) set
  • global $DB; 为什么将其定义为全局?你指的是连接吗?在我看来,您在这里使用了错误的变量,并且您的编辑和原始代码包含语法错误。
  • $uploadedFile 这是在哪里定义的?您希望从上传的文件中获取它;你正在使用的东西不起作用。
  • @Fred-ii- 我在原始帖子中更新了我的编辑。我需要在哪里定义 $uploadedFile?
  • 在 php.net 上查看 php.net/manual/en/features.file-upload.post-method.php


试试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
    // version 1.02
    // display errors for debugging
    ini_set(“display_errors”, true);
    error_reporting(E_ALL);

    // Open a connection to the SQL server so we can run queries later.
    $conn = new mysqli(removed for privacy); // DON’T FORGET TO EDIT THIS PART!
    // Output error info if there was a connection problem
    if ($conn->connect_errno) {
        die(” Uh oh! It looks like we’re having trouble connecting to the
 website at the moment. Try again soon! {$conn->connect_error}
);
    }

    // file name
    $file_contents = $_FILES[“uploadedfile”][“tmp_name”];

    $SQL_statement =“LOAD DATA LOCAL INFILE ‘$file_contents‘ INTO TABLE C_CAMPER FIELDS TERMINATED BY ‘,’
                        LINES TERMINATED BY ‘\
‘ IGNORE 3 LINES
                        (camperFName,campLName,camperAddress,camperCity,camperZip,camperCountry,camperPhone,camperEmail,@camperAltEmail,@camperDOB,camperAge,camperSchool,camperGradYear,camperGPA,`camperACT/SAT`,camperPar,camperParPhone,camperPrimPos,camperSecPos)
                        SET camperDOB = STR_TO_DATE(@camperDOB, ‘%m/%d/%Y’),
                            camperAltEmail = NULLIF(@camperAltEmail, ‘null’);”
;
    // Run SQL query
    if( !$conn->query($SQL_statement)) {
        echo $conn->error;
    }

    // Close the SQL connection
    $conn->close();
?>

  • 你的意思是它初始化了吗?我将发布整个 PHP 页面供您查看,以及您所做的更改。编辑:我无法在此回复中发布代码,因此我将其编辑到原始帖子中。谢谢!
  • @Jacobra,我的意思是您必须事先连接到 mysql 服务器并选择数据库。刚刚还更新了 STR_TO_DATE()。
  • 它仍然无法正常工作。自添加该部分以来,它甚至没有为 PHP 部分进行任何错误报告。
  • @Jacobra,请尝试这个新版本。
  • 我做到了,当我单击提交时,它仍然只是说”此页面不工作”。您认为代码的 HTML 部分有问题吗?
  • @Jacobra,我添加了版本号;)请尝试 1.01。以前的版本缺少分号,我也删除了 session_start() 因为你没有在这个文件中使用它。
  • 好的,我试过了,我得到了这个错误:”致命错误:在第 26 行调用文件位置中未定义的方法 mysqli::error()(为隐私而更改)”
  • @Jacobra,已修复。 v.1.02。
  • 现在它说”这个 MariaDB 版本不允许使用的命令”……哈哈这不可能吗?
  • @Jacobra,看来您应该启用它:stackoverflow.com/questions/10762239/…
  • @Jacobra,如果您的 MariaDB 在本地主机上,您可以从 SQL 中删除 LOCAL 并重试。
  • @Jacobra,如果您无法更改 MariaDB 的安全设置并且它不在本地主机上,您可以使用 fgetcsv() 解析 php 中的 csv 并运行 INSERT … VALUES (…, …, …) 查询。
  • 我删除了 LOCAL,它说 “Access denied for user \\’removed\\’@\\’localhost\\’ (using password: YES)” 我可能只需要使用 fgetcsv()。我读过这是一种更简单的方法,这就是为什么我试图这样做,但也许它只是行不通。我正在使用 phpMyAdmin。使用 fgetcsv,我如何处理格式错误的日期?
  • @Jacobra,如果您只需要一次,您可以使用 phpMyAdmin 导入您的 csv。
  • 我不只需要一次,它需要能够重复使用。
  • @Jacobra,您在 $conn = new mysqli(removed for privacy) 中有 “localhost” 吗?
  • 是的,我愿意。当地是什么意思?也许我只是从一开始就弄错了。所有文件都托管在 cpanel 上……但这个 CSV 不会来自这些文件。当用户去上传这个 CSV 文件时,它只是来自他们计算机的文件。
  • @Jacobra, LOAD DATA 中的 LOCAL 表示 csv 不在 MySQL 服务器上,但在 web (php) 服务器上。如果将 mysqli 连接到 localhost,则意味着 MySQL 服务器和 Web 服务器共享相同的文件目录(尽管它们可能受到文件权限的限制)。让我们测试一下您的 MySQL 用户是否有权访问您的数据库。运行 <?php $conn = new mysqli(/* REPLACE connection here */); if ($conn->connect_errno) die(“Connection: {$conn->connect_error}”); if( $conn->query(“SELECT 1 FROM C_CAMPER”)) echo”Success”; else echo $conn->error;
  • 我很确定它可以访问,我已经使用 PHP 对数据库进行了很多其他查询。
  • @Jacobra,C_CAMPER 表是否已经存在?如果没有,您的 MySQL 用户是否具有 CREATE TABLE 权限?
  • 是的,该表已经存在。不过,它还没有任何数据。
  • @Jacobra,如此处建议:stackoverflow.com/a/16765364/1435647 让我们在 phpMyAdmin 中尝试:GRANT FILE on database.* to user@’localhost’ IDENTIFIED BY ‘password’ 用实际值替换数据库、用户和密码。
  • 我应该在 phpMyAdmin 哪里试试这个?我在 SQL 部分输入它,它说 ” #1045 – Access denied for user \\’removed\\’@\\’localhost\\’ (using password: YES)”
  • @Jacobra,那么您必须使用 fgetcsv() 方法。您没有足够的权限使用 LOAD DATA INFILE。
  • cpanel 或 phpMyAdmin 上是否有可以更改权限的地方?
  • @Jacobra,或者尝试通过 cPanel 为 MariaDB 用户授予 FILE 权限。
  • 我想不通。我想我只需要尝试使用 fgetcsv() 方法来做到这一点……非常令人沮丧..感谢您的所有帮助!你太棒了。我可能会在某个时候回到这里,需要知道我的 fgetcsv() 的帮助……
  • @Jacobra,documentation.cpanel.net/display/ALD/… “要修改用户对特定数据库的权限…”
  • 我做到了,它没有做任何事情..仍然只是说命令不起作用。它列出的两个用户与连接中的用户不同,但是……它们是 username_remote 和 username_webpage ,其中 username 是 PHP 文件中连接中使用的用户。


来源:https://www.codenong.com/43310763/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9696.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?