2010-05-20 13 views
1

Je développe un script qui prend en entrée un csv, puis lit le fichier et insère son contenu dans une base de données mysql. Le problème survient lors de l'insertion des données dans la base de données. Il convertit UMLAUT en caractères aléatoires.Insertion d'UMLAUT dans la base de données mysql à l'aide d'un script php

FYI - Ma base de données est en latin_german_ci. [J'ai aussi essayé de le changer en UTF8]

Je suis capable d'afficher des caractères UMLAUT dans les navigateurs web mais quand j'essaie de les insérer dans une base de données via une requête sql, il insère des caractères aléatoires.

<?php 

function uploadCsv($filename){ 

    echo "filename - ".$filename."<br/>"; 

    if(isset($filename) || $filename == ""){ // return with an error msg. 

    }else{ 
     $pos = stripos($filename, ".csv"); 
     if($pos == 0 || $pos != strlen($filename)-4){ 
      //echo "invalid format"; 
      return ; 
     } 
    } 

    set_time_limit(0); 
    $error = ""; 
    $row = 0; 
    $handle = fopen($filename, "r"); 
    //echo "<br/>".$filename."<br/>"; 
    //echo "<br/>".$handle."<br/>"; 
    if($handle == null){ 

     return "unable to process"; 
    } 

    while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { 

     if ($row == 0) { 
      // this is the first line of the csv file 
      // it usually contains titles of columns 
      // do nothing. 
      $num = count($data); 
      //echo "num - ".$num."<br/>"; 
      if($num != 2){ 
       // echo "returning back"; 
       return "invalid CSV format."; 
      } 
     } 
     // this handles the rest of the lines of the csv file 
     $num = count($data); 
     $id = $data[0]; 
     $inserQuery = ""; 
     $inserQuery = "INSERT INTO `table` (
          `ID` , 
          `Productname` 
          ) 
          VALUES ("; 

     for ($c=0; $c < $num; $c++) { 
      if($c==0){ 
       $inserQuery .= " '". utf8_encode($data[$c])."'" ; 
      }else{ 
       $inserQuery .= ", '". utf8_encode($data[$c]) ."'" ; 
      } 
     } 
     $inserQuery .= ");"; 
     echo $inserQuery."<br/>"; 
     mysql_query($inserQuery); 
     if(mysql_affected_rows() == -1 || mysql_affected_rows() <1){ 
      echo "error<br/>"; 
     }else{ 
      echo "row inserted - ".$row." with ID = ".$id." <br/>"; 
     } 
     $row++; 
    } 
    fclose($handle); 
    return "1"; 
} 
?> 

S'il vous plaît aider ....

grâce

Répondre

2

même procédure ... S'il vous plaît voir

Whether to use "SET NAMES"

et

Is "SET CHARACTER SET utf8" necessary?

Essentiellement, il faut que vous disiez à MySQL quel jeu de caractères il devrait attendre du client (votre script PHP).

+1

Et vous devriez également vérifier l'encodage du fichier CSV et de vos paramètres régionaux ... Parce que le manuel PHP de fgetcsv indique: * Remarque: Le réglage des paramètres régionaux est pris en compte par cette fonction. Si LANG est par exemple En_US.UTF-8, les fichiers codés sur un octet sont mal lus par cette fonction. * – wimvds

+0

Comment modifier les paramètres régionaux du fichier CSV sous Windows? – mudit

+0

Dépend du programme que vous avez créé avec le fichier CSV, par ex. avec Excel vous êtes coincé avec le jeu de caractères par défaut (au moins autant que je sache). –

0

Pourquoi utilisez-vous utf8_encode() pour une base de données latine? Quel est le codage de votre page Web (HTTP Content-Type et HTML meta tags)? Quel est le codage du code source (vous pouvez le configurer dans votre éditeur)? Quel programme utilisez-vous pour afficher la base de données et quel encodage utilise-t-elle?