我正在使用PHP将CSV解析为MySQL表。
我的表中有时间戳列"文件"叫做#34; StartTime" (开始解析文件)," EndTime"(解析文件的结束)和" CreationDate"(创建行的时间)。有什么方法可以获得这些时间? NOW()是一个很好的解决方案吗?
我还有一个名为"有错误的行"这是在它们中有错误的行数,因此不会解析。如何检索CSV文件中有错误的行数? (带有错误的行将是类型错误的行,例如它应该是:[varchar,int,timestamp,timestamp,timestamp]]
这是我的代码:
function parse($file) {
$file_handle = fopen($file, "r"); //opens CSV
while (($row = fgetcsv($file_handle, 1000, ",")) !== false){
$file_name = basename($file);
$Rows_with_errors = ?;
$StartDate= date("Y-m-d H:i:s", time() ); //?
$EndDate=?;
$CreationDate=?;
$sql = "INSERT INTO file (Filename, TotalNumberOfRows, RowsWithErrors, StartDate, EndDate, CreationDate)
VALUES('$file_name','$Total_nr_of_Rows', '$Rows_with_errors', '$StartDate', '$EndDate', '$CreationDate')";
global $conn;
$conn->query($sql); //executes the query
}
if ($sql)
{
echo 'Data uploaded to database!';
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}
答案 0 :(得分:0)
我从不这样做,希望这有效。解释在代码中。
<?php
function parse($file) {
//Initialize some variables here. Probably in some constants etc.
$dateRegex = '|^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$|'; //Just a rough check. I purposely skip the case of like 9999-99-99 99:99:99. Up to you to refine this.
$dateFormat = 'Y-m-d H:i:s';
//In fact checking the file exist or not is probably useful too:
//if (is_file($file)) ...
//Opens CSV in read mode
$file_handle = fopen($file, "r");
//We don't need to put this in the loop since it's a one time job
$file_name = basename($file);
//We also initialize the variable outside the while loop so that we can increment it
$Rows_with_errors = 0;
$Total_nr_of_Rows = 0;
//StartDate of the parsing, shouldn't it be outside of the while loop too?
//Also, using "date" will gives you the time in the timezone that you set in your php.ini's date.timezone property.
//Using "gmdate" will gives you the time in GMT time.
$StartDate = date($dateFormat, time());
while (($row = fgetcsv($file_handle, 1000, ",")) !== false) {
++$Total_nr_of_Rows;
//So here, we are looping row by row. Do your checking here:
if (!(is_string($row[0]) &&
is_numeric($row[1]) &&
preg_match($dateRegex, $row[2]) &&
preg_match($dateRegex, $row[3]) &&
preg_match($dateRegex, $row[4]))) {
//Increment the error
++$Rows_with_errors;
}
}
//That's it. We insert it now
//Creation date & end date, probably the same, no? we initialize here:
$CreationDate = $EndDate = date($dateFormat, time());
//This is bad. There is no escaping, and YOU ARE RISK OF QUERY INJECTION FROM THE $file_name VARIABLE.
//I won't discuss it here since this is not the scope of the question.
$sql = "INSERT INTO file (Filename, TotalNumberOfRows, RowsWithErrors, StartDate, EndDate, CreationDate)
VALUES('$file_name','$Total_nr_of_Rows', '$Rows_with_errors', '$StartDate', '$EndDate', '$CreationDate')";
global $conn;
$conn->query($sql); //executes the query
if ($sql){
echo 'Data uploaded to database!';
}else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}