Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zero jest usuwane, jeżeli jest pierwszym znakiem w rekordzie, Jakn temu zaradzić?
joka13
post 6.03.2010, 19:55:48
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?
Go to the top of the page
+Quote Post
Mchl
post 6.03.2010, 20:44:21
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
Go to the top of the page
+Quote Post
joka13
post 6.03.2010, 20:58:08
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 31.07.2009

Ostrzeżenie: (0%)
-----


Cytat(Mchl @ 6.03.2010, 20:44:21 ) *
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.
Go to the top of the page
+Quote Post
Mchl
post 6.03.2010, 21:45:06
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.
Go to the top of the page
+Quote Post
joka13
post 6.03.2010, 23:07:02
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.
Go to the top of the page
+Quote Post
Mchl
post 6.03.2010, 23:31:45
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.
Go to the top of the page
+Quote Post
joka13
post 7.03.2010, 11:23:01
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:
  1. <?php
  2. if(isset($_POST['submit'])){
  3. if(empty($_POST['kodpocztowy_oddz'])){
  4. $errors[] = 'Przynajmniej jedno pole nie zostało uzupełnione. Proszę uzupełnić brakujące dane.';
  5. } else {
  6. xxxxxxxxxxxxxxxxxxxxxxxxxx
  7. }
  8. if(empty($errors)){
  9. if(!add_dboddzial($_POST['kodpocztowy']),$mysql['prefix']){ //tu jest wywołana funkcja add_dboddzial()
  10. die('Wystąpił błąd podczas wysyłania danych do bazy.');
  11. }
  12. ?>
  13.  
  14.  
  15. //Część z htmla:
  16. <tr>
  17. <td width="53%"><input name="kodpocztowy" maxlength="5" type="text" id="kodpocztowy"<? if(isset($_POST['kodpocztowy'])) print ' value="'.$_POST['kodpocztowy'].'"'; ?> /></td>
  18. </tr>
  19.  
  20.  
  21. //funbkcja add_dboddzial() jest w innym pliku, w tej funkcji jest zapis do bazy - tak wygląda zapytanie:
  22. function add_dboddzial($kodpocztowy,$prefix){
  23. $sql = 'INSERT INTO `'.$prefix.'oddzial` (`kodpocztowy`) '
  24. . ' VALUES ( \'\', \''.mysql_escape_string($kodpocztowy).'\')';

}
Go to the top of the page
+Quote Post
Mchl
post 7.03.2010, 12:49:28
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')
  ";
  ...
}
Go to the top of the page
+Quote Post
joka13
post 7.03.2010, 15:10:23
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));





Cytat(Mchl @ 7.03.2010, 12:49:28 ) *
$prefix = mysql_real_escape_string($prefix); //tędy też może przejść injection!

Jak się tu zabezpieczyć przed atakiem - wystarczy, że będzie sesja?
Go to the top of the page
+Quote Post
Mchl
post 7.03.2010, 15:18:02
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
}
Go to the top of the page
+Quote Post
joka13
post 7.03.2010, 15:26:50
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.
Go to the top of the page
+Quote Post
Mchl
post 7.03.2010, 15:58:34
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
Go to the top of the page
+Quote Post
joka13
post 7.03.2010, 17:02:09
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.
Go to the top of the page
+Quote Post
Crozin
post 7.03.2010, 17:46:10
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)
Go to the top of the page
+Quote Post
joka13
post 7.03.2010, 17:57:47
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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.07.2025 - 21:11