2013-06-18 103 views
0

我的PHP腳本工作時遇到了一些麻煩。使用PHP腳本將CSV上傳到MySQL。問題

我想要實現的: 在子頁面上,我想要一個非常簡單的CSV文件上載到MySQL數據庫。它需要DROP或TRUNCATE表和CREATE或INSERT INTO,這取決於以前的解決方案,這個CSV文件中的一些數據。

我的問題是,現在什麼: 我用PHP和MySQL相當初學者,這樣遇到問題搞清楚爲什麼我的腳本不能正常工作。

我的代碼:

的PHP:

$connect = mysql_connect("host","user","pass"); 
mysql_select_db("database",$connect); //select the table 

if ($_FILES[csv][size] > 0) { 

$file = $_FILES[csv][tmp_name]; 
$handle = fopen($file,"r"); 

mysql_query (" 
CREATE TABLE IF NOT EXISTS `database`.`table` (
`item_number` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_danish_ci NOT NULL , 
`item_desq` VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_danish_ci NOT NULL , 
`item_img_path` VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_danish_ci NULL , 
`item_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT , 
PRIMARY KEY ( `item_id`) 
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_danish_ci      
     "); 

do { 
if ($data[0]) { 
    mysql_query(" 
       INSERT INTO strand_items1 (item_number, item_desq, item_img_path) 
       VALUES 
         ( 
         '".addslashes($data[0])."', 
         '".addslashes($data[1])."', 
      '".addslashes($data[2])." 
        ) 
       "); 
} 
} while ($data = fgetcsv($handle,1000,";","\"")); 

header('Location: import_old.php?success=1'); die; 
} 

的HTML:

<body> 
    <form action="" method="post" enctype="multipart/form-data" name="form1" id="form1"> 
     Choose your file: <br /> 
     <input name="csv" type="file" id="csv" /> 
     <input type="submit" name="Submit" value="Submit" /> 
    </form> 
</body> 

的CSV:以CSV你的普通線看起來像這樣

"13371337";"Some description of the item";"NULL"; 

現在,結果:由此,我得到了一個「成功」的流程,但表中沒有數據,並且從我所能猜到的數據庫的某種類型的無限循環中,因爲它創建的數量不斷增加表中只有item_id自動遞增的表中空條目。 我哪裏錯了,是否有一個簡單的方法來解決這個問題?

這是我在這裏的第一個問題,我希望我能滿足所有要求。 (指出我的newb-ness;問題首先在meta.stackoverflow.com上發佈;))如果不是,請耐心等待 - 我將密切關注此問題,並快速回復任何回覆和requiests。

預先感謝您:)

+0

您正在使用[**的過時**數據庫API](http://stackoverflow.com/q/12859942/19068),並應使用[現代替代](http://php.net/manual/en/mysqlinfo.api.choosing.php) 'addslashes'不足以防止[SQL注入攻擊](http:// bobby-tables.com/)(和一個現代的API會讓你更容易[防守](http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php)從他們)。 – Quentin

+0

謝謝你的回覆Quentin。我意識到我缺少支持的SQL和PHP。但是,由於這不是我的能力領域,所以我沒有,也無法更新我對這些主題的瞭解。 因此,我希望你忽略所有的安全和老派功能用途。我(和我的僱主)決定不聘請開發人員,因此不關心這些問題:-) –

回答

0

您使用;分離器所以解決這個問題我有這樣的事情應該工作,它是不是這樣做的最佳方式,但由於@戴夫在如何做到這一點的提示...

if (isset($_POST['process'])) 
    { 
     echo "<h2>Importing...</h2>"; 

     set_time_limit(60); 
     $fileResult = move_uploaded_file($_FILES['csv']['tmp_name'], getcwd()."/tmp/somefile.csv"); 
     if(empty($fileResult)) 
     { 
      echo "<h1>Some error</h1>"; 
     } 
     else 
     { 
      if(($handle = fopen(getcwd()."/tmp/somefile.csv", "r")) !== false) 
      { 
       require_once 'dbController.php'; 
       $db_controller = new dbController(); 
       $db_connection = $db_controller->connectToDb(); 
       if($db_controller->conections_check == true) 
       { 
        $truncateTable = " 
         truncate table strand_items3 
        "; 
        $truncateTable = mysql_query($truncateTable); 
        $row = 1; 
        while (($data = fgetcsv($handle, 1000, ";")) !== false) 
        { 
         $itiemId = $data[0]; 
         $itemDescription = $data[1]; 

         $insertQuery = " 
         INSERT INTO `tablename` (`value`, `value`, `value`) 
         VALUES ('$itiemId', '$itemDescription', NULL) 
         "; 

         $insertQuery = mysql_query($insertQuery); 
        } 
       } 
       else 
       { 
        echo "Error connecting to the server"; 
       } 

      } 
      fclose($handle); 
      unlink(getcwd()."/tmp/somefile.csv"); 
     } 
     echo "Done..."; 
    } 
?> 
1

每次更簡單時只需截斷您的表。

這是一個基本的進口商,我昨晚給朋友寫了一個簡單的說法,但你應該明白。很顯然,我使用的mysqli這裏,所以你需要改變該位,以適應你的,你還可以在頂部的截斷增加(只是開始導入位後,將被罰款

if (isset($_POST['action']) && $_POST['action']=="beginimport") { 
    echo "<h4>Starting Import</h4><br />"; 
    // Ignore user abort and expand time limit 
    //ignore_user_abort(true); 
    set_time_limit(60); 
    $result = @move_uploaded_file($_FILES['clientimport']['tmp_name'], getcwd()."/tmp/siccodes.csv"); 
    if(empty($result)){ 
     echo "<span style=\"font-weight:bold;color:red;\">There was an error moving the uploaded file</span><br />"; 
    } else { 
     echo "<span style=\"font-weight:bold;color:green;\">Temp file created begining data parse<br /><br /></span>"; 
     if (($handle = fopen(getcwd()."/tmp/siccodes.csv", "r")) !== FALSE) { 
      $row = 0; 
      while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) { 
       $client = $db->queryUniqueObject("SELECT ClientID FROM tblcreditchecks WHERE RegNumber='".mysqli_real_escape_string($db->mysqli,$data[0])."'",ENABLE_DEBUG); 
       if ($data[2]>0) { 
        $db->execute("UPDATE tblcreditchecks SET TurnOver='".mysqli_real_escape_string($db->mysqli,$data[2])."' WHERE RegNumber='".mysqli_real_escape_string($db->mysqli,$data[0])."'",ENABLE_DEBUG); 
       } else { 
        echo "Turnover fail - ".$data[0]; 
       } 
       if ($client->ClientID>0) { 
        $db->execute("UPDATE tblclients SET SICCodes='".mysqli_real_escape_string($db->mysqli,$data[1])."' WHERE ID=".$client->ClientID,ENABLE_DEBUG); 
       } else { 
        echo " SIC fail - ".$data[0]; 
       } 

       echo " - IMPORTED - ".$data[0]."<br />"; 
       fcflush(); 
       set_time_limit(60); // reset timer on loop 
      } 
     } 
     fclose($handle); 
     unlink(getcwd()."/tmp/siccodes.csv"); 
    } 
    echo "COMPLETE"; 
} 
+0

感謝您的回答戴夫。我正在努力讓它在我們說話時發揮作用。將返回與反饋:) –

+0

,這是一個聰明的方式來做到這一點,謝謝@Dave – jycr753

+0

提示看起來像你使用分號分隔符,所以改變fgetcsv($ handle,10000,「;」) – Dave