我有一个分号分隔的.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);
}
另外,请注意,您正在使用
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);
}