Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL][PHP]funkcja str_replace - zamiana znaków, zamiana, zapis i odczyt z bazy danych
kosmic
post 20.12.2011, 08:56:17
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 31.10.2007

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


witam,
mam mały problem i troszke sobie nie radzę z jego rozwiązaniem, a mianowicie chodzi mi o pewnego typu sytuację, jaka zachodzi w moim skrypcie...

powiedzmy, że chcę zapisać do bazy daną cyfrę, a dokładniej kwotę, którą pobieram z pliku test.csv !
no i pobrana kwota to powiedzmy: 1.234.567,89 zł lub 1 234 567,89zł - w zależności jak sobie wyeksportuję plik,
ale zmierzam do sedna, ponieważ aby poprawnie i czytelnie było to później odczytane, to chciałbym zapisać to do bazy w taki sposób: 1 234 567,89zł, choć te grosze to już są mało istotne i może być to bez nich...

chodzi o to, że potrzebuje później wyciągać te dane, aby dokładnie i czytelnie były widoczne, do tego jeśli takich liczb jest 500, to najmniejszą kwotę i największą itp... no i podmieniam sobie znaki np:

Kod
$nd2 = trim(str_replace(".", " ", $d2));
lub
$nd2 = trim(str_replace(" ", "", $d2));


no i teraz jeśli pole tabeli w sql ma atrybut INT: to zapisuje się tylko pierwsza liczba, do pierwszej spacji, np: 1, chyba że zamienię kropkę lub spację na puste pole i liczba jest zapisana bez żadnego odstępu: 1234567
i w tym przypadku swobodnie znajde min, max i pobiorę żądaną kwotę, ale wyświetla mi się właśnie jako jeden ciąg cyfr, a to nie jest już czytelne i nie łądnie wygląda,

jeśli natomiast atrybut pola jest powiedzmy varchar, to mogę zapisać tak jak chcę do bazy: 1 234 567,89 - ale wtedy są przekłamania jeśli chodzi o max i min, no i wartości też są tylko do pierwszej spacji

min i max pobieram w ten sposób:
Kod
$min_turn = mysql_query("SELECT MIN(dane2) AS min_dane2 FROM baza");
$row = mysql_fetch_assoc($min_turn);
$min = $row['min_dane2'];

$max_turn = mysql_query("SELECT MAX(dane2) AS max_dane2 FROM baza");
$row = mysql_fetch_assoc($max_turn);
$max = $row['max_dane2'];


proszę o pomoc, bo co prawda mogę zapisać to bez żadnych odstępów do tabeli i potem to wyświetlić, ale w przypadku liczb rzędu kilkanaście milionów złotych, to nie są czytelne te liczby, bo trzeba liczyć trójkami, aby wiedzieć czy jest to milion, czy dziesięc itp...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sephirus
post 20.12.2011, 09:08:04
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Prawidłowe podejście w przypadku gdy chcesz operować tymi liczbami w bazie jako "liczby" jest tylko jedno:

1. W bazie zapis jako INT - czyli 1 234 567,89

Jak tego dokonać? Aby wilk był syta i owca cała należy całą tą liczbę wrzucić do bazy razem z groszami. Najprościej:

  1. $liczba = preg_replace('/[^0-9]{1}/','',$liczba);


Dzięki temu z 1 234 567,89 masz 123456789 - czyli liczbę groszy wink.gif

2. Działania na bazie - pole proponuje bigint - można na nim działać jak tylko sobie życzysz - pamietaj jednak że liczbę musisz podzielić przez 100 aby mieć złotówki bo jest w groszach smile.gif

3. Odczyt z bazy - odczytujemy oczywiście liczbę i możemy na niej działać "matematycznie" w przypadku wyświetlania możemy użyć funkcji:

  1. $liczba = 123456789;
  2.  
  3. $liczba = number_format($liczba , 2, ',', ' ');
  4.  
  5. echo $liczba; // da 1 234 567,89


HTH wink.gif



--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
kosmic
post 20.12.2011, 13:07:42
Post #3





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 31.10.2007

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


Cytat(Sephirus @ 20.12.2011, 09:08:04 ) *
Prawidłowe podejście w przypadku gdy chcesz operować tymi liczbami w bazie jako "liczby" jest tylko jedno:

1. W bazie zapis jako INT - czyli 1 234 567,89

Jak tego dokonać? Aby wilk był syta i owca cała należy całą tą liczbę wrzucić do bazy razem z groszami. Najprościej:

  1. $liczba = preg_replace('/[^0-9]{1}/','',$liczba);


Dzięki temu z 1 234 567,89 masz 123456789 - czyli liczbę groszy wink.gif

2. Działania na bazie - pole proponuje bigint - można na nim działać jak tylko sobie życzysz - pamietaj jednak że liczbę musisz podzielić przez 100 aby mieć złotówki bo jest w groszach smile.gif

3. Odczyt z bazy - odczytujemy oczywiście liczbę i możemy na niej działać "matematycznie" w przypadku wyświetlania możemy użyć funkcji:

  1. $liczba = 123456789;
  2.  
  3. $liczba = number_format($liczba , 2, ',', ' ');
  4.  
  5. echo $liczba; // da 1 234 567,89


HTH wink.gif


dzięki wielkie smile.gif
o to mi włąśnie chodziło...

a dokładnie, jeśli chodzi o zapis do bazy, to trim(str_replace) też mozna spokojnie to zrobić, tworząc tablice, gdzie spacje, kropke lub przecinek eliminuje się, co daje nam ciągłą liczbę, którą potem trzeba podzielić smile.gif

w przypadku tym co podałęś, należy ewentualnie jeszcze dodać opcje liczb ujemnych, bo taki rzypadek też może wsytąić, a mając:
  1. $liczba = preg_replace('/[^0-9]{1}/','',$liczba);

jak jest coś ujemnego, to już będzie błąd, ponieważ wszystkie liczby zostaną zapisane do bazy jako dodatnie...

ale jeśli chodzi o odczyt, to faktycznie funkcja number_format szybko robi to co chiałem tongue.gif

dzięki wielkie, pozdro

Ten post edytował kosmic 20.12.2011, 13:08:45
Go to the top of the page
+Quote Post

Posty w temacie


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: 14.08.2025 - 21:39