2010-03-12 3 views
18

Ich habe versucht, MySQL-Abfrageergebnisse mit mysql_fetch_row() und mysql_result() abrufen und numerische Werte werden als Zeichenfolgen zurückgegeben.Erhalten Sie MySQL Query Ergebnisse als ihren nativen Datentyp?

Gibt es eine Möglichkeit, die Daten als ihren in der Tabelle gespeicherten Datentyp abzurufen?

Die Anwendung wird viele verschiedene Abfragen abfragen, so dass ich nicht in der Lage sein werde, die Werte als den beabsichtigten Datentyp 1 zu 1 zu werfen.

Antwort

14

Ich glaube nicht, Daten in ihrem nativen Datentyp bekommen (dh alles, was Strings) kann in PHP 5.2 ...

In PHP 5.3 wird es möglich gemacht werden, wenn ich mich richtig erinnere, wenn Sie die neue (neu wie in PHP> = 5.3) verwenden mysqlnd (MySQL Native Treiber) Treiber.

Nach mehr Graben durch meine Lesezeichen fand ich diesen Artikel über mysqlnd: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

Es sagt dies (Zitat):

Vorteile der Verwendung von mysqlnd für PDO

mysqlnd kehrt nativen Datentypen, wenn mit serverseitigen vorbereiteten Anweisungen, zum Beispiel eine INT-Spalte als eine ganze Zahl Variabel zurückgegeben wird e nicht als Zeichenfolge. Das bedeutet weniger Daten Konvertierungen intern.

Aber das ist PHP 5.3 nur (vorausgesetzt, Ihre Version von PHP 5.3 mit mysqlnd kompiliert wird (und nicht die alte libmysql)) und scheint nur der Fall zu sein für vorbereitete Anweisungen :-(

die nicht ganz Hilfe tut, in Ihrer Situation, denke ich ...


Und hier ist ein anderer, noch über die neuen Funktionen von mysqlnd, die nicht nur bereit, Aussagen darüber spricht. PHP: New network traffic, CPU and memory savings with mysqlnd

Nicht sicher, dass dies in den offiziellen mysqlnd Treiber zusammengeführt wurde - der beste Weg wäre es zu versuchen; aber es wird immer noch PHP> = 5,3 nur sein, sowieso ...


Eine andere Lösung wäre, zu haben, auf der PHP-Seite, eine Art von Mapping-System (wie ein ORM) zu konvertieren ergibt sich aus der DB kommt zu PHP-Datentypen ...

und ja, das ist schlecht, wenn man zur Verwendung der Operatoren wie === und !== wollen, die ... Art empfindlich sind

+0

Dank Pascal MARTIN:

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

Sie weitere Informationen hier bekommen! Ich habe mehrere Stunden gegoogelt und nichts gefunden, was ich benutzen könnte. Ich bin relativ neu in PHP, aber es klingt, als müsste ich mit PDO gehen, wenn ich die native Unterstützung möchte. Leider ist mein Host läuft 5.2.something ... Auch schwierig, ist, dass ich versuche, eine XML-Berichtsdatei Eingabe erstellen, die verschiedene Abfrage-Informationen enthält. Das PHP-Skript liest die angeforderte XML-Datei und sendet die Abfragen an die Datenbank, so dass ich wirklich nie weiß, welche Daten abgefragt werden und wie sie zurückgegeben werden sollen. Zeit, um kreativ zu werden, denke ich :) –

+1

PDO oder nicht PDO sollte nichts ändern, in diesem Fall: was zählt, ist die Treiber unter verwendet * (dh libmysql vs mysqlnd) * - und ich bin mir nicht einmal sicher mysqlnd in PHP 5.3.2 gibt native Typen für Standardabfragen zurück ;;; In Ihrem Fall, mit PHP 5.2, ist die einzige Lösung, die Sie haben, eine Mapping-Schicht, die Konvertierungen bei Bedarf eingibt ... –

+0

Beachten Sie, dass Sie die vorbereitete Anweisungsemulation ausschalten müssen (http://stackoverflow.com/a/15592818/441684) bei Verwendung von PDO. –

3

ich habe dies umgesetzt der manuelle Weg. Es ist eigentlich nicht so schlimm, nur ein paar Zeilen.

Rufen Sie wie vorgeschlagen mysqli_fetch_fields() für die Ressource auf, die sich aus Ihrer Abfrage ergibt.

dann aus einer Abbildung der PHP Feldtyp Zahlen zu MySQL-Datentypen (siehe fleißige Arbeit hier http://www.php.net/manual/en/mysqli-result.fetch-field-direct.php) können Sie Ihre Werte aus der breiten Palette umwandeln können von Datenbanktypen als Strings von MySQLi, in den entsprechenden Typen in PHP zurückgegeben.

Wie viel von einer Verlangsamung ist ich bin mir nicht sicher, tho.

+0

das ist genau das, was ich brauchte. Vielen Dank! – jbrahy

1

Ich schrieb eine Funktion dieses (für PDO) circuvent:

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

Natürlich ist die Typenliste nicht vollständig sind und die Umwandlung wird stark vereinfacht, kann aber für den Start nützlich sein.

3

versuchen Sie dies, wenn Mysqli statt PDO

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

Das hat seine Aufgabe für mich erledigt. Vielen Dank! – Victor

-1

Neben Pascal MARTIN Antwort verwenden, wenn Sie MySQLi sollte auch arbeiten verwenden. Versuchen Sie folgendes:

<?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'])); 
?> 

Das oben gezeigte Beispiel erzeugt folgende Ausgabe: https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html

this helps