2012-04-10 7 views
0

Ich möchte ein JSON-Objekt aus einer Datenbank (MyTable) zurückgeben, die zwei Spalten enthält - ID (int) und Name (Zeichenfolge).PHP-ODBC-Verbindung, die korrekte Werttypen zurückgibt

Das Skript unten erzeugt eine JSON wie:

[{"ID":"0","Name":"John"},{"ID":"1","Name":"Doe"}] 

Sie können sehen, dass die ID als String zurückgegeben. Wie kann ich es in einer Weise zu erreichen, die eine ID als ganze Zahl zurückgegeben werden würde:

[{"ID":0,"Name":"John"},{"ID":1,"Name":"Doe"}] 

Ich will nicht das Ergebnis Array aus der ODBC lesen und zu analysieren, da ich wie generische Abfragen verwenden möchten:

SELECT * FROM TableXXX 

Hier mein Skript ist:

//connection 
    $connstr = "Driver={SQL Server Native Client 10.0};Server=" . $this->server . ";Database=" . $this->database . ";"; 
    $conn=odbc_connect($connstr, $this->user, $this->password); 
    if (!$conn) {exit("Connection Failed: " . $conn);} 

    //execute sql 
    $rs=odbc_exec($conn,"SELECT ID, Name FROM MyTable"); 
    if (!$rs) {exit("Error in SQL");} 
    //retreive data into array 
    $data = array(); 
    $i=0; 
    while($row = odbc_fetch_array($rs)) { 
     $data[$i] = $row; 
     $i++; 
    } 
    odbc_close($conn); 
    //output as json string 
    echo json_encode($data); 

Antwort

0

im allgemeinen gibt es keine gemeinsamen Datentypen in ODBC. Es wäre abhängig von den einzelnen ODBC-Treibern (und möglicherweise von jedem Anbieter, wenn es unterstützt wurde). Ich habe nichts in der ODBC-Spezifikation gesehen, die "allgemeine" Datentypnamen beschreibt. Die meisten Aufrufe von ODBC gehen über den ODBC-Treibermanager, aber mir sind keine Situationen bekannt, in denen SQL-Anweisungen übertragen/geändert werden.

Es bedeutet, dass der ODBC-Treiber Datentypen nicht zurückgeben würde. Wenn Sie ein JSON-Objekt zurückgeben möchten, das andere als Strings enthält, müssten Sie die Daten Spalte für Spalte einzeln zuordnen. Sie können Datentypen des Feldes nach der Funktion odbc_field_type abrufen.

Sie müssen jedoch wissen, dass jeder Datenbankanbieter andere Feldnamen (z. B. varchar, nvarchar, ....) zurückgibt.

Verwenden Sie dann so etwas wie (nur in umgekehrter Reihenfolge):

$type_map = array(
'varchar' => 'string', 
'char' => 'string', 
'text' => 'string', 
); 

$column_type = 'text'; // get from DB query 
$my_var = 'some string'; 
$var_type = gettype($my_var); 

if(array_key_exists($column_type, $type_map) and 
    $type_map[$column_type] == $var_type) { 
    //proceed with insert of record 
} 

Hoffe, es hilft.

0

Jeder ODBC-Treiber muss ODBC-Kerndatentypen unterstützen (aufgelistet in Tabelle 19.6 unter der URL unten). Die Datentypen in Tabelle 19.6 sind allen ODBC-kompatiblen Treibern gemeinsam.

SQL Programming