2011-02-16 26 views
17

Gdy dane są zwracane z MySQL, są automatycznie zwracane jako ciągi, niezależnie od typu danych MySQL.Jak uzyskać liczbę całkowitą z MySQL jako liczbę całkowitą w PHP?

Czy istnieje sposób, aby powiedzieć MySQL/PHP, aby utrzymać typy danych (np. Int), więc jeśli zapytasz w kolumnie int, otrzymasz liczbę całkowitą w PHP zamiast ciągu?

+2

warto zauważyć, że PHP nie może ho ld liczb całkowitych większych niż 'PHP_INT_MAX' (2 147 483 647 w moim komputerze). To może bezpiecznie przechowywać podpisane INT, ale nie niepodpisane INT ani nic większego. –

Odpowiedz

15

Cóż, możesz zrobić Type casting, aby przekonwertować typ zwracanych danych za pomocą PHP.

Możesz spojrzeć na int, intval, aby przekonwertować na liczby całkowite. Można również użyć settype:

settype($foo, "array"); 
settype($foo, "bool"); 
settype($foo, "boolean"); 
settype($foo, "float"); 
settype($foo, "int"); 
settype($foo, "integer"); 
settype($foo, "null"); 
settype($foo, "object"); 
settype($foo, "string"); 

Innym sposobem byłoby:

$foo = (array)$foo; 
$foo = (b)$foo;  // from PHP 5.2.1 
$foo = (binary)$foo; // from PHP 5.2.1 
$foo = (bool)$foo; 
$foo = (boolean)$foo; 
$foo = (double)$foo; 
$foo = (float)$foo; 
$foo = (int)$foo; 
$foo = (integer)$foo; 
$foo = (object)$foo; 
$foo = (real)$foo; 
$foo = (string)$foo; 
+1

+1 To prawie obejmuje opcje rzutowania typu. :-) –

+0

Jeśli twoja liczba całkowita jest większa niż 'PHP_INT_MAX', to będzie ograniczona. Na przykład, nie ma sposobu, aby uzyskać pełny zakres "unsigned bigint" MySQL do PHP, nawet jeśli używasz 64-bitowego PHP. – Pacerier

1

W PHP nie jest silnie wpisany język, to jest trochę bez sensu, ale można oczywiście po prostu rzucić w pole zapytanie do int przez settype itp. przed użyciem.

Niezależnie, nie ma sposobu (o którym wiem), aby automatycznie utrzymywać tę informację "typu".

+1

W poszukiwaniu znaczenia próbuję sobie wyobrazić możliwe przyrosty wydajności poprzez typowanie. Myślę, że posiadanie wartości liczbowych jako int lub float zużywałoby mniej pamięci, z drugiej strony sam proces ręcznego rozpraszania adresów zużywałby zasoby, a także trochę powiększał kod php. Tak więc ręczne typowanie wydaje mi się powierzchowną mikrooptymalizacją, podczas gdy uzyskanie wyniku MySQL we właściwym typie wydaje się uzasadnione, jeśli to możliwe. – Schmoove

0

Domyślna biblioteka PHP dla MySQL nie ma żadnych opcji tego rodzaju. Użyj odlewania typu jak (int) lub intval, (float) itp.

0

w php, możesz użyć ([type]), aby upewnić się, że $ something było liczbą całkowitą, to help sql injection, jeśli khow o tym.

ex:

(int) $something; 
2

Można użyć typu odlew kiedy już wyciągnął dane z bazy danych MySQL

$row['field'] = (int)$row['field']; 
8

W MySQLi używać bind_result: ustawia odpowiedni rodzaj i uchwyty NULL.

+0

PDO ma również taką możliwość. – awm

0

Nie wiem, w jakim kontekście zadałeś to pytanie. Ponieważ typ danych zmiennej php zależy od tego, jaki typ danych ma kolumna w twojej tabeli. Jeśli kolumna ma typ danych "int" w mysql, otrzymasz liczbę całkowitą w php (nie ciąg).

Ale tak czy inaczej, możesz użyć funkcji is_numeric(), is_int() lub gettype() php, aby poznać typ danych zwracanej wartości z MySQL. Problem z funkcją is_numeric() polega na tym, że zwraca ona wartość true, nawet jeśli zmienna zawiera łańcuch liczbowy, np. "2". Ale gettype() zwróci "ciąg", a is_int() zawsze zwróci false w podanym przykładzie, tj. "2".

Po znać typ danych zwracanej wartości można powiązać zmiennej php do utrzymania tego rodzaju Według typu odlewu tak:

// Suppose this is the returned value from mysql and 
// you do not know its data type. 
$foo = "2"; 

if (gettype($foo) == "string"){ 
    $foo = (string) $foo; 
} 

Można zrobić kilka sprawdza, jakiego typu dane zmienna ma i następnie odrzuć go odpowiednio.

Mam nadzieję, że ta odpowiedź będzie pomocna. Powodzenia!:)

0

Jeśli chcesz uzyskać wartości ordening pod względem ceny, można zmienić typ danych unosić się z kolumny (ex: cena)

Ex:

TABELA Eletronics

price  id 
---------------- 
55.90  1 
40.33  2 
10.60  3 
1596.90  4 
56.90  5 

PHP:

$sql = $pdo->query("SELECT * FROM eletronics ORDER BY price DESC"); 

// spowodować

1596.90  4 
56.90  5 
55.90  1 
40.33  2 
10.60  3 

// zlecenie jest za cenę // OBS: Można zmienić kropki z "" za pomocą str_replace() // wynik: 1596,90 - 56,90 - 55,90 - 40,33 - 10,60 itp

3

Jeśli korzystasz z Ubuntu:

sudo apt-get remove php5-mysql 
sudo apt-get install php5-mysqlnd 
sudo service apache2 restart 
Powiązane problemy