Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP MSSQL, Textarea
Forum PHP.pl > Forum > PHP
emiterani
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
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
No niestety muszę, ponieważ baza wcześniej byla stworzona i używana jest przez asp, ja próbuję aplikację na php przepisać.
emstawicki
Czy podczas połączenia z bazą danych ustawiasz SET NAMES?
emiterani
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
Spróbuj:
  1. $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
  1. $pdo->exec("set names KODOWANIE_BAZY");
emiterani
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
https://msdn.microsoft.com/en-us/library/ff...v=sql.105).aspx
kieruje do https://msdn.microsoft.com/en-us/library/ff...v=sql.105).aspx
PDO::SQLSRV_ATTR_ENCODING: Sets the character set encoding used by the driver to communicate with the server.
emstawicki
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
$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
To teraz przejdźmy do tego jak wyświetlasz to i jakie nagłówki na temat zestawu znaków wysyłają pliki html?
emiterani
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
charset działa od TDS 7.0

  1. /etc/freetds/freetds.conf


tam ustawić tds version = 7.0 oraz client charset =

mssql na linuxie powoduje sporo błędów
emiterani
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.