我有分号分隔的.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.
答案 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);
}
另请注意,您使用的是prepare
和execute
,这似乎表示您正在尝试使用预准备语句。
使用准备好的陈述时,你不应该像你在做的那样;你应该:
你不应该:
这意味着您的代码应该看起来有点像(未经过测试,因此您可能需要更改一些内容):
// 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) , 也许)。然后你可以适当地处理错误,例如通过忽略和丢弃不适当的数据。