2

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

致命错误:未捕获异常 'PDOException' 并带有消息 'SQLSTATE[42000]:语法错误或访问冲突: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();
?>

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

4

2 回答 2

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));
于 2013-08-07T21:10:41.140 回答
0

key是 SQL 中的保留字。见下图

在此处输入图像描述

您可能会发现 CSV 中的某些列名可能是保留字,您需要对其进行转义。在 MySQL 中使用反引号。IE `key`

于 2013-08-07T21:35:07.843 回答