我试图将CSV文件导入MySQL数据库,但没有成功。
我的数据库中有5列:
id,userID,movieID,速率,时间戳
在我的CSV文件中,我只有4列,由两个冒号":"分隔
这是示例数据:
1::1193::5::978300760
这是我的查询
$query="将数据信息'$uploadfile'加载到表rating_TABLE字段以"::"结尾行以"\n"结尾(userID,movieID,速率,时间戳)";
我使用的是PDO_MySQL
,这是额外的代码,以便您能够理解。
$stmt = $dbh->prepare($query);
try{
if($stmt->execute()){
echo "Sucessful importing of CSV file into the MySQL database!";
}
}
catch (PDOException $e) {
echo "Error importing of CSV file into the MySQL database!";
echo "Error!: " . $e->getMessage() . "<br/>";
die();
}
echo "</p>";
我试过很多次,但当我签入数据库时,它仍然是空的
我好像搞不明白怎么了,你能帮我吗?谢谢
这就是我遇到的错误。
致命错误:未捕获异常"PDOException",消息为'SQLSTATE[HY000]:一般错误:2014在其他未缓冲的查询处于活动状态。考虑使用PDOS语句::fetchAll()。或者,如果您的代码要在mysql上运行,可以通过设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性。'在里面C: \examplep\htdocs\movie\php\upload_file.php:57堆栈跟踪:#0C: \examplep\htdocs\movie\php\upload_file.php(57):PDOStatement->execute()在第57行的C:\examplep\htdocs\movie\php\upload_file.php中抛出1{main}
这是我的连接设置:
$dbh=新PDO('mysql:host=localhost;dbname=movie','root','',阵列(PDO::MYSQL_ATTR_INIT_COMMAND=>"设置名称UTF8",PDO::ATTR_EMULATE_PREPARES=>FALSE,PDO::MYSQL_ATTR_USE_buffred_QUERY=>TRUE,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO:MYSQL_ATTR_LOCAL_file=>TRUE));
为了在输出中看到错误消息,只需使用PDO::ERRMODE_EXCEPTION
初始化PDO,如下所示:
$db = new PDO('mysql:host=' . $config['db_host'] . ';dbname=' . $config['db_name'], $config['db_username'], $config['db_password'],
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
PDO::ATTR_EMULATE_PREPARES => FALSE,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
之后,您将能够看到错误。将其发布在更新中,我/我们将能够帮助您!
编辑1:
请参阅PDO_MYSQL手册。
您可能还需要:
PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE
注意,此常量只能在以下情况下在driver_options数组中使用构造一个新的数据库句柄。
编辑2:
根据MySQL手册,MySQL必须使用--enable-local-infile
:进行编译
您必须使用MySQL的完整路径编译PHP,否则将使用它的内部处理程序,这些处理程序不适用于"新"LOAD数据。
--使用mysql=/usr/local/mysql(假设您的mysql位于此处)
您必须使用选项"--local-infile=1"启动MySQL守护进程
或者通过添加到您的/etc/my.cnf
:来启用它
[mysql]
local-infile=1
[mysqld]
local-infile=1
之后,通过运行service mysqld restart
重新启动mysqld
。
编辑3:
引号用于字符串文字,反引号用于列和表名。正确地转义变量。将您的查询更改为:
$query = "LOAD DATA INFILE ' . $uploadfile . ' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY 'n' ( `userID`, `movieID`, `rate`, `timestamp`)";
编辑4:
当您同时有多个查询open
时,通常会导致此错误。例如,您调用fetch()
,但直到它完成后才调用它,然后尝试执行第二个查询。
通常,这个问题的解决方案是调用closeCursor()
PHP:PDOStatement::closeCursor-Manual。试着称之为:
/* The following call to closeCursor() may be required by some drivers */
$stmt->closeCursor();
/* Now we can execute the second statement */
$otherStmt->execute();
看看这是否会改变你。
编辑5:
请尝试使用其他语法来转义变量。使用以下内容:
$stmt = $dbh->prepare("
LOAD DATA INFILE
'" . $uploadfile . "'
INTO TABLE
`rating_table`
FIELDS TERMINATED BY
'::'
LINES TERMINATED BY
'n' ( `userID`, `movieID`, `rate`, `timestamp`)
");
$stmt->execute();
编辑6:
PDO占位符只能用于值,不能用于数据库、表或列名!我认为错误来自于使用'::'
。将文件中的数据分隔符从'::'
更改为'.'
。
作为检查的快速解决方法,您可以直接使用查询而无需准备:
$stmt = $dbh->query("
LOAD DATA INFILE
'" . $uploadfile . "'
INTO TABLE
`rating_table`
FIELDS TERMINATED BY
'::'
LINES TERMINATED BY
'n' ( `userID`, `movieID`, `rate`, `timestamp`)
");
如果不起作用,请尝试更改数据分隔符或尝试以某种方式转义现有的删除符(::
)。
您的LOAD DATA INFILE
语句中可能缺少LOCAL
关键字。
LOCAL
表示从中加载的文件位于客户端上,而不是服务器上。我刚试过的时候,用你的桌子和文件,效果很好。
> cat infile.csv
1::1193::5::978300760
> mysql
mysql > create table ratings (
id int primary key auto_increment,
userID int,
movieID int,
rate int,
ts long);
Query OK, 0 rows affected (0.06 sec)
mysql > LOAD DATA LOCAL INFILE 'infile.csv' INTO TABLE ratings FIELDS TERMINATED BY '::' LINES TERMINATED BY 'n' ( userID, movieID, rate, ts);
Query OK, 1 row affected (0.00 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql > select * from ratings;
+----+--------+---------+------+-----------+
| id | userID | movieID | rate | ts |
+----+--------+---------+------+-----------+
| 1 | 1 | 1193 | 5 | 978300760 |
+----+--------+---------+------+-----------+
1 row in set (0.00 sec)