Funkcja include() przydaje się w wielu sytuacjach. Jest też parę sztuczek i kruczków z tym związanych (o których mowa w manualu PHP).
Mój skrypt dzielił się na kilka akcji, odpalanych w jednej instancji po kolei. Pierwsza akcja wrzucała parę rekordów do bazy, a potem zapisywała ich ID do tablicy. Ta tablica natomiast była eksportowana do pliku w formacie:
Kolejna akcja wczytywała tą tablicę (za pomocą polecenia $arr = include(’data.php’);), dokonywała na niej modyfikacji i ponownie zapisywała w podobny sposób, do tego samego pliku.
Po uprzednim przygotowaniu danych (przez akcje I i II), akcja III ponownie ładowała ten plik. Tutaj niestety był błąd, bo użyłem include_once() zamiast include(). Efekt tego był taki, że include_once() nie zwrócił tej tablicy, a jedynie przekazał wartość logiczną TRUE.
Sprawiło mi to niemały problem, ponieważ akcja III się wysypała, z powodu złych danych w zmiennej, a debugowanie było dość uciążliwe (ciężko było znaleźć błąd). Oczywiście łatwo domyślić się dlaczego tak się stalo. Z tego też powodu uczulam na użycie funkcji include_once w kontekście zwracania zmiennych. Zamiast tego należy użyć include().
Jak wspomniałem, takie zachowanie wynika ze specyfikacji działania funckji include_once(). Wpis ku pamięci.
Dzisiaj odbyliśmy małą walkę z wysłaniem metodą POST tablicy wielowymiarowej. Problemem było to, że CURL konwertował tablicę typu:
do:
Najwyraźniej PHPowy CURL spłaszcza takie tablice, robiąc straszne zamieszanie :) Rozwiązanie jest dość banalne. Trzeba “ręcznie” spłaszczyć taką tablicę do formatu:
W ten sposób odebrane dane będą identyczne z tymi co wysłano.
Miałem za zadanie zrobić import jakiś danych o uzytkownikach z pliku tekstowego. Użytkowników w bazie już miałem (jakieś 50k rekordów), import miał za zadanie uzupełnić ich dane.
Parsowanie pliku było dość banalne. Poboierałem z niego dane (login i reszta danych), później pobierałem z bazy id usera (po loginie) i robiłem resztę rzeczy. Wszystko było super, aż do momentu odpalenia. Plik z danymi był spory, ale po pół godziny pracy import nadal się nie zakończył!
Zastanawiałem się jak to przyspieszyć. Przypomniała mi się rzecz, o której tyle razy przypominał Dooshek - użycie tablic. Na czym polega cały myk? Otóż na początku pobierałem wszystkie loginy i id userów i zapisywałem do tablicy w formacie [login] => [uid]. Podczas importu danych z pliku sprawdzałem id usera z tablicy przez co pół godzinny import wykonał się nagle w 30sek. :)
Warto o tym szczególe pamiętać. Ja już któryś raz z rzędu o tym zapomniałem, a szkoda. Straciłem trochę czasu na optymalizację mojego importu.
Przy zawrotnej liczbie rekordów pewnie nie będzie warto robić takiej tablicy (ponieważ zje zasoby :) ), ale przy jakiejś mniejszej liczbie myślę, że warto.
Jakiś czas temu odkryłem bardzo ciekawą bibliotekę -
phpQuery. Czym ona jest ? Przedewszystkim jest to biblioteka pozwalająca na wyciąganie elementów HTMLa (po stronie PHP), za pomocą selektorów CSS.
Czy to się przydaje? Owszem, nawet bardzo. Przykładowych zastosowań jest wiele. My to wykorzystaliśmy przykładowo do “poprawiania” podczas zapisu embedowanych filmów z YT. Problem polegał na tym, że w dokumencie xHTML 1.1 Transitional nie można używać elementów <embed/>. Firefox i Opera sobie z tym radziły, IE natomiast sypał się i krzyczał, że nie może załadować strony.
Jak trzeba było to rozwiązać ? Musieliśmy pobrać z elementu <embed> atrybuty type i src, a później przepisać je do elementu <object> i <param name=”movie”>. Normalnie to byłoby pewnie masa roboty. Jakiś preg_match, preg_replace i inne cuda. Jak my to rozwiązaliśmy? Całkiem łatwo:
Wydaje się proste, prawda? Zalet jest wiele, wypunktuję najważniejsze:
- pobieranie elementów strony za pomocą selektorów CSS
- manipulowanie tymi elementami (dodawanie klas, stylow)
- pobieranie atrybutów wybranych elementów.
- iteracja na wielu elementach
- możliwość tworzenia nowych elementów, zastępowania starych oraz wyplucie tego wszystkiego jako HTML
- można nawet stworzyć za jego pomocą całego HTMLa (coś na zasadzie new Element(’div’))
Jakie dalsze plusy?
- łatwa obsługa - naprawdę w bardzo łatwy sposób można pobrać dowolny element, oraz modyfikować je. Wystarczy odrobinkę znać składnię jQuery, ale jest to bardzo intuicyjne
- w szybki sposób można “naprawiać” stronę (chociażby problemy z embedowanymi filmami YT)
- szybko możemy modyfikować dane, bez używania skomplikowanych regexpów/etc
- możemy parsować nie tylko HTMLa, praktycznie każdy XML przejdzie
Możliwości tej biblioteki są naprawdę spore. Pamiętajmy jednak, że nie zawsze dobrze jest wystawiać armatę przeciw komarowi. Ze względu na swój rozmiar może się okazać, że lepiej będzie użyć jakiś natywnych klas, które szybciej sobie poradzą z naszym problemem.
Natknąłem się na fajną
stronkę która opisuje problemy i ryzyka związane z używaniem UTFa w PHP - wyszczególnione są różne phpowe funkcje - moim zdaniem “must have” dla każdego programisty PHP.
Podejrzewam, że nie wszyscy wiedzą, że Firebug ma małą pomocną funkcjonalność “poboczną”, którą niedawno przypadkiem odkryłem. Jak wiadomo, gdyby nie Firebug to debugowanie zapytań ajaxowych byłoby w ogóle masakrą. Dzięki FB jakoś dajemy radę. Można sobie w funkcji zrobić var_dump’a, albo print_r’a i w konsoli FB wyłuskać wynik. Ale ze względu na wyświetlenie w konsoli html’a jako tekstu, var_dump praktycznie odpadał. Ale jeżeli ktoś czuje się bardziej związany emocjonalnie z var_dump’em ;) to w końcu dochodzimy do tego co znalazłem - jeżeli w odpowiedzi na zapytanie w konsoli FB mamy wysyp kodu html, można na nim kliknąć MMB/wałkiem, a Firefox otworzy nam go w nowej karcie, zinterpretowanego i pokolorowanego :)
That’s all, folks :) Mała rzecz, a cieszy ;)
ps. Tylko że nie zawsze to działa… ;P
W naszych serwisach bardzo często pojawia się zarządzanie cenami różnych produktów (wyliczanie cen, stawek VAT oraz innych skomplikowanych obliczeń). W większości przypadków podstawą jest cena netto, natomiast problem pojawia się, kiedy klient zażyczy aby podstawą była cena brutto!
Continue reading “Wykorzystanie ceny brutto w rachunkach aplikacji”
Część osób nie wie że istnieje możliwość dodania do PHP rozszerzenia pozwalającego na otwarcie połączenia z dowolną drukarką zainstalowana wcześniej w systemie operacyjnym i zmuszenia jej do wyplucia czego tylko zapragniemy. Aby tego dokonać należy:
- Pobrać odpowiednią bibliotekę (najlepiej ze strony
pecl4win).
- Skopiować
plik php_printer.dll dokatalogu ext w folderze gdzie zainstalowany jest PHP (np C:\Program Files\PHP\ext)
- Edytować plik php.ini (najczęściej znajduje się w
C:\WINDOWS) i dodać w częsci z rozszerzeniami (Windows Extensions) linijkę extension=php_printer.dll
Aby przekonać sie czy całość działa spróbuj uruchomić następujący kod:
Ten i więcej przykładów znajdziecie bezpośrednio na
http://pl.php.net/printer.
Część osób pewnie zapyta o zastosowanie tego typu rozwiązania. My wykorzystaliśmy tę funkcjonalność podczas drukowania kodów kreskowych. W rezultacie sprzedawca chcąc dodać nowy produkt, klika “wygeneruj nowy kod kreskowy” a drukarka automatycznie rozpoczyna drukowanie uprzednio wygenerowanego w php kodu.
Ograniczeniem może być brak odpowiednika dla systemu spoza rodziny Windows. A może zna ktoś takowy?
Wiadomym jest, że PHP jest językiem interpretowanym. Czasami jednak zachodzi potrzeba “upakowania” kodu PHP do jednego exeka tak, żeby bez interpretatora móc odpalić nasz skrypt. Do tego celu są wykorzystywane różne kompilatory PHP, które przepisują kod PHP na binarkę (są nawet stosowne funkcje w PHP).
Niedawno szukaliśmy dobrego programu, który mógłby spakować nasz kod PHP do pliku wykonywalnego. Znaleźliśmy program
Roadsend niestety okazał się nieprzydatny, ponieważ skompilowanie kodu PHP wymagało od nas sporo wysiłku, a efekty i tak były mizerne.
Na szczęście znaleźliśmy program
Bambalam, który w bezbolesny sposób pozwala na kompilację pliku PHP. Dodatkowo możemy ten kod spakować przy pomocy
UPXa. Zaletą tego programu jest możliwość dołączenia przeróżnych bibliotek. W naszym skrypcie była potrzebna biblioteka php_printer.dll. Wystarczyło pobrać odpowiednią wersję (o tym za chwilkę) wrzucić do katalogu z programem Bambalam i odpalić wspomniany program z opcją “-e:php_printer.dll”.
Niestety Bambalam ma dość sporą wadę. Ostatnia wersja wyszła w roku 2006 i nie ma wsparcia dla PHP5, także jesteśmy zmuszeni do porzucenia niektórych dobrodziejstw jakie niesie ze sobą PHP5.
Pomimo tej wady warto zainteresować się tym programem, czasami są sytuacje, że skompilowanie kodu PHP jest przydatne.
Dzisiaj Bartek odkrył interesującą rzecz o której ani On ani ja wcześniej nie wiedzieliśmy. Być może i ktoś z Was również o tym nie wie, więc chętnie opowiemy :) Generalnie chodzi o to że… koty nie pływają pod wodą…
Continue reading “Pływający kotek, czyli o korzystaniu z metod klasy A w obiekcie B.”