![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Piszę stronę z niewielką bazą danych (mysql), ale napotkałem na problem, którego nie mogę znaleźć rozwiązania. Wypełniam jakieś pole formularza - np kod pocztowy: 05155 Po wysłaniu formularza w bazie zapisze się 5155. Co zrobić, żeby '0' nie było usuwane jeżeli jest pierwszym znakiem w rekordzie? Można by użyć funkcji LPAD, ale to zadziała, jeżeli długość rekordu jest stała? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
A jakiego typu jest pole? Jeśli liczbowego (INT etc), to nie ma w tym nic dziwnego. Nie ma liczb zaczynających się od cyfry 0. A skoro to nie liczba, to zapisuj to pola tekstowego (VARCHAR, CHAR itp)
Ten post edytował Mchl 6.03.2010, 20:44:50 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
A jakiego typu jest pole? Jeśli liczbowego (INT etc), to nie ma w tym nic dziwnego. Nie ma liczb zaczynających się od cyfry 0. Wiem, że typ liczbowy nie może być, dlatego dałem VARCHAR Cytat A skoro to nie liczba, to zapisuj to pola tekstowego (VARCHAR, CHAR itp) Problem w tym, że to nic nie daje. Zauważyłem jeszcze coś podczas edycji jakiejś wartości (w formularzu, a nie z poziomu phpmyadmina). Mam np 56325, z edytuję to 06325, to rekord zostanie zapisany poprawnie, czyli z '0' na początku. Jeżeli jednak podczas edycji zwiększę długość rekordu o '0' na początku, to już nie zostanie ono dopisane. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
A w PHP traktujesz tę wartość jako string czy jako liczbę? Jeżeli gdziekolwiek po drodze PHP rzuci Ci to na (int) to stracisz zera na początku.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Tak, zmienną traktuję jako string, dodatkowo nawet zrobiłem konwersję:
$_POST['kod'] = (string)$_POST['kod']; ale problem jest ciągle taki sam. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
No to przed samym wstawienim do bazy uzupełnij zerami do lewej i pamiętaj żeby w zapytaniu wstawiać wartość w cudzysłowach.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Trochę nie do końca rozumiem.
Pokażę w jaki sposób dodaję nowe rekord do bazy:
} |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Kod function add_dboddzial($kodpocztowy,$prefix) {
$prefix = mysql_real_escape_string($prefix); //tędy też może przejść injection! $kodpocztowy = mysql_real_escape_string(strpad($kodpocztowy,5,'0',STR_PAD_LEFT)); //uzupełnienie zerami z lewej strony do 5 znaków $sql = " INSERT INTO {$prefix}oddzial VALUES ('$kodPocztowy') "; ... } |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
W tym wierszu musiałem dodać '_' w nazwie funkcji str_pad() i już wszystko działa:
Cytat $kodpocztowy = mysql_real_escape_string(str_pad($kodpocztowy,5,'0',STR_PAD_LEFT)); $prefix = mysql_real_escape_string($prefix); //tędy też może przejść injection! Jak się tu zabezpieczyć przed atakiem - wystarczy, że będzie sesja? |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Sesja? A co ma do tego?
Po to dodałem mysql_real_escape_string do tej zmiennej, żeby ją zabezpieczyć. Zmienną $kodpocztowy można zamiast tego sprawdzać, czy składa się dokładnie z pięciu cyfr. Np. Kod $kodpocztowy = str_pad($kodpocztowy,5,'0',STR_PAD_LEFT)
if(!preg_match('/^\d{5}$/',$kodpocztowy)) { return false; // albo rzuć wyjątek } |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Już wszystko jasne, właśnie doczytałem w manualu o mysql_real_escape_string()
Co do warunku, to mam takowy, lecz zrobiłem do tego osobną funkcję, żeby nie powielać kodu: Cytat function spr_kodpocztowy($kodpocztowy) { if (strlen($kodpocztowy) != 5 || !is_numeric($kodpocztowy)){ return false; } else{ return true; }} Jeszcze raz dzięki za pomoc. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 855 Pomógł: 145 Dołączył: 17.07.2008 Skąd: High Memory Area Ostrzeżenie: (0%) ![]() ![]() |
Twoja funkcja przepuści np 0.123
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Tam jeszcze miało być jeszcze ctype_alnum(), ale Twoje rozwiązanie jest chyba bardziej optymalnie - no i mniej pisania.
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Typ pola: MEDIUMINT(5) z ustawionym ZERO FILL.
Do bazy wrzucasz normalnie tak jakby to była liczba, np.: 123 (zwróci Ci przy pobieraniu: 00123) |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Crozin, przetestowałem Twój sposób - działa idealnie.
Dziękuję Wam za pomoc. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 15.07.2025 - 21:11 |