2009-06-01 16 views
7

Quando si utilizza mysql_fetch_assoc in PHP, come posso restituire i tipi di dati corretti? In questo momento sembra convertire tutto in stringhe, preferirei se lasciasse Ints come Ints e in qualche modo designasse la data/ora come oggetto o in qualche modo diverso dalle stringhe.Crea mysql_fetch_assoc rileva automaticamente i tipi di dati di restituzione?

Il motivo è che sto utilizzando PHP come backend per un'applicazione Flex e Flex ha alcune funzionalità come il rilevamento automatico dei tipi di ritorno, che non funzionano altrettanto bene se tutto entra come una stringa.

+0

buona domanda, talvolta lingue debolmente tipizzato può essere un dolore quando è effettivamente necessario per conservare i tuoi tipi di dati . –

+0

La mia soluzione ha funzionato per te?Inoltre, se ti piace la mia risposta, potresti contrassegnarla come accettata? Il sistema SO lo ha accettato per te, ma ottengo solo metà della taglia in questo modo anche se si presenta come accettata. Grazie –

+0

ok, grazie e scusa non era esattamente quello che stavi cercando. Buona fortuna con il tuo problema. –

risposta

14

Penso che una buona strategia qui sia determinare in modo programmatico il tipo di dati di ogni colonna in una tabella e trasmettere i risultati restituiti di conseguenza. Ciò ti consentirà di interagire con il tuo database in un modo più coerente e semplice pur continuando a darti il ​​controllo necessario per far sì che le tue variabili memorizzino il tipo di dati corretto.

Una possibile soluzione: Si potrebbe utilizzare mysql _ prendere _ campo() per ottenere un oggetto che contiene meta-dati sulla colonna della tabella e poi gettato la stringa di nuovo al tipo desiderato.

//run query and get field information about the row in the table 
$meta = mysql_fetch_field($result, $i); 

//get the field type of the current column 
$fieldType = $meta->type 

Un esempio completo può essere trovato qui: http://us2.php.net/manual/en/function.mysql-fetch-field.php

Dal PHP è liberamente digitato, si dovrebbe avere un tempo relativamente facile con questo.

Se si utilizzano tecniche OO (orientate agli oggetti), è possibile creare una classe con questa funzionalità nei metodi setter() in modo da non dover disporre di codice duplicato.

0

È possibile creare uno strato specifico di mysql attorno a mdb2 che rileva automaticamente i tipi di campo utilizzando il comando SHOW COLUMNS, ma questo non consentirebbe di utilizzare lo strumento mdb2.

Tenete a mente, anche, che MySQL suports interi ben al di fuori della gamma di PHP, (UNSIGNED BIGINT è di 64 bit, PHP supporta, nella migliore delle ipotesi, a 64 bit firmato int, e le piattaforme di meno di 32 bit) in modo colata automaticamente potrebbe essere indesiderabile in alcuni contesti. In questi casi, si desidera mantenere gli interi grandi nella loro stringa e manipolarli con bcmath

0

Volevo condividere una funzione che ho scritto per questo stesso problema. Passare il risultato della query $rs e ottenere un allineamento assoc dei dati colati come il ritorno: utilizzo

function cast_query_results($rs) { 
    $fields = mysqli_fetch_fields($rs); 
    $data = array(); 
    $types = array(); 
    foreach($fields as $field) { 
     switch($field->type) { 
      case 3: 
       $types[$field->name] = 'int'; 
       break; 
      case 4: 
       $types[$field->name] = 'float'; 
       break; 
      default: 
       $types[$field->name] = 'string'; 
       break; 
     } 
    } 
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); 
    for($i=0;$i<count($data);$i++) { 
     foreach($types as $name => $type) { 
      settype($data[$i][$name], $type); 
     } 
    } 
    return $data; 
} 

Esempio:

$dbconn = mysqli_connect('localhost','user','passwd','tablename'); 
$rs = mysqli_query($dbconn, "SELECT * FROM Matches"); 
$matches = cast_query_results($rs); 
// $matches is now a assoc array of rows properly casted to ints/floats/strings 
1

Basta contribuendo un piccolo miglioramento alla risposta di mastermind202 di gestire più tipi di dati . Grazie alla mente per aver fatto il sollevamento pesi! utilizzo

function cast_query_results($rs) { 
    $fields = mysqli_fetch_fields($rs); 
    $data = array(); 
    $types = array(); 
    foreach($fields as $field) { 
     switch($field->type) { 
      case MYSQLI_TYPE_NULL: 
       $types[$field->name] = 'null'; 
       break; 
      case MYSQLI_TYPE_BIT: 
       $types[$field->name] = 'boolean'; 
       break; 
      case MYSQLI_TYPE_TINY: 
      case MYSQLI_TYPE_SHORT: 
      case MYSQLI_TYPE_LONG: 
      case MYSQLI_TYPE_INT24: 
      case MYSQLI_TYPE_LONGLONG: 
       $types[$field->name] = 'int'; 
       break; 
      case MYSQLI_TYPE_FLOAT: 
      case MYSQLI_TYPE_DOUBLE: 
       $types[$field->name] = 'float'; 
       break; 
      default: 
       $types[$field->name] = 'string'; 
       break; 
     } 
    } 
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); 
    for($i=0;$i<count($data);$i++) { 
     foreach($types as $name => $type) { 
      settype($data[$i][$name], $type); 
     } 
    } 
    return $data; 
} 

Esempio:

$db = mysqli_connect(...); 
$rs = mysqli_query($db, "SELECT ..."); 
$results = cast_query_results($rs); 

restituisce un array associativo di righe con campi a digitati

Problemi correlati