Autor Zpráva
Enko
Profil
Ahoj,
mám skript, kterým stáhnu CSV soubor (v UTF-8 hodnoty oddělené středníkem) přes SFTP k sobě na server a data z něj uložím do své MySQL databáze. Vše funguje bezvadně, jen nevím, proč jsou české znaky poškozené i když mám podle sebe všude nastavené správné kódování. Když si stáhnu původní csv soubor přes SFTP, tak je kódování v UTF8, když si stáhnu skriptem uložený csv soubor k sobě na server, tak je kódování také UTF8, když tato data rozparsuji a uložím do DB, tak už jsou poškozené české znaky. Tabulka v databázi je nastavená na UTF-8. Níže přikládám svůj kód. Máte nějaké nápady, co mám špatně?

<?php

header('Content-Type: text/html; charset=utf-8');
ini_set("display_errors", 1);
error_reporting(E_ALL);

//files to download
$files = array();
$files[] = "/Sestavy_uzaverka/soubor-ke-stazeni.csv";
$localfile = "novy-nazev-stazeneho-souboru.csv";

set_include_path(get_include_path() . PATH_SEPARATOR . '../libs/phpseclib');
include('../libs/phpseclib/Net/SFTP.php');

//pripojeni k databazi
$spojeni = mysql_connect("localhost","dblogin","dbpass");

if(!$spojeni){
  $chyba[] = "Not connected to database.";
}
else{
  mysql_select_db("dbname"); 
  mysql_query("set names 'UTF-8'"); 
}

$sftp = new Net_SFTP('vzdaleny.ftpserver.cz');
if(!$sftp->login('login', 'password')){
  $chyba[] = "Not connected to SFTP server.";
  exit('Not connected to SFTP server.');
}
//--------- lets go to work  -----------

if(is_array($files)){
  foreach($files as $file){
    if($sftp->get($file, $localfile)){
      //echo "OK";
    }
    else{
      $chyba[] = "Soubor $file na vzdalenem serveru neexistuje nebo se ho nepodarilo ulozit.";
    }
  }
}
else{
  echo "Files neni pole";
}
//------ zpracovani nahranych CSV souboru -------//
 
if(file_exists($localfile)){ 
  $datetime = date("Y-m-d H:i:s", filemtime($localfile));
  $datetime2 = date("Y-m-d H:i:s");
  $seconds = abs(strtotime($datetime) - strtotime($datetime2));

  if($seconds < 60){  
    //jdeme zpracovat soubory z pole $files
    $row = 1;
    if(($handle = fopen($localfile, "r")) !== FALSE){
      while(($data = fgetcsv($handle, 0, ";")) !== FALSE){
        $num = count($data);
        for($c=0; $c < $num; $c++) {
          if($row != 1){
            $value[$row][$c] = mysql_real_escape_string($data[$c]);
          } 
        }
        $sql_insert = 'INSERT INTO tabulka (`osobni_cislo`, `nakl_stredisko`, `jmeno`, `kl_cinnost`)
                               VALUES
                               (\''.$value[$row][0].'\', \''.$value[$row][1].'\', \''.$value[$row][2].'\', \''.$value[$row][3].'\') 
                              ';
        if(mysql_query($sql_insert)){
          echo "Radek $row ulozen do DB.<br>";
        }
        else{
          echo "SQL chyba v radku $row: " . mysql_errno()." - ".mysql_error()."<br>";
        }
        $row++;
      }
      fclose($handle);
    }
  }
  else{
    $chyba[] = "Lokalne ulozeny soubor $localfile je starsi nez 60 vterin.<br>";
  }
}
else{
  $chyba[] = "Neexistuje lokalni soubor $localfile<br> ";
}  

if(is_array($chyba)){
  foreach($chyba as $print){
    echo $print;
  }
}
?>
Kajman
Profil
Zkuste před používáním fgetcsv nastavit např.
setlocale(LC_ALL, "en_US.UTF-8");
Enko
Profil
Kajman:
Děkuji za odpověd. Situace je stejná. V DB mám Collation na daných sloupcích i celé tabulky utf8_czech_ci. Přidal jsem na začátek toto: setlocale(LC_ALL,"cs_CZ.utf8"); i v modifikaci en_US a nepomohlo. Když si vypíšu $sql_insert do stránky, tak jsou české znaky v pořádku, ale jakmile předám tu proměnou do mysql_query, tak v DB je to již poškozené. Nemáte nějaké další nápady?
Enko
Profil
Tak drobný posun. Když nazačátku skriptu pustím toto
<?php
if(setlocale(LC_ALL,"en_US.UTF-8")){
  echo "setlocale on<br>";}
else{
  echo "setlocale off<br>";}
?>
Vrátí mi to TRUE

A když spustím toto:
<?php
if(setlocale(LC_ALL,"cs_CZ.UTF-8")){
  echo "setlocale on<br>";}
else{
  echo "setlocale off<br>";}
?>
Vrátí mi to FALSE. Ovšem s variantou en_US mám pořád poškozené kódování. Co ještě může být špatně?
Kajman
Profil
Ještě můžete zkusit
set names utf8
místo
set names 'UTF-8'
Enko
Profil
Kajman:
Ano, bylo to tím. Moc děkuju. Ale je to pro mě záhada, protože takto to používám několik let a fungovalo to v pořádku, ale na jiných serverech než tento.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: