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 $SQL_statement =“LOAD DATA LOCAL INFILE ‘$file_contents‘ INTO TABLE C_CAMPER FIELDS TERMINATED BY ‘,’ |
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. // file name $SQL_statement =“LOAD DATA LOCAL INFILE ‘$file_contents‘ INTO TABLE C_CAMPER FIELDS TERMINATED BY ‘,’ // Close the SQL connection |
- 以 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. // file name $SQL_statement =“LOAD DATA LOCAL INFILE ‘$file_contents‘ INTO TABLE C_CAMPER FIELDS TERMINATED BY ‘,’ // Close the SQL connection |
- 你的意思是它初始化了吗?我将发布整个 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/