繁体   English   中英

如何使用pdo驱动程序从php中的本地文件加载数据

[英]how to load data from local file in php with pdo driver

我有一个需要从csv文件将数据加载到mysql db中的函数,所以我写了一些代码:

try {

    $pdo = new PDO('mysql:host=localhost;dbname=borsino_ittico',
                   'XXXXX', 'XXXXX', 
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4",
                          PDO::MYSQL_ATTR_LOCAL_INFILE => true, 
                          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
                  );


} 
catch (PDOException $e) {
       $mex= "database connection failed: ".$e->getMessage();
       return $mex;
    }

其他代码

try {
    $affectedRows = $pdo->exec("
    LOAD DATA LOCAL INFILE ".$pdo->quote($file)." INTO TABLE ".
            $pdo->quote($dbTable)." FIELDS TERMINATED BY ';'
            LINES TERMINATED BY '\n,\\n'");

    $mex= "Loaded a total of $affectedRows records from this csv file.\n";
    return $mex;

} 
catch (PDOException $e) {
        $mex= "ATTENZIONE, ERRORE CARICAMENTO DATI: ".$e->getMessage();
        return $mex;
}

实际上,这似乎不起作用,并引发了异常:

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法有错误; 检查与您的MySQL服务器版本相对应的手册,以获取在asta字段终止符“;”附近使用的正确语法。 第1行以',\\ n''终止的行

第一个问题是关于$ file(资源):应该采用绝对/相对形式(例如c:\\ xxx \\ csvfile.csv或.. \\ xxx \\ csvfile.csv),或者我必须使用类似$csvFile=fopen($file,"r");的函数来公开它$csvFile=fopen($file,"r");

然后,我是否应该在$ affectedRows查询中使用像$pdo->quote()这样的pdo本机函数作为插入参数(例如文件,表名,分隔符,终止于的行)?

即使在某行上出现一些错误,我如何也可以强制执行查询?

您引用表格名称,产生

... INTO table 'asta' ...

'引号把东西变成字符串。 因此asta不再是表名,而只是一个带有字母as等的字符串。

标识符必须用反引号引起来:

... INTO table `asta` ...
               ^----^---
LINES TERMINATED BY '\n,\\n'

对我不起作用!!! 经过多次测试后,唯一的解决方案是删除双转义\\\\n

所以

`LINES TERMINATED BY '\n'`

即使我在某处读到了有关“转义” PHP的“ \\” simbol的需求,该方法仍然有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM