2011-02-16 22 views
17

Quando i dati vengono restituiti da MySQL, vengono automaticamente restituiti come stringhe, indipendentemente dal tipo di dati MySQL.Come ottenere un intero da MySQL come intero in PHP?

C'è un modo per dire a MySQL/PHP di mantenere i tipi di dati (ad es. Int), quindi se si esegue una query su una colonna int, si ottiene un numero intero in PHP anziché una stringa?

+2

vale la pena notare che PHP non possono Ho ld interi maggiori di 'PHP_INT_MAX' (2.147.483.647 nel mio computer). Questo può tranquillamente memorizzare un INT firmato ma non un INT senza segno o qualcosa di più grande. –

risposta

15

Bene, è possibile eseguire Type casting per convertire il tipo di dati restituiti utilizzando PHP.

È possibile dare un'occhiata a int, intval per convertire in numeri interi. Si può anche utilizzare 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"); 

Un altro modo potrebbe essere:

$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 Questo copre praticamente le opzioni di trasmissione dei tipi. :-) –

+0

Se il numero intero è maggiore di 'PHP_INT_MAX', verrà limitato. Ad esempio, non c'è modo di ottenere l'intera gamma di 'bigint unsigned 'di MySQL in PHP anche se si esegue un PHP a 64 bit. – Pacerier

1

Come PHP non è un linguaggio fortemente tipizzato, questo è un po priva di senso, ma si potrebbe, naturalmente, semplicemente gettato il campo in domanda a un interno tramite settype, ecc. prima dell'uso.

Indipendentemente da ciò, non c'è modo (che io sappia) di mantenere automaticamente queste informazioni di "tipo".

+1

Nella ricerca di un significato, sto cercando di immaginare possibili miglioramenti delle prestazioni attraverso il typecasting. Penserei che avere valori numerici come int o float userebbe meno memoria, d'altra parte il processo di typecasting manuale consumerebbe risorse e anche un po 'gonfia il codice php. Quindi, il typecasting manuale mi sembra una microottimizzazione superficiale, mentre avere risultati di MySQL nel tipo corretto sembrerebbe ragionevole, se possibile. – Schmoove

0

La libreria predefinita di PHP per MySQL non ha alcuna opzione di questo tipo. Usa il cast di tipo come (int) o intval, (float) ecc

0

in php, puoi usare ([tipo]) per assicurarti che $ qualcosa sia intero, questo aiuto sql injection se ne fai uso.

es:

(int) $something; 
2

Si potrebbe utilizzare il tipo di fusione una volta che hai tirato i dati dal database MySQL

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

In MySQLi utilizzare bind_result: si imposta il tipo corretto e gestisce NULL.

+0

PDO ha anche questa capacità. – awm

0

Non so in che contesto hai posto questa domanda. Perché il tipo di dati di una variabile php dipende da quale tipo di dati ha una colonna nella tabella. Se la colonna ha il tipo di dati "int" in mysql, si ottiene un numero intero in php (non una stringa).

Tuttavia, è possibile utilizzare le funzioni php is_numeric(), is_int() o gettype() per conoscere il tipo di dati di un valore restituito da Mysql. Il problema con is_numeric() è che restituisce true anche se una variabile contiene una stringa numerica, ad es. "2". Ma gettype() restituirà "string" e is_int() restituirà sempre false nell'esempio menzionato "2".

Una volta che si conosce il tipo di dati di un valore restituito è possibile associare la variabile php per mantenere quel tipo per tipo di colata in questo modo:

// 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; 
} 

È possibile effettuare diversi controlli per quale tipo di dati la variabile ha e quindi lanciarlo di conseguenza.

Spero che questa risposta sia utile. In bocca al lupo!:)

0

Se si desidera ottenere i valori Ordening per prezzo, è possibile modificare il tipo di dati a galleggiare da colonna (es: prezzo)

EX:

eletronics TABELLA

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"); 
.515.053.691,36321 milioni

// provocare

1596.90  4 
56.90  5 
55.90  1 
40.33  2 
10.60  3 

// L'ordine è di essere per i prezzi // OBS: È possibile modificare i punti con "" utilizzando lo str_replace() // risultato: 1596,90 - 56,90 - 55,90 - 40,33 - 10,60 ecc

3

Se è in esecuzione Ubuntu:

sudo apt-get remove php5-mysql 
sudo apt-get install php5-mysqlnd 
sudo service apache2 restart 
Problemi correlati