Har*_*vey 1 php mysql sql csv pdo
我正在尝试将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() . "<br/>";
die();
}
echo "</p>";
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多次,但是当我检查了我的数据库时,它仍然是空的.
我似乎无法弄清楚出了什么问题,你能帮助我吗?谢谢!
这是我得到的错误.
致命错误:带有消息'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));
要在输出中查看错误消息,只需初始化您的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
));
Run Code Online (Sandbox Code Playgroud)
之后您将能够看到错误.在更新中发布它我/我们将能够帮助你!
看一下PDO_MYSQL上的手册.
您可能还需要:
PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE
Run Code Online (Sandbox Code Playgroud)
注意,在构造新的数据库句柄时,此常量只能在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
Run Code Online (Sandbox Code Playgroud)
mysqld之后通过运行重新启动service mysqld restart.
引号用于字符串文字,用于列和表名称的后退.正确地转义变量.将您的查询更改为:
$query = "LOAD DATA INFILE ' . $uploadfile . ' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`)";
Run Code Online (Sandbox Code Playgroud)
当您同时有多个查询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();
Run Code Online (Sandbox Code Playgroud)
看看这是否会改变你的一切.
尝试使用其他语法来转义变量.使用以下内容:
$stmt = $dbh->prepare("
LOAD DATA INFILE
'" . $uploadfile . "'
INTO TABLE
`rating_table`
FIELDS TERMINATED BY
'::'
LINES TERMINATED BY
'\n' ( `userID`, `movieID`, `rate`, `timestamp`)
");
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
PDO占位符只能用于值,而不能用于数据库,表或列名称!我认为错误来自于使用'::'.'::'比方说,将文件中的数据分隔符更改为'.'.
作为检查的快速解决方法,您可以直接使用查询而无需准备:
$stmt = $dbh->query("
LOAD DATA INFILE
'" . $uploadfile . "'
INTO TABLE
`rating_table`
FIELDS TERMINATED BY
'::'
LINES TERMINATED BY
'\n' ( `userID`, `movieID`, `rate`, `timestamp`)
");
Run Code Online (Sandbox Code Playgroud)
如果它不起作用尝试更改数据分隔符或尝试::以某种方式转义现有的delemiter().
| 归档时间: |
|
| 查看次数: |
4793 次 |
| 最近记录: |