Featured Post

Once again, Polish Programmers are on the top

Today I would like to share a good news about Polish Programmers, who won the World Cup called “Hello World Open” located in Helsinki (Finland). Among over 2 500 programmers from 90 countries, our team from Poznań (named Need For C) was the best. It is not a big surprise that one of this...

Read More

[PL] Problem tysiąca i jednej kontrolki

Posted by evolic | Posted in Databases, Programming, Web development | Posted on 28-07-2014

Tags: , , , , , , , , , , , , , , , , , , , , , ,

0

Liczba tysiąc była przez wieki dla wielu osób liczbą magiczną. Łacina oznaczała ją literą M (łac. Millenium).

W roku 2000 wszyscy mieliśmy okazję doświadczyć tzw. pluskwy milenijnej lub problemu roku 2000, związanego z datowaniem. Otóż do roku 2000 w wielu systemach posługiwano się dwucyfrowym formatem określania daty np. rok 1992 zapisywano liczbą 92. Rok 2000 byłby w tym systemie zapisany jako 00, a obecny 2014 jako 14. Ale co w przypadku systemów obsługujących ludność? Ktoś mógł urodzić się zarówno w roku 1901 jak i 2001. W związku tym na masową skalę rozpoczął się proces aktualizacji oprogramowania na całym świecie.

Uważny Czytelnik zapytałby o związek liczby 2000 z obecnymi czasami, wszakże mamy rok 2014?

Otóż w tym wpisie chciałbym opisać dwa przypadki, jak najbardziej aktualne, a związane z liczbą 1000, będącą pewnym ograniczeniem, którego przekroczenie – osiągnięcie liczby 1001 lub większej… spowoduje błąd działania aplikacji internetowej.

Limit elementów wysyłanych w formularzach

W języku PHP istnieje ograniczenie na 1000 elementów formularza wysłanych do serwera. Jeśli na stronie mamy np. 2 pola typu text, 1050 checkbox’ów oraz 3 kolejne pola typu text, z których 2 przechowują datę – w przypadku zaznaczenie wszystkich checkbox’ów oraz wypełnienia pozostałych pól – tylko 1000 pierwszych elementów formularza odczyta skrypt przetwarzający przesłany formularz. A więc w przedstawionym przykładzie przesłane zostaną 2 pierwsze pola oraz 998 kolejnych checkbox’ów, kolejne 52 checkbox’y zostaną odznaczone, a 3 ostatnie pola zostaną wyczyszczone.

Rozwiązaniem tej sytuacji jest zwiększenie limitu

  • albo w pliku php.ini

  • albo w pliku .htaccess

Zmiana tego parametru może okazać się niewystarczająca w niektórych przypadkach, ze względu na ograniczenie wielkości przesyłanych danych, regulowane parametrem post_max_size.

Opcja ta domyślnie przyjmuje wartość 2MB i w niektórych przypadkach może okazać się niewystarczająca.

Podobnie jak w przypadku max_input_size wartość parametru możemy zmienić:

  • albo w pliku php.ini,
  • albo w pliku .htaccess

Ograniczenie bazy danych Oracle (ang. świątynia)

W minionym tygodniu miałem okazję natrafić również na drugi błąd związany z liczbą 1001, a był on związany z bazą danych Oracle.

Otóż okazuje się, że baza ta posiada ograniczenie na liczbę elementów w zapytaniu SQL, a dokładniej mówiąc w operatorze IN.

Na przykład:

Do momentu, gdy ilość elementów w IN jest mniejsza, bądź równa liczbie 1000 wszystko jest OK, ale po przekroczeniu tej liczby Oracle zwróci nam wyjątek.

Obejść problem możemy dzieląc np. 2050 elementów na trzy części:

  • dwie po 1000 elementów
  • oraz trzecią zawierającą 50 elementów.

Zapytanie SQL wyglądało by w tym przypadku następująco:

Drugim rozwiązaniem jest zmiana bazy Oracle na rzecz PostgreSQL, który pod wieloma względami nie ustępuje komercyjnemu konkurentowi i nie jest podatny (podobnie jak baza MySQL – obecnie będąca własnością firmy Oracle) na wspomnianą przypadłość.

Jednak migracja do open source’owego konkurenta wiąże się z wieloma zmianami technicznymi, choć zasadniczym jej plusem będzie redukcja kosztów, gdyż w przypadku bazy Oracle musimy ponosić dodatkowe koszty rozbudowując infrastrukturę firmy o nowe serwery, co dla niektórych firm może okazać się bardzo kosztowne.

Przydatne linki:

Write a comment