通过进行PDO调用,使用CSV文件创建数据库表

时间:2013-08-07 20:48:57

标签: php pdo fgetcsv import-from-csv

我一直在尝试使用CSV文件的第一行创建数据库,但是我一直收到有关我的PDO语法的错误。显然$columns变量中的varchar(250)出现了问题:

  

致命错误:带有消息'SQLSTATE [42000]的未捕获异常'PDOException':语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行的“varchar(250)”附近使用正确的语法

代码如下:

<?
/********************************************************************************/
// Parameters: filename.csv table_name

$argv = 'seo_domains.csv seo_domains';

if($argv[1]) { $file = $argv[1]; }
else {
    echo "Please provide a file name\n"; exit; 
}
if($argv[2]) { $table = $argv[2]; }
else {
    $table = pathinfo($file);
    $table = 'seo_domains';
}

/********************************************************************************/
// Get the first row to create the column headings

$fp = fopen('seo_domains.csv', 'r');
$frow = fgetcsv($fp);

$ccount = 0;
foreach($frow as $column) {
    $ccount++;
    if($columns) $columns .= ', ';
    $columns .= "$column varchar(250)";
}

$qry = $dbcon->prepare("CREATE TABLE if not exists $table ($columns);");
$qry->execute();

/********************************************************************************/
// Import the data into the newly created table.

$file = $file;
$qry = $dbcon->prepare("load data infile '$file' into table $table fields terminated by ',' ignore 1 lines");
$qry->execute();
?>

我将$fp fopen更改为静态值,而不是使用$file,因为显然编码上述代码的人没有提及如何格式化$argv变量。是的,我已经根据他在第一行的“参数”评论尝试了格式化,但仍无济于事。我还将$table变量静态更改为“seo_domains”,因为$argv变量未正确拆分。我想知道是否有人想知道为什么我的数据库会导致所描述的错误,而不是重新编码上面的代码。任何帮助表示赞赏。只是尝试根据提供的CSV文件的第一行创建表。创建后,我希望继续按常规方式在CSV中插入第1行下面的所有行值。

2 个答案:

答案 0 :(得分:0)

尝试:

CREATE TABLE if not exists seo_domains (Domain varchar(250), Server varchar(250), IP varchar(250), Username varchar(250), Password varchar(250), Nameserver varchar(250), NameCheap varchar(250), GA varchar(250), WMT varchar(250), SB varchar(250), GAW varchar(250), notes varchar(250), BlankField varchar(250), id INT KEY NOT NULL AUTO_INCREMENT varchar(250));

答案 1 :(得分:0)

key是SQL中的reserved字。见下图

enter image description here

您可能会发现CSV中的某些列名称可能是保留字,因此您需要将它们转义。在MySQL中使用了反引号。即`key`