一尘不染

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

php

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

.dat文件结构:

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

SQL导入.dat文件:

     $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 row)…那么如何删除它们呢?


阅读 328

收藏
2021-04-15

共1个答案

一尘不染

您有两种解决方案:

  • 您不能使用.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);
}

另外,请注意,您正在使用prepare和execute,这似乎表明您正在尝试使用准备好的语句。

当使用准备好的语句时,您不应该像做的那样做。你应该 :

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

你不应该 :

  • 准备每一行的声明
  • 将数据注入到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);
}
2021-04-15