emiterani
13.10.2016, 10:52:39
Witam. Mam problem prawidłowo wyświetlanym tekstem w polu textarea.
Konfiguracja:
1. www - apache na linuxie
2. php 5.6 na linuxie
3. baza MSSQL 2008 na windowsie
Opis problemu:
Poprzez skrypt dokonuj ę zapisu do bazy (MSSQL) danych min. z textarea. Tekst przekodowywany jest na CP1250 poprzez iconv. W bazie tekst widoczy jest poprawnie, natmiast po pobraniu z bazy i ponownym wyświetleniu w polu textarea już nie jest poprawny. Kombinowałem z przekodowaniem poprzez iconv ale to nic nie daje, tym bardziej że testowy tekst jest bez polskich liter. Tekst w innych tagach html wyświetla się prawidłowo, natomiast w textarea:
t?e?s?t?
coś takiego jest, znaki zapytania na czarnym tle. Myślałem że to problem z kodowaniem znaków ale to nie to. Czy ktoś spotkał się z podobnym problemem i rozwiązał go?
Adam
emstawicki
13.10.2016, 11:02:44
Czy musisz używać kodowania cp-1250?
Jeżeli nie to przerób wszystko na utf-8 i trzymaj się jednego standardu kodowania wszędzie (
http://phpcoding.rf.gd/2016/07/01/characte...eful-practices/)
emiterani
13.10.2016, 11:12:02
No niestety muszę, ponieważ baza wcześniej byla stworzona i używana jest przez asp, ja próbuję aplikację na php przepisać.
emstawicki
13.10.2016, 11:20:10
Czy podczas połączenia z bazą danych ustawiasz SET NAMES?
emiterani
13.10.2016, 11:33:55
do połączenia z mssql korzystam z:
$pdo=new \PDO ("dblib:host=$this->serverName:$this->serverPort;dbname:$this->dbName","$this->dbUser","$this->dbPass");
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
Szukałem jakieś zminnej ustawienia SET NAME ale nie widzę. Możesz mnie naprowadzić czego mam szukać, gdzie co ustawić. W innym sterowniku jest CHARSET ale w tym takiej opcji nie widzę.
emstawicki
13.10.2016, 11:38:38
Spróbuj:
$pdo=new \PDO ("dblib:host=$this->serverName:$this->serverPort;dbname:$this->dbName,charset=KODOWANIE_BAZY","$this->dbUser","$this->dbPass");
albo po utworzeniu klasy połączenia PDO
$pdo->exec("set names KODOWANIE_BAZY");
emiterani
13.10.2016, 11:53:43
Niestety w pierwszym i drugim przypadku bład 500:
1. PDO::__construct() expects parameter 4 to be array, string given in
2. PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 195 General SQL Server error: Check messages from the SQL Server [195] (severity 15) []' in /var/www/html/kc-viewer/App/DB/db.class.php:32\nStack trace:\n#0 /var/www/html/kc-viewer/App/DB/db.class.php(32): PDO->exec('set names CP125...')\n#1
Tylko wydaje mi się że to nie jest problem kodowania, bo np w input wyświetla prawidłowo tę samą treść, coś musi być nie tak z textarea.
viking
13.10.2016, 11:58:15
emstawicki
13.10.2016, 12:02:00
1. zamiast przecinka średnik do oddzielania argumentów i to jest nadal jeden parametr.
2. Podałeś takie kodowanie jakie masz zdefiniowane na serwerze bazy danych?
MSSQ sprawdź:
Kod
SELECT SERVERPROPERTY('Collation')
emiterani
13.10.2016, 12:28:30
$pdo=new \PDO ("dblib:host=$this->serverName:$this->serverPort;dbname:$this->dbName,charset:CP1250","$this->dbUser","$this->dbPass");
Nie ma 500 ale nic to nie zmieniło, ani cp1250 ani utf-8, dalej bez zmiany.
Polish_CI_AS
Taki ustawiłem ale dalej to samo.
emstawicki
13.10.2016, 12:40:56
To teraz przejdźmy do tego jak wyświetlasz to i jakie nagłówki na temat zestawu znaków wysyłają pliki html?
emiterani
13.10.2016, 12:58:48
Content-Type text/html; charset=UTF-8
a wyświetlam poprzez print i dalej leci do jquery gdzie następuje załadowanie do div-a
$.ajax({
url:'App/BaseScans/detailScan.php',
type:'POST',
data:{'call':call,'id':id},
success:function(rew){
$("#details").append(rew);
}
});
php
$tmp[0]['Opis'] - pobrany z bazy.
print '<textarea id=opis wrap=physical >'.$tmp[0]['Opis'].'</textarea>';
memory
13.10.2016, 13:14:45
charset działa od TDS 7.0
/etc/freetds/freetds.conf
tam ustawić tds version = 7.0 oraz client charset =
mssql na linuxie powoduje sporo błędów
emiterani
14.10.2016, 10:57:30
ustawione, bez zmiany.
Nie wiem czy to jest ważne ale zrobiłem taki test, wczytałem do texarea wartość z innej kolumny, i wyświetlił się prawidłowo. To Mnie zastanowiło i sprawdziłem jakiego rodzaju pole jest to które wczytuję do textarea. Okazuje sie że jest to nvarchar(MAX) i tu jest chyba problem. Aby to odczytać muszę stosować CONVERT(binary(MAX) Opis as Opis). Może to pomoże rozwiązać problem.
Dobra problem rozwiązany, tak jak przypuszczałem problemem jest pole typu nvarchar(MAX), po zmianie na nvarchar(2000) wszystko działa jak należy.
Dziękuję za poświecony czas.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.