2

次のコードを使用して、csvをmysqlにインポートしています。

 if($_POST['sform'] == "1")
{
     $fname = $_FILES['upload']['name'];        
     $chk_ext = explode(".",$fname);        
     if(strtolower($chk_ext[1]) == "csv")
     { 
        $filename = $_FILES['upload']['tmp_name'];
        $row = 1;
        if (($handle = fopen($filename, "r")) !== FALSE)
        {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
              {
                $row++;
                $data_entries[] = $data ;
              }
              fclose($handle);
         }
         foreach($data_entries as $line)
         {
              $sql = "INSERT into testposts(ID,UID,title,tags,desc) values('','$data[0]','$data[1]','$data[2]','$data[3]')";
$conn->execute($sql);
          $conn->execute($line);
         }
         $msg = "Successfully Imported";
     }
     else
     {
         $error = "Invalid File";
     }   
}

更新しようとすると、すべての値が0として更新されます

私のcsvファイルは次のとおりです(例)

1,title,tags,send2

自動インクリメントされるため、PID値は含まれていません

だから私は私の2番目のバリエーションで試しました

if($_POST['sform'] == "1")
{
     $fname = $_FILES['upload']['name'];        
     $chk_ext = explode(".",$fname);        
     if(strtolower($chk_ext[1]) == "csv")
     { 
 $filename = $_FILES['upload']['tmp_name'];
     $handle = fopen($filename, "r");

     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
     {
              $sql = "INSERT into testposts(ID,UID,title,tags,desc) values('','$data[0]','$data[1]','$data[2]','$data[3]')";
          mysql_query($sql) or die(mysql_error());
          //$conn->execute($sql);
         }
         $msg = "Successfully Imported";
     }
     else
     {
         $error = "Invalid File";
     }   
}

2番目のコードでは、期待どおりに値を正しくアップロードしますが、2回挿入します。

どんな助けでも大歓迎です、ありがとう

4

1 に答える 1

0

2番目のバージョンが機能することに驚いています:

$sql = "INSERT into testposts(ID,UID,title,tags,desc) values('','$data[0]','$data[1]','$data[2]','$data[3]','$data[4]')";

列名よりも多くの値があります。あり$data[4]ますか?

警告を有効にすると、データが php 警告で構成され、これらの警告に'文字が含まれ、クエリが壊れる可能性があります。

これらのようなSQLインジェクションの問題やエラーを避けるために、PDO /準備されたステートメントに本当に切り替える必要があります。

于 2012-05-24T17:28:11.007 に答える