2012-04-21 10 views
32

W porządku, więc bawiłem się z interfejsem Steam Web API, mam jedną z wartości przechowywanych w zmiennej o nazwie $steam64. Kiedy używam tego snippera kodu do wstawienia go do bazy danych mysql, wstawię całkowitą liczbę całkowitą inną niż ta, która jest przechowywana w zmiennej.Niepoprawna liczba całkowita (2147483647) jest wstawiona do MySQL?

$sql_query = "INSERT INTO users_info (steam64) VALUES ('$steam64')";

var_dump($steam64); zwraca rzeczywisty int, więc nie powtarzając go. Nie jestem pewien, co się tutaj dzieje, każda pomoc jest doceniana.

+3

Co * zostało * wstawione (i co * zostało * wyrzucone) i czym * jest * typ kolumny? To prawdopodobnie nie jest "błąd" w MySQL, co oznacza, że ​​problem leży gdzie indziej ... –

+0

nie powinien potrzebować pojedynczych cudzysłowów na liczbie całkowitej. może próbować wstawić ciąg "$ steam64" jako liczbę całkowitą, konwertując go w procesie. – Lazerblade

+0

@pst '2147483647' jest wstawiany,' 76561197989628470' jest zrzucany, typ kolumny to int (255). – Archey

Odpowiedz

34

To prawdopodobnie dlatego, że zawijacie zapytanie w podwójnym cudzysłowie, ale zmienna jest w pojedynczym cudzysłowie, więc jest traktowana jako literał, a jeśli kolumna jest int, otrzymasz 0 zamiast tego.

Spróbuj tego:

$sql_query = "INSERT INTO users_info (steam64) VALUES ('" . $steam64 . "')"; 

Ponadto, zanim dojdę podpalany, należy zapoznać się na SQL injection w przypadku, gdy nie są odkażania zmienne są ujmowane bezpośrednio w SQL.

- Update -

Bazując na swoim komentarzem "wartości dumpingu"; numer, który próbujesz wstawić, jest zbyt duży dla systemów 32-bitowych. Maksimum dla 32-bitów to 4,294,967,295, a maksymalna dla 64-bitów to 18 444 774 0709 551,615. Zalecam przekonwertowanie kolumny na mieszanie varchar(100) zamiast int lub przełączenie na system 64-bitowy. Świetny artykuł o max intach here i here.

+0

nadal wstawia złe int. – Archey

+1

Wysłano aktualizację. Liczba, którą próbujesz wstawić, jest zbyt duża. –

+0

Dzięki :) Czy to PHP czy MySQL ma limit? – Archey

51

2147483647 to największa wartość int dla mysql. Po prostu zmień typ z int na bigint.

+2

@ George.thank you –

+0

Warto zauważyć, że BIGINT ma limit -9223372036854775808 do 9223372036854775807 (podpis) lub od 0 do 18446744073709551615 (niepodpisany). jeśli chcesz larget POZYTYWNIE TYLKO liczbę całkowitą, użyj czegoś takiego jak 'COLUMNNAME' BIGINT (32) UNSIGNED DEFAULT 0 – Lewis

-5
CREATE TABLE `dvouchers` (
    `2147483647` int(3) NOT NULL auto_increment, 
    `code` varchar(12) NOT NULL default '1', 
    `type` char(1) NOT NULL default '$', 
    `count` int(3) unsigned NOT NULL default '0', 
    `amount` int(3) unsigned default '0', 
    `notes` text, 
    `expiryDate` date default NULL, 
    `fkUserAdminId` int(11) NOT NULL default '0', 
    PRIMARY KEY (`2147483647`), 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
+1

hmm ... a to odpowiada na pytanie, ponieważ ...? – kleopatra

+0

To nie ma sensu, nie próbuj wywnioskować żadnej pomocy z tej odpowiedzi, jeśli jesteś tutaj z tym problemem. – Lewis

1

idź do operations-> Opcje tabeli -> zmiana wartości przyrostu do minimum lub cokolwiek chcesz, aby zwiększyć ..

wielki problem autoIncrement jest to zacząć od ostatniego wpisu, przez pomyłkę, jeśli jego bardzo duża wartość następnie rozpocząć problemu wartości wkładki .. z naszych predefiniowanych typów danych
enter image description here

3

Typ całkowitą INT jest przechowywanie 4Bytes, otrzymasz od -2^(4*8-1)=-2147483648 do 2^(4*8-1)-1=2147483647, gdy masz "podpisano "flagi, jeśli zmienisz flagi na niepodpisane będziesz miał zakres od 0 do 2^(4*8)-1. MySQL obsługuje BIGINT jako pamięć 8Bajtów. Jeśli spróbujesz zapisać wartość większą, zapiszesz maksymalną wartość z zakresu

-4

Najprostszym sposobem jest zmiana w "int" MySQL na "varchar".

+0

Nie rób tego. Nigdy tego nie rób. VARCHAR jest reprezentacją łańcuchową, a nie numeryczną. Nie byłoby możliwe wykonywanie operacji matematycznych na łańcuchu. – mwieczorek

0

Zgadzam się ze zmianą typu danych do BIGINT z całkowitą. Obecnie buduje aplikację node.js/sequelize poniżej Refactor rozwiązany numer telefonu post z formularza reagować-Redux manipulowane „2147483647”:

clientPhone: { 
    type: DataTypes.BIGINT, 
    allowNull: true 
}, 
1

Największą wartość dla danych typu int jest 2147483647. Jeśli numer wstawiasz jest większy niż 2147483647, to spowoduje to problem. Aby rozwiązać problem, zmień typ danych z INT na BIGINT, ponieważ BIGINT ma maksymalną wartość 9223372036854775807, może to rozwiązać Twój problem. Spójrz na tę stronę: https://dev.mysql.com/doc/refman/5.7/en/integer-types.html

Powiązane problemy