| 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: 10 let
|
|||
0