2012-01-16 165 views
-1

我使用這些將CSV內容導入MySQL數據庫的代碼。導入到MySQL的CSV字段驗證

<?php 
    $databasehost = "localhost"; 
    $databasename = "test"; 
    $databasetable = "sample"; 
    $databaseusername ="test"; 
    $databasepassword = ""; 
    $fieldseparator = ","; 
    $lineseparator = "\n"; 
    $csvfile = "filename.csv"; 
    $addauto = 0; 
    $save = 1; 
    $outputfile = "output.sql"; 


    if(!file_exists($csvfile)) { 
    echo "File not found. Make sure you specified the correct path.\n"; 
    exit; 
    } 

    $file = fopen($csvfile,"r"); 

    if(!$file) { 
    echo "Error opening data file.\n"; 
    exit; 
    } 

    $size = filesize($csvfile); 

    if(!$size) { 
    echo "File is empty.\n"; 
    exit; 
    } 

    $csvcontent = fread($file,$size); 

    fclose($file); 

    $con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error()); 
    @mysql_select_db($databasename) or die(mysql_error()); 

    $lines = 0; 
    $queries = ""; 
    $linearray = array(); 

    foreach(split($lineseparator,$csvcontent) as $line) { 

    $lines++; 

    $line = trim($line," \t"); 

    $line = str_replace("\r","",$line); 

    $line = str_replace("'","\'",$line); 

    $linearray = explode($fieldseparator,$line); 

    $linemysql = implode("','",$linearray); 

    if($addauto) 
      $query = "insert into $databasetable values('','$linemysql');"; 
    else 
    $query = "insert into $databasetable values('$linemysql');"; 

    $queries .= $query . "\n"; 

    @mysql_query($query); 
    } 

    @mysql_close($con); 

    if($save) { 

    if(!is_writable($outputfile)) { 
    echo "File is not writable, check permissions.\n"; 
    } 

else { 
    $file2 = fopen($outputfile,"w"); 

    if(!$file2) { 
     echo "Error writing to the output file.\n"; 
    } 
    else { 
     fwrite($file2,$queries); 
     fclose($file2); 
    } 
    } 

    } 

    echo "Found a total of $lines records in this csv file.\n"; 
?> 

但我希望對csv文件中的某些字段進行驗證。
例如,第二個字段是電子郵件,我希望檢查字符串是否包含「@」。
我可以知道如何/在哪裏添加代碼以進行此類驗證?

在此先感謝!

+0

你確定你不知道在哪裏添加這些驗證? – 2012-01-16 05:02:16

+1

Exactyl爲什麼你要做自己的csv解析閱讀? PHP有'fgetcsv()'它可以爲你讀/分裂 – 2012-01-16 05:04:49

+0

我只是一個初學者,在編程和php。 – Lloydworth 2012-01-16 05:23:53

回答

0

你可以使用正則表達式:

$lines++; 
$line = trim($line," \t"); 
$line = str_replace("\r","",$line); 
$line = str_replace("'","\'",$line); 
$linearray = explode($fieldseparator,$line); 
//add code for checking email string 
if (preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $linearray[1]) === 0) { 
//not a email string 
    conitnue; 
} 
$linemysql = implode("','",$linearray); 
+0

preg_match(「/ \ w +([ - +。] \ w +)@ \ w +([ - 。] \ w +)。\ w +([ - 。] \ w +)* /」是檢查其電子郵件? – Lloydworth 2012-01-16 05:36:59

0

使用內置功能fgetcsv()filter_var()和MySQL功能LOAD DATA

$handle = fopen("test.csv", "r"); 
$continue = true; 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE && $continue) { 
    // check for valid email (presuming it's in column 1) 
    $continue = filter_var($data[0], FILTER_VALIDATE_EMAIL); 
} 
fclose($handle); 

if($continue){ 
    // using LOAD DATA will be a lot quicker than individual queries! 
    $query = "LOAD DATA INFILE '/full/path/to/test.csv'"; 
}