2010-03-12 10 views
18

Ho provato a recuperare i risultati delle query MySQL utilizzando mysql_fetch_row() e mysql_result() e i valori numerici vengono restituiti come stringhe.Ottieni risultati query MySQL come tipo di dati nativi?

C'è un modo per recuperare i dati come tipo di dati memorizzati nella tabella?

L'applicazione interrogherà molte query diverse, pertanto non sarà possibile eseguire il cast dei valori come tipo di dati previsto su base 1 per 1.

risposta

14

non credo ottenere i dati in loro tipi di dato nativi (vale a dire qualsiasi altra cosa che le stringhe) può essere fatto in PHP 5.2 ...

In PHP 5.3, diventa possibile, se non ricordo male, quando si utilizza il nuovo (nuovo come in PHP> = 5.3) mysqlnd (driver Native Native) driver.

Dopo più scavare attraverso i miei preferiti Ho trovato questo articolo su mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

Si dice questo (citazione):

I vantaggi dell'utilizzo di mysqlnd per i prodotti DOP

mysqlnd torna nativo tipi di dati quando utilizza le istruzioni preparate lato server, per esempio viene restituita una colonna INT come variabile intera e non come una stringa . Ciò significa un minor numero di conversioni di dati internamente.

Ma questo è solo PHP 5.3 (fornito la propria versione di PHP 5.3 è compilato con mysqlnd (e non il vecchio libmysql)), e sembra essere solo il caso di dichiarazioni preparate :-(

il che non aiuta molto, nella tua situazione, immagino ...


Ed ecco un altro, ancora sulle nuove funzionalità di mysqlnd, che parla di questo non solo per le istruzioni preparate:. PHP: New network traffic, CPU and memory savings with mysqlnd

012.

Non è sicuro che questo sia stato unito al driver mysqlnd ufficiale, tuttavia, il modo migliore sarebbe provarlo; ma sarà ancora PHP> = 5.3 solo, in ogni caso ...


Un'altra soluzione sarebbe quella di avere, sul PHP-side, una sorta di mappatura sistema (come un ORM) a convertire i risultati provenienti dal DB di tipi di dato PHP ...

e sì, questo è male se si desidera utilizzare gli operatori come === e !==, che sono di tipo sensibile ...

+0

Grazie Pascal MARTIN! Sono stato su Google per diverse ore e non ho trovato nulla che potrei usare. Sono relativamente nuovo a PHP, ma sembra che avrò bisogno di andare con PDO se voglio il supporto nativo. Sfortunatamente il mio host è in esecuzione 5.2.qualcosa ... Anche difficile, è che sto cercando di creare un input di file di report xml che contiene informazioni di query diverse. Lo script PHP legge il file xml richiesto e invia le query al database, quindi davvero non saprò mai quali dati vengono interrogati e come dovrebbe essere restituito. tempo per essere creativo suppongo :) –

+1

PDO o non PDO non dovrebbe cambiare nulla, in questo caso: ciò che importa sono i driver utilizzati sotto * (ad esempio libmysql vs mysqlnd) * - e non sono nemmeno sicuro che mysqlnd in PHP 5.3.2 restituisce i tipi nativi per le query standard ;;; nel tuo caso, comunque, con PHP 5.2, l'unica soluzione che avresti sarebbe un livello di mappatura, che digita le conversioni quando necessario ... –

+0

Nota che dovrai [disattivare l'emulazione di istruzione preparata] (http://stackoverflow.com/a/15592818/441684) se si utilizza PDO. –

3

ho implementato questo il modo manuale. In realtà non è male, solo poche righe.

Come suggerito, chiamare mysqli_fetch_fields() sulla risorsa risultante dalla query.

Quindi da una mappatura dei numeri di campo del campo PHP ai tipi di dati MySQL (vedi lavoro industrioso qui http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php) è possibile convertire i valori dall'ampia gamma di tipi di database restituiti come stringhe da MySQLi, nel tipo appropriato in PHP.

Quanto di un rallentamento non sono sicuro.

+0

questo è esattamente ciò di cui avevo bisogno. Grazie! – jbrahy

1

ho scritto una funzione per circuvent questo (per DOP):

/** 
* Converts columns from strings to types according to 
* PDOStatement::columnMeta 
* 
* @param PDOStatement $st 
* @param array $assoc returned by PDOStatement::fetch with PDO::FETCH_ASSOC 
* @return copy of $assoc with matching type fields 
*/ 
function convertTypes(PDOStatement $statement, $assoc) 
{ 
    for ($i = 0; $columnMeta = $statement->getColumnMeta($i); $i++) 
    { 
     $type = $columnMeta['native_type']; 

     switch($type) 
     { 
      case 'DECIMAL': 
      case 'TINY': 
      case 'SHORT': 
      case 'LONG': 
      case 'LONGLONG': 
      case 'INT24': 
       $assoc[$columnMeta['name']] = (int) $assoc[$columnMeta['name']]; 
       break; 
      case 'DATETIME': 
      case 'DATE': 
      case 'TIMESTAMP': 
       $assoc[$columnMeta['name']] = strtotime($assoc[$columnMeta['name']]); 
       break; 
      // default: keep as string 
     } 
    } 

    return $assoc; 
} 

Naturalmente l'elenco tipo non sono complete e la conversione è semplicistica, ma può essere utile per l'avvio.

3

provare questo se si utilizza mysqli invece di DOP

$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1); 
+0

Questo ha fatto il suo lavoro per me. Grazie! – Victor

-1

Oltre a Pascal MARTIN risposta, se si utilizza MySQLi dovrebbe anche funzionare. Prova questo:

<?php 
$mysqli = new mysqli("example.com", "user", "password", "database"); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

if (!$mysqli->query("DROP TABLE IF EXISTS test") || 
    !$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))") || 
    !$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")) { 
    echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

$stmt = $mysqli->prepare("SELECT id, label FROM test WHERE id = 1"); 
$stmt->execute(); 
$res = $stmt->get_result(); 
$row = $res->fetch_assoc(); 

printf("id = %s (%s)\n", $row['id'], gettype($row['id'])); 
printf("label = %s (%s)\n", $row['label'], gettype($row['label'])); 
?> 

L'esempio precedente visualizzerà:

id = 1 (integer) 
label = a (string) 

È possibile ottenere ulteriori informazioni qui: https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html

Spero che questo aiuti

Problemi correlati