2013-06-18 63 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