我正在尝试将CSV文件导入MySQL数据库,但它无法正常工作.
我的数据库中有5列:
id,userID,movieID,rate,timestamp
在我的CSV文件中,我只有4列用两个冒号'::'分隔.
这是样本数据:
1 :: 1193 :: 5 :: 978300760
这是我的查询
$ query ="LOAD DATA INFILE'$ uploadfile'INTO TABLE rating_table FIELDS终止于'::'LINESATED by'\n'(userID,movieID,rate,timestamp)";
而我正在使用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() . "
"; die(); } echo "";
我已经尝试了很多次,但是当我检查了我的数据库时,它仍然是空的.
我似乎无法弄清楚出了什么问题,你能帮助我吗?谢谢!
这是我得到的错误.
致命错误:带有消息'SQLSTATE [HY000]的未捕获异常'PDOException':常规错误:2014在其他未缓冲的查询处于活动状态时无法执行查询.考虑使用PDOStatement :: fetchAll().或者,如果您的代码只是针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲.在C:\ xampp\htdocs\movie\php\upload_file.php:57堆栈跟踪:#0 C:\ xampp\htdocs\movie\php\upload_file.php(57):PDOStatement-> execute()1 {main}在第57行的C:\ xampp\htdocs\movie\php\upload_file.php中抛出
这是我的连接设置:
$ dbh = new PDO('mysql:host = localhost; dbname = movie','root','',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,PDO :: MYSQL_ATTR_LOCAL_INFILE => TRUE));
Ilia Rostovt.. 5
要在输出中查看错误消息,只需初始化您的PDO PDO::ERRMODE_EXCEPTION
,如下所示:
$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 ));
之后您将能够看到错误.在更新中发布它我/我们将能够帮助你!
看一下PDO_MYSQL上的手册.
您可能还需要:
PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE
注意,在构造新的数据库句柄时,此常量只能在driver_options数组中使用.
根据MySQL手册,MySQL必须编译为--enable-local-infile
:
您必须使用MySQL的完整路径编译PHP,否则它将使用它的内部处理程序,它不能与"新"LOAD DATA一起使用.
--with-mysql =/usr/local/mysql(假设你的MySQL位于这里)
你必须使用选项'--local-infile = 1'启动MySQL守护进程
或通过添加到您的启用它/etc/my.cnf
:
[mysql] local-infile=1 [mysqld] local-infile=1
mysqld
之后通过运行重新启动service mysqld restart
.
引号用于字符串文字,用于列和表名称的后退.正确地转义变量.将您的查询更改为:
$query = "LOAD DATA INFILE ' . $uploadfile . ' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`)";
当您同时有多个查询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();
看看这是否会改变你的一切.
尝试使用其他语法来转义变量.使用以下内容:
$stmt = $dbh->prepare(" LOAD DATA INFILE '" . $uploadfile . "' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`) "); $stmt->execute();
PDO占位符只能用于值,而不能用于数据库,表或列名称!我认为错误来自于使用'::'
.'::'
比方说,将文件中的数据分隔符更改为'.'
.
作为检查的快速解决方法,您可以直接使用查询而无需准备:
$stmt = $dbh->query(" LOAD DATA INFILE '" . $uploadfile . "' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`) ");
如果它不起作用尝试更改数据分隔符或尝试::
以某种方式转义现有的delemiter().
要在输出中查看错误消息,只需初始化您的PDO PDO::ERRMODE_EXCEPTION
,如下所示:
$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 ));
之后您将能够看到错误.在更新中发布它我/我们将能够帮助你!
看一下PDO_MYSQL上的手册.
您可能还需要:
PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE
注意,在构造新的数据库句柄时,此常量只能在driver_options数组中使用.
根据MySQL手册,MySQL必须编译为--enable-local-infile
:
您必须使用MySQL的完整路径编译PHP,否则它将使用它的内部处理程序,它不能与"新"LOAD DATA一起使用.
--with-mysql =/usr/local/mysql(假设你的MySQL位于这里)
你必须使用选项'--local-infile = 1'启动MySQL守护进程
或通过添加到您的启用它/etc/my.cnf
:
[mysql] local-infile=1 [mysqld] local-infile=1
mysqld
之后通过运行重新启动service mysqld restart
.
引号用于字符串文字,用于列和表名称的后退.正确地转义变量.将您的查询更改为:
$query = "LOAD DATA INFILE ' . $uploadfile . ' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`)";
当您同时有多个查询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();
看看这是否会改变你的一切.
尝试使用其他语法来转义变量.使用以下内容:
$stmt = $dbh->prepare(" LOAD DATA INFILE '" . $uploadfile . "' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`) "); $stmt->execute();
PDO占位符只能用于值,而不能用于数据库,表或列名称!我认为错误来自于使用'::'
.'::'
比方说,将文件中的数据分隔符更改为'.'
.
作为检查的快速解决方法,您可以直接使用查询而无需准备:
$stmt = $dbh->query(" LOAD DATA INFILE '" . $uploadfile . "' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`) ");
如果它不起作用尝试更改数据分隔符或尝试::
以某种方式转义现有的delemiter().