我最近从mysql_切换到PDO,这真的很痛苦。一切似乎都很复杂。
过去,我开发了一个系统,用户可以在其中导入包含记录的csv。然后通过while循环将这些行导入数据库。它在mysql_query
上完美运作。但是在PDO上,每当我尝试导入超过3k行时,它总是会出现错误,Mysql已经消失,进程中断了。
这是一个真正的问题,因为我的文件包含超过600k行。我用Google搜索了很多,并且有很多不同的解决方案来解决问题。我试过这些但无济于事。我已将持久连接设置为false。这是连接到MYSQL的代码:
public function __construct($driver_options=null) {
try {
parent::__construct('mysql:host='.Database::DB_HOST.';port='.Database::DB_PORT.';dbname='.Database::DB_NAME,
Database::DB_USER, Database::DB_PASS,$driver_options);
$this->setAttribute(PDO::ATTR_TIMEOUT, 10000000000); // to show error
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // to show error
$this->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // defend sql injection
$this->setAttribute(PDO::ATTR_PERSISTENT, false); // defend sql injection
} catch(PDOException $e){
die('Uncaught exception: '. $e->getMessage());
}
}
那么这个问题有永久解决方案吗?或者我应该切换回mysql_
。
感谢。
答案 0 :(得分:0)
您应该使用mysql data infile从csv加载严重数据。
它非常快(就像插件一样非常愚蠢超快)语法很简单易用,你可以用它做任何你想做的事情 - 如果你从CSV加载它肯定应该做所有你想要的。
一个简单的代码示例(从文档中收集)看起来像这样:
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;
这会将data.txt文件加载到名为tbl_name
的表中。它写道,字段以逗号(普通的CSV东西)终止,每个字段都用双引号括起来 - 并且这些行使用返回Feed和新行作为中断。它还说要忽略第一行(可能在其中有标题)并从那里开始。