Irek J.

Irek J. Organizacja pomysłów
ciekawych :)

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Cześć,

Dziś trafiłem na problem, który nie daje mi spokoju.

Mam prosty formularz:

<form action="admin.php?koszty" method="POST">
<p>Wpisz łączną sumę kosztów</p>
<input type="text" name="twojekoszty"><br/>
<input type="submit" name="submit" value="Wyślij">
</form>


oraz php do obsługi formularza:

if (isset($_GET['koszty'])){
$zapisz = "UPDATE `oferta` SET `koszty` =
'".$_POST['twojekoszty']."'";
$result = mysql_query($zapisz) or die(mysql_error());
}


i kod wyświetlający

$sql = "SELECT koszty FROM oferta";
$result = mysql_query($sql) or die (mysql_error());
while ($row = mysql_fetch_array($result)){
$koszty_akcji = $row['koszty'];
}
echo $koszty_akcji;


I wszystko działa pięknie jak powinno, ale...

Co trzeba zrobić, żeby po wpisaniu liczby 20.5 w formularzu w
MySQL zapisała się liczba 20.5, a nie 21 ?
Czyli, co zrobić, żeby zapisał się ułamek bez zaokrąglenia?
Przerobiłem już dużo różnych zmian typów zmiennych w tym
rekordzie i nic...

HELP! ;)

konto usunięte

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

zapomniałeś o najważniejszym - definicji tabeli w bazi, założe sie że masz tam pole typu Int a nie float
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Irek Julkowski:
Co trzeba zrobić, żeby po wpisaniu liczby 20.5 w formularzu w MySQL zapisała się liczba 20.5, a nie 21 ?
ALTER TABLE `oferta` CHANGE `koszty` `koszty` DECIMAL(6, 2) NOT NULL;

To tylko przykład. Długość pola może być inna lub może ono zezwalać na NULL.

konto usunięte

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Przemysław R.:
zapomniałeś o najważniejszym - definicji tabeli w bazi, założe sie że masz tam pole typu Int a nie float

Float jest do kitu do trzymania walut. Mogą powstać błędy zaokrągleń podczas obliczeń. DECIMAL jest rozwiązaniem.
Łukasz Z.

Łukasz Z. Specjalista ds
Informatyki w Mentor
S.A.

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Możesz też zapisać liczbę jako łańcuch znaków tak jak go odbierasz z formularza. PHP sam sobie skonwertuje łańcuch do liczby (uwielbiam tę właściwość PHP :) ) kiedy go pobierzesz i będziesz chciał wykorzystać w obliczeniach (dla przykładu - polecenie
echo '30.1' * 2;
wyświetli w wyniku 60.2).

Drobna uwaga co do kodu - nie wykorzystuj tablicy $_POST (ani $_GET czy innej globalnej) do uzupełniania zapytań SQL. Twój kod jest przez to bardzo podatny na atak SQL injection (więcej znajdziesz tutaj http://pl.wikipedia.org/wiki/SQL_injection). Stosuj filtrowanie (np. wyrażenia regularne, sprawdzanie typu, wycinanie znaczników html, itp. w zależności od tego jakich danych się spodziewasz).
Michał Sznurawa

Michał Sznurawa Scala Developer

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Łukasz Z.:
Możesz też zapisać liczbę jako łańcuch znaków tak jak go odbierasz z formularza. PHP sam sobie skonwertuje łańcuch do liczby (uwielbiam tę właściwość PHP :) )

a jak będzie coś chciał policzyć po stronie bazy?
Łukasz Z.

Łukasz Z. Specjalista ds
Informatyki w Mentor
S.A.

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Michał Sznurawa:
Łukasz Z.:
Możesz też zapisać liczbę jako łańcuch znaków tak jak go odbierasz z formularza. PHP sam sobie skonwertuje łańcuch do liczby (uwielbiam tę właściwość PHP :) )

a jak będzie coś chciał policzyć po stronie bazy?

Wykonałem pewną próbę w MySQL.
Utworzyłem sobie tablicę z jednym polem typu varchar (t1) i drugim typu int (t2). Wpisałem dane t1=10.3 oraz t2=2 a następnie wykonałem zapytanie
SELECT (t1*t2) FROM `test`

W wyniku otrzymałem 20.6 co wydaje się być poprawne ;)

PS. dla dodawania i dzielenia też sprawdziłem i wygląda ok.

PS. 2 Oczywiście masz rację, że bardziej elegancko będzie to zrobić na innych typach danych, ale jeśli nie ma potrzeby szukać rozwiązań idealnych to te mniej idealne nieraz będą szybsze i prostsze a równie skuteczne dla danego przypadku :)Łukasz Z. edytował(a) ten post dnia 14.07.11 o godzinie 12:53
Tobiasz Glazar

Tobiasz Glazar Front-End Developer

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Konwertuj na grosze/centy/pensy.
Maciej W.

Maciej W. Ruby on what?!

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Łukasz Z.:
Możesz też zapisać liczbę jako łańcuch znaków tak jak go odbierasz z formularza.

Taa, a potem przyjdzie ktos i powie "Potrzebujemy sume zamowien od ... do ..." i zamiast zalatwic to prostym zapytaniem SQL rozpoczyna sie dramat.Maciej W. edytował(a) ten post dnia 14.07.11 o godzinie 13:44
Łukasz Z.

Łukasz Z. Specjalista ds
Informatyki w Mentor
S.A.

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Maciej W.:
Łukasz Z.:
Możesz też zapisać liczbę jako łańcuch znaków tak jak go odbierasz z formularza.

Taa, a potem przyjdzie ktos i powie "Potrzebujemy sume zamowien od ... do ..." i zamiast zalatwic to prostym zapytaniem SQL rozpoczyna sie dramat.

Zgadzam się z tym jak najbardziej. Napisałem przecież, że moje rozwiązanie nie jest z tych idealnych - ma jednak tę zaletę, że jest bardzo proste. Nie zamierzam go też na siłę bronić.
Stanisław P.

Stanisław P. Software designer

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Łukasz Z.:
Możesz też zapisać liczbę jako łańcuch znaków tak jak go odbierasz z formularza. PHP sam sobie skonwertuje łańcuch do liczby (uwielbiam tę właściwość PHP :) ) kiedy go pobierzesz i będziesz chciał wykorzystać w obliczeniach (dla przykładu - polecenie
echo '30.1' * 2;
wyświetli w wyniku 60.2).

Masz szanse na 60.2 jak i na 60.199999999999978. '30.1' jest auto-konwertowane do zmiennoprzecinkowej formy, więc na stringach "walutowych" też nie należy robić obliczeń.
Łukasz Z.

Łukasz Z. Specjalista ds
Informatyki w Mentor
S.A.

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Stanisław P.:
Łukasz Z.:
Możesz też zapisać liczbę jako łańcuch znaków tak jak go odbierasz z formularza. PHP sam sobie skonwertuje łańcuch do liczby (uwielbiam tę właściwość PHP :) ) kiedy go pobierzesz i będziesz chciał wykorzystać w obliczeniach (dla przykładu - polecenie
echo '30.1' * 2;
wyświetli w wyniku 60.2).

Masz szanse na 60.2 jak i na 60.199999999999978. '30.1' jest auto-konwertowane do zmiennoprzecinkowej formy, więc na stringach "walutowych" też nie należy robić obliczeń.

Fakt, tego nie wziąłem pod uwagę, że konwersja może wyjść inaczej ;)
Robert P.

Robert P. Senior PHP Developer

Temat: [MySql/PHP] Jak zapisać i wyświetlić ułamek?

Do tego mogą dojść problemy z reprezentacją liczb zmiennoprzecinkowych w systemie binarnym + precyzja :)



Wyślij zaproszenie do