Autor | Zpráva | ||
---|---|---|---|
Enko Profil |
#1 · Zasláno: 13. 12. 2016, 10:13:49
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 |
#2 · Zasláno: 13. 12. 2016, 12:07:00
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 |
#4 · Zasláno: 13. 12. 2016, 14:44:53
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>";} ?> A když spustím toto: <?php if(setlocale(LC_ALL,"cs_CZ.UTF-8")){ echo "setlocale on<br>";} else{ echo "setlocale off<br>";} ?> |
||
Kajman Profil |
#5 · Zasláno: 13. 12. 2016, 15:03:55
Ještě můžete zkusit
set names utf8 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. |
||
Časová prodleva: 7 let
|
0