我有一个分号分隔的.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 structure,则如下所示:
  PARTYID PARTYCODE CONNECTION
------------------------------
1 PARTYID PARTYCODE CONNECTION
2 256     319       234
3 879     435       135

显然,我不需要表中的列标头(PARTYID PARTY代码连接行)…那我该如何移除它们呢?
有趣的答案:
Just Insert fgetcsv($fp, 1000, ","); at the first line and while loop will start from second line.

最佳答案

有两种解决方案:
您不能使用.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);
}

07-24 09:37
查看更多