2012-06-20 13 views
6

Con una novità relativa a AJAX, e ora appena iniziando a imparare PDO, il livello aggiunto di ReSTler mi ha completamente spiazzato. Modellando il codice riportato di seguito dai campioni di Restler, non so come modificare il formato di output da quello che PDO è tornando a ciò che si aspettano Restler e Highcharts.Come formattare correttamente i risultati PDO? - risultati numerici restituiti come stringa?

Come si modifica questo codice per passare dal formato corrente al formato richiesto? (I risultati saranno generalmente record 5K-10K, se questo è un fattore nella gestione del risultato MySQL.)

ReSTler Codice API Snippet:

$sql = "SELECT ....." 
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    $stmt = $this->db->query($sql); 
    return $stmt->fetchAll(); 
} catch (PDOException $e) { 
    throw new RestException(502, 'Listing History: ' . $e->getMessage()); 
} 

Corrente Formato di uscita (comprende indesiderato i nomi di colonna):

[ 
    { 
    "chart_date": "1118966400000", 
    "bandwidth": "10.01", 
    "views": "101" 
    }, 
    { 
    "chart_date": "1119225600000", 
    "bandwidth": "20.02", 
    "views": "101" 
    }, 

desiderata Output Format (numerici e senza nomi di colonna):

[ 
    [ 
    1118966400000, 
    10.01, 
    101 
    ], 
    [ 
    1119225600000, 
    20.02, 
    202 
    ], 

Modifica utilizzando suggeritofetch(PDO::FETCH_NUM):

Per la risposta da @Ricardo Lohmann, ho provato a prendere (DOP :: FETCH_NUM), che ha fatto rimuovere la colonna i nomi, ma tutte le colonne restituite sembrano essere una stringa, non numerica, poiché i dati sono effettivamente, quindi prova questo, dandomi il giusto tipo di dati - questa parte di PDO restituisce unilateralmente una stringa?

while ($row = $stmt->fetch(PDO::FETCH_NUM)) { 
    $array[$x][0] = intval($row[0]); 
    $array[$x][1] = intval($row[1]); 
    $array[$x][2] = intval($row[2]); 
    $x++; 
} 
return $array; 

risposta

12

PDO::FETCH_NUM è la strada da percorrere, anche se non significa che le colonne numeriche rimarranno numeriche, significa solo che otterrete una matrice indicizzata invece di un array associativo (quindi, esegue solo l'omissione dei nomi delle colonne).

MySQL DOP conducente sempre restituisce stringhe per le colonne numeriche, che è a known bug, ma purtroppo, uno dei tanti bug che gli sviluppatori PHP palesemente ignorano come "grazie, ma questo non è un bug".

È possibile forzare json_encode per utilizzare i numeri reali per valori che assomigliano ai numeri: json_encode($data, JSON_NUMERIC_CHECK) (da PHP 5.3.3).

+1

Ah, per avere PHP 5.3 a mia disposizione, ahimè, I' m bloccato con 5,2 per la durata, ma GRAZIE per almeno chiarire la "stringa" ... stava diventando livido mentre mi stavo picchiando cercando ogni^&^* ((possibile impostazione !!! – GDP

0

tenta di impostare la modalità prendere invece di fetchall, come la seguente:

return $stmt->fetch(PDO::FETCH_COLUMN); 

Potete vedere il reference.

-1

Avevo sperato che ci fosse un modo per farlo, quindi perché ho eseguito la Ricerca Google: v.

Sto costruendo la mia applicazione CMS personalizzata che ritengo sia 'Drupal-like' (non ho mai usato Drupal ma utilizzo un sistema personalizzato basato su Drupal). Con questo voglio dire che ho una tabella nel mio DB che fondamentalmente descrive tutti i campi in altre tabelle, e quando richiamo i campi da queste altre tabelle, carico le descrizioni e il tipo di dati i miei dati.

ad es.

tablex campi: nome, l'età, abbastanza vecchio

tabledescriptions:

fieldname | datatype | minlength | parent 
___________|____________|_____________|________ 
Name  | String | 5   | tablex 
Age  | Int  | 1   | tablex 
Old Enough | Boolean | 1   | tablex 

Così, quando ho caricare dati da tablex, mi guardo tabledescription per le cose in cui genitore = ' tablex 'e utilizzare un'istruzione switch per datatype i dati

foreach (...) { 
    switch ($desc->datatype) { 
     case 'int': (int) $tablex->data; 
      break; 
    } 
} 
etc. 
+1

Questo è eccessivo –

+0

@ YourCommonSense Non quando si sta costruendo uno stile OOP di sistema, ma questo è solo un frammento di quello che uso per la tabella 'tabledescriptions'. Lo uso anche per determinare quali sono i campi di inserimento per tablex, ecc. eseguire, il codice è molto più efficiente e affidabile –

+0

Perché non chiedere semplicemente dbms su datat ipo? –

0

L'unico modo in cui ho trovato di aggirare questo problema (utilizzando il driver SQLSRV), è di avere SQL per inviare tutti i tipi di dati come una stringa in un parametro OUTPUT. E quindi convertire tutti i valori utilizzando il tipo di dati corretto. Potrebbe essere pesante per un grande set di dati.

Anche se DOP sviluppatori dice che è un problema di driver (non il loro errore), non ho mai avuto questo problema utilizzando il driver SQLSRV senza DOP ...

Problemi correlati