使用PHP将分离值文件导入数据库时​​,如何删除或避免插入列标题?

时间:2010-03-04 17:44:26

标签: php mysql database

我有分号分隔的.dat文件,我想读取该文件并将其内容存储到数据库中。

.dat档案的结构:

PARTYID;PARTYCODE;CONNECTION
256;319;234
879;435;135

导入.dat文件的SQL:

     $sql_qry = "INSERT INTO DatTable (PARTYID,PARTYCODE,CONNECTIONID) 
                 VALUES ('$data[0]','$data[1]','$data[2]')";
                $stmt = $this->connection->prepare($sql_qry);
                $stmt->execute();
                $this->checkForErrors($stmt);

现在如果我运行脚本而不是Db结构:

  PARTYID PARTYCODE CONNECTION
------------------------------
1 PARTYID PARTYCODE CONNECTION
2 256     319       234
3 879     435       135

显然,我不需要表格中的列标题(PARTYID PARTYCODE CONNECTION行)......那么我应该如何删除它们呢?

有趣的答案:

Just Insert fgetcsv($fp, 1000, ","); at the first line and while loop will start from second line.

3 个答案:

答案 0 :(得分:3)

您有两种解决方案:

  • 您可以不使用.dat文件的第一行
    • 我想你是在逐行阅读......
    • 我是这样,只是不要使用第一行(您可以使用变量作为计数器来了解您是否在第一行)
  • 或者,您可以在将数据插入数据库之前测试当前行是否仅包含整数/数字。


如果您选择第二个解决方案,以下是可以作为起点的一部分代码:

if (in_numeric($data[0]) && is_numeric($data[1]) && is_numeric($data[2])) {
    $sql_qry = "INSERT INTO DatTable (DF_PARTY_ID,DF_PARTY_CODE,DF_CONNECTION_ID) 
                 VALUES ('$data[0]','$data[1]','$data[2]')";
    $stmt = $this->connection->prepare($sql_qry);
    $stmt->execute();
    $this->checkForErrors($stmt);
}


另请注意,您使用的是prepareexecute,这似乎表示您正在尝试使用预准备语句。

使用准备好的陈述时,你不应该像你在做的那样;你应该:

  • 只有一次:使用数据占位符
  • 准备声明
  • 对于每一行,绑定值
    • 并执行声明

你不应该:

  • 为每行准备声明
  • 将数据注入SQL查询,而不是使用占位符。

这意味着您的代码应该看起来有点像(未经过测试,因此您可能需要更改一些内容)

// First, prepare the statement, using placeholders
$query = "INSERT INTO DatTable (DF_PARTY_ID,DF_PARTY_CODE,DF_CONNECTION_ID) 
          VALUES (:party_id, :party_code, :connection_id)";
$stmt = $this->connection->prepare($query);

if (in_numeric($data[0]) && is_numeric($data[1]) && is_numeric($data[2])) {
    // Then, for each line : bind the parameters
    $stmt->bindValue(':party_id', $data[0], PDO::PARAM_INT);
    $stmt->bindValue(':party_code', $data[1], PDO::PARAM_INT);
    $stmt->bindValue(':connection_id', $data[2], PDO::PARAM_INT);

    // And execute the statement
    $stmt->execute();

    $this->checkForErrors($stmt);
}

答案 1 :(得分:2)

这是DBA每天完成的常见任务。它可以使用LOAD命令在mysql中完成。无需使用PHP。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

LOAD DATA LOCAL INFILE 'file.dat' 
INTO TABLE table_name
FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n' 
(PARTYID, PARTYCODE, CONNECTIONID)
IGNORE 1 LINES;

答案 2 :(得分:0)

仅强制插入正确的数据类型。

if(is_numeric($data[0])){ ... your code ... }

更准确地说,您应该强制列不允许在数据库级别插入错误数据,因此列出的列应该是整数类型,因为它们是ID,而不是它们当前的任何类型(varchar) , 也许)。然后你可以适当地处理错误,例如通过忽略和丢弃不适当的数据。