![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 30.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
nie mogę znaleść odpowiedzi na moje pytanie, które jest dość proste jednak z tego co widzę sprawia jakies problemy, bo nie mogę nic znaleść w sieci (IMG:style_emoticons/default/worriedsmiley.gif) Jak można w PHP 5.3 w optymalny sposób przekonwertować text np. "Ala ma kota" na ciąg binarny, tak aby zapisać to wszystko w bazie danych w polu BLOB w taki sposób aby można było to odczytać z powrotem jako text? W efekcie chcę uzyskać odpowiednia wartość aby zapisać do DB (Firebird) jako BLOB sub_type binary. "W sposób optymalny" mam na myśli coś lepszego niż przeglądanie textu po każdym znaczku i konwertowanie... to nie zadziała dla dużych ilości textu. Dodatkowo taka funkcja powinna przyjmować jako parametr kodowanie w jakim jest zakodowany text dla poprawnej zamiany, mam rację? Kombinowałem w tej sposób:
ale to nie działa poprawnie i wydajnie... (IMG:style_emoticons/default/worriedsmiley.gif) Próbowałem też czegoś takiego: ale to też nie działa poprawnie... W ASP.NET jest funkcja które przyjmuje właśnie jako parametr kodowanie oraz text i konwertuje do ciągu binarnego, jednak w PHP nie mogę znaleść odpowiednika, a wiem że się da to zrobić. Proszę o sugestie, z czego skorzystać i jakich funkcjo użyć w tym celu. Z góry dzięki! Ten post edytował iwosz 28.09.2012, 15:18:58 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. base_convert pracuje nad tekstem i zwraca tekst, więc jest tutaj kompletnie nieodpowiedni.
2. Praca z danymi binarnymi w PHP jest wyjątkowo nieprzyjazna. Nie istnieje typ zmiennej byte/char, typ integer jest zmiennej długości (SIC!) i jedyne co nam pozostaje to... tekst. Stringi w PHP można traktować jako tablicę typu byte/char (Google: binary string). 3. Na dobrą sprawę wszystko co musisz zrobić to upewnić się, że tekst jest w odpowiednim kodowaniu (iconv, mb_convert_encoding) i traktować tekst jako dane binarne od tego momentu. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 30.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
3. Na dobrą sprawę wszystko co musisz zrobić to upewnić się, że tekst jest w odpowiednim kodowaniu (iconv, mb_convert_encoding) i traktować tekst jako dane binarne od tego momentu. Rozumiem, dzięki pokombinuję w ten sposób, jednak czy text przed 'wepchnięciem' do bazy nie powinno się zamienić jawnie na ciąg binarny? Bo chodzi jeszcze o odczyt tych danych (IMG:style_emoticons/default/smile.gif) jak czysty text wrzucam do BLOBa to odczytując mam problem bo obiekt jest długości 0:
Zapisuję i odczytuję według dokumentacji, korzystając z funkcji ibase* function.ibase-blob-get Ten post edytował iwosz 1.10.2012, 09:38:50 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Tekst w PHP zawsze jest w formie binarnej. Jeżeli w wyniku użycia var_dump() wyświetli Ci się "5f1e" oznacza to tablicę następujących bajtów: 0x35 0x66 0x31 0x65. Jeżeli wyświetli się "01011110101" oznacza to tablicę następujących bajtów: 0x30 0x31 0x30 0x31 0x31 0x31 0x31 0x30 0x31 0x30 0x31. Jeżeli natomiast wyświetli Ci się "cześć" oznacza to tablicę następujących bajtów: 0x63 0x7a 0x65 0xc5 0x9b 0xc4 0x87.
Pamiętaj, że w każdym przypadku istotne jest kodowanie ciągu. W przypadku użycia UTF-16 w pierwszym przykładzie otrzymalibyśmy: 0x00 0x35 0x00 0x66 0x00 0x31 0x00 0x65. Pokaż kod dodający i pobierający dane z bazy. PS. Dlaczego nie korzystasz z PDO? Ten post edytował Crozin 1.10.2012, 10:02:11 |
|
|
![]() ![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 3 Dołączył: 30.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Doczytałem że są/były problemy z odczytywaniem dużych BLOBów i trzeba to robić paczkami więc testowo czytam pierwsze 8192 bajtów, jednak moje odczytane dane nie wyglądają dobrze a wykonałem taki test (wszystko zakodowane jest w UTF-8 w PHP i w DB):
A odczytałem tak:
Co dało taki wynik:
Przy czym wartość "4294967296" dostaję nie zależnie jaką wartość dodam jeśli nie będzie w ciapkach(''). Wartość "0x0000000100000000" dostaję zawsze niezależnie jaką wartość podam jeśli jest bez ciapek... więc o co tutaj chodzi!? Co dopiero mówić o konwertowaniu tego jakkolwiek... To są "przykłady książkowe" bez żadnych moich kombinacji i powinny działać "z automatu" ale nic z tego... obsługa BLOBów w PHP dla ibase to porażka... (IMG:style_emoticons/default/thumbsdownsmileyanim.gif) Uff, rozgryzłem to... jednak z przykrością stwierdzam że wbudowane funkcje ibase* częściowo nie działają prawidłowo. Jednak korzystając z rad Crozin'a spróbowałem "na chama" wpakować dane do BLOB'a i się udało (IMG:style_emoticons/default/smile.gif) Z odczytem już jest lepiej bo działa to tak jak powinno czyli mamy coś takiego:
Nie wiem jeszcze jak się zachowa taki odczyt (czyli całość na raz) dla na prawdę dużych danych, ponoć są z tym problemy, tak samo nie zadziała to gdy w definicji pola BLOB w bazie zadeklarujemy jawnie wielkość segmentu np:
Wtedy należy postępować tak jak w tym komentarzu: http://www.php.net/manual/pl/function.ibas...b-get.php#60192 i pobierać po kawałku dane zklejając końcowy wynik. Teraz to dla mnie proste i logiczne ale wcześniej widocznie miałem jakąś zaćmę... (IMG:style_emoticons/default/wstydnis.gif) Jeszcze raz dzięki Crozin za pomocne wskazówki! |
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.09.2025 - 07:53 |