Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]zapytanie MYSQL -wywala error, z powodu zbyt długiej wartości
Forum PHP.pl > Forum > Przedszkole
matimax
Mam pewien problem, który wygłąda następująco: Po kliknięciu danego przycisku, strona przesyła trzy wartości do innych kolumn. Chodzi dokładniej o same liczby, jednak są to bardzo duże liczby. Gdy liczba jest nie duża, nie ma problemu, jednakże gdy np. wartość 1: 321.456.789.123.456 , 2 wartość podobnego rozmiaru i trzecia też to już wyskakuje błąd .

Przykład z innymi wartościami i błąd:
Message: SQL Error: Out of range value for column 'kolumna3' at row 1

Query Code: UPDATE baza_danych SET kolumna1= kolumna1- 1.7105114972088E+14, kolumna2= kolumna2- 1.9002036318352E+14, kolumna3= kolumna3- 1.9002036318352E+14 WHERE id = 1;

Jak mogę rozwiązać ten problem? Próbowałem zmienić w strukturach bazy danych typ na bigint(20) albo double(50,6) jednakże błąd się powtarza. Pola te mają obsługiwać jedynie ogromne liczby.
Tomplus
Coś musisz mieć nie tak:

Ja wykonuje w PHPMyAdmin taki kod:
Kod
UPDATE `tabela` SET `big` = `big` + 1.9002036318352E+14


i spokojnie mi sumuje te duże liczby [bigint(100)] - sprawdź co masz dla kolumna3, bo może jej nie ustawiłeś wartości bigint.
Pyton_000
serwer 32 czy 64 bit?
matimax
debian-7.0.32bity--RepoPL, jeśli dobrze Cię zrozumiałem.
To jest najtańszy serwer VPS mintshost, który służy mi do nauki.
gdy wprowadzę tak duże kwoty np. 150.000.000.000.000 x 3 to wchodzi ok, a gdy np. 148.531.561.971.675 x 3 to już błąd ;/. Czy da się to jakoś zrobić tak, żeby przyjmowała baza takie duże wartości? w mysql, zlotowka, funt, dolar są typami: bigint (20) , atrybut- unsigned. Czy może jak zmienie na inne wartości np. bigint z wartością (100) lub na double będzie to działać poprawnie?...

Edit: Może żeby było jaśniej, chciałem zrobić coś na zasadzie prostego banku na stronie, w który można wpłacać wirtualne pieniądze, a potem je wypłacać. czyli praktycznie coś prostego, co dziwne, wpłata takich dużych wartości odbywa się bez problemu, przy okazji zabierając 20% wpłacanej kwoty. pojawia sę normalnie w banku, a przy wypłacie już jest problem.


EDIT:
Można powiedzieć, że problem jest "rozwiązany". Wydaje mi się, że cos schrzaniłem w php z zapytaniaim, bo działają mi dwie waluty, tylko z jedną jest problem i tylko przy wypłacie.

Jednak dupa, siedzę nad tym już trzeci dzień i nie wiem co jest nie tak, zmieniałem już typy kolumny w tabeli ale to nie pomagało..
może coś jest zle w kodzie? poniżej kod odpowiadający za wypłatę:

  1. function out()
  2. {
  3. global $USER, $MIASTO, $CONF, $waluta;
  4.  
  5. $action = HTTP::_GP('action', '');
  6.  
  7.  
  8. $mZloty = $USER['bankz'];
  9. $mFunt = $USER['bankf'];
  10. $mDolar = $USER['bankd'];
  11.  
  12.  
  13. if ($action == 'out') {
  14. $bZloty = max(0, round(HTTP::_GP('zloty', 0.0)));
  15. $bFunt = max(0, round(HTTP::_GP('funt', 0.0)));
  16. $bDolar = max(0, round(HTTP::_GP('dolar', 0.0)));
  17.  
  18.  
  19. if($bZloty < '0'){$this->printMessage('error_1', 'game.php?page=logout');}
  20.  
  21. elseif($bFunt < '0'){$this->printMessage('error_2', 'game.php?page=logout');}
  22.  
  23. elseif($bDolar < '0'){$this->printMessage('error_3', 'game.php?page=logout');}
  24.  
  25. elseif($bZloty == '0' && $bFunt == '0' && $bDolar == '0'){$this->printMessage(['wprowadz jakąś kwotę'], 'game.php?page=bank');}
  26.  
  27. elseif($bZloty > $mZloty){$this->printMessage($LNG['error_out_1'], 'game.php?page=bank', 3);}
  28.  
  29. elseif($bFunt > $mFunt){$this->printMessage($LNG['error_out_2'], 'game.php?page=bank', 3);}
  30.  
  31. elseif($bDolar > $mDolar){$this->printMessage($LNG['error_out_3'], 'game.php?page=bank', 3);}
  32.  
  33. else{
  34.  
  35. $Miasto[$waluta[101]] += $bZloty;
  36. $Miasto[$waluta[102]] += $bFunt;
  37. $Miasto[$waluta[103]] += $bDolar;
  38. $GLOBALS['DATABASE']->query("UPDATE ".USERS." SET
  39. bankz = bankz - $bZloty,
  40. bankf = bankf - $bFunt,
  41. bankd = bankd - $bDolar
  42. WHERE id = ".$USER['id'].";");
  43. $this->printMessage( 'Zdeponowano '.$bZloty .' Zlotych, '. $bFunt .' Funtów i '. $bDolar .' Dolarow.', 'game.php?page=bank');
  44. }
  45.  
  46. }
  47.  
  48. $this->tplObj->assign_vars(array(
  49.  
  50.  
  51. 'bankz' => $USER['bankz'],
  52.  
  53. 'bankc' => $USER['bankf'],
  54.  
  55. 'bankd' => $USER['bankd'],
  56.  
  57.  
  58. ));
  59. $this->display('bank_out.tpl');
  60. }
olszam
Może to głupi pomysł ale spróbuj zamienić tam bigint-a czy co tam masz na text. W php i tak się sprawdza czy wartość jest liczbą czy nie.
matimax
rzeczywiście surowce zaczęło wpłacać, na to nie wpadłem, potestuje jeszcze ale wydaje mi się, że działa.

Edit: Przy niektórych dużych kwotach, po wypłacie wszystkich walut (dokładnie takich kwot jakie pokazują się, że powinny być w banku) czasem robią się wartości na -, np. tak jak teraz: zloty = -3 funt = 3 na plusie dolar= -2.

Myślałem, że :
if($bZloty < '0'){$this->printMessage('error_1', 'game.php?page=logout');}

elseif($bFunt < '0'){$this->printMessage('error_2', 'game.php?page=logout');}

elseif($bDolar < '0'){$this->printMessage('error_3', 'game.php?page=logout');}

elseif($bZloty == '0' && $bFunt == '0' && $bDolar == '0'){$this->printMessage(['wprowadz jakąś kwotę'],

wystarczy, a jednak jeszcze coś jest nie tak ;/
Pyton_000
Masz system 32bit i to jest Twój problem.

Używaj tego:
http://php.net/manual/en/book.bc.php

do dodawania liczb. Zapisuj je w w Bigint (ew. varchar jeśli nie poskutkuje).
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.