【问题标题】:Creating a database table using a CSV file by making PDO calls通过进行 PDO 调用,使用 CSV 文件创建数据库表
【发布时间】:2013-08-07 20:48:57
【问题描述】:

我一直在尝试使用 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();
?>

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

【问题讨论】:

  • 你能说出最后的CREATE TABLE if not exists $table ($columns)
  • 我可以模拟回显,但您不能回显 PDO 准备语句。以下是以下结果:$STMT = 'CREATE TABLE if not exists '.$table.' ('.$columns.');'; echo $STMT.'&lt;br/&gt;'; 结果:CREATE TABLE if not exists o (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), key varchar(250)); 显然“如果不存在 o,则创建表”不正确。 "o" 是我设置的 $table 。
  • 尝试省略, KEY VARCHAR(250)并添加到开头id int auto_increment
  • 好的,所以我将 $table var 移到了第一个 if 语句之外,并且至少能够得到正确的 if exists "seo_domains" 来回显。 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), key varchar(250)); 仍然收到关于 varchar(250) 的相同错误。

标签: php pdo fgetcsv import-from-csv


【解决方案1】:

尝试:

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));

【讨论】:

    【解决方案2】:

    key 是 SQL 中的 reserved 单词。见下图

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

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多