Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zero jest usuwane, jeżeli jest pierwszym znakiem w rekordzie
Forum PHP.pl > Forum > Bazy danych > MySQL
joka13
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?
Mchl
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)
joka13
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.
Mchl
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.
joka13
Tak, zmienną traktuję jako string, dodatkowo nawet zrobiłem konwersję:
$_POST['kod'] = (string)$_POST['kod'];
ale problem jest ciągle taki sam.
Mchl
No to przed samym wstawienim do bazy uzupełnij zerami do lewej i pamiętaj żeby w zapytaniu wstawiać wartość w cudzysłowach.
joka13
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).'\')';

}
Mchl
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')
  ";
  ...
}
joka13
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?
Mchl
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
}
joka13
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.
Mchl
Twoja funkcja przepuści np 0.123
joka13
Tam jeszcze miało być jeszcze ctype_alnum(), ale Twoje rozwiązanie jest chyba bardziej optymalnie - no i mniej pisania.
Crozin
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)
joka13
Crozin, przetestowałem Twój sposób - działa idealnie.
Dziękuję Wam za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.