Erhalten Sie MySQL Query Ergebnisse als Mutterdatentyp?
Frage
Ich habe Abrufen MySQL Query-Ergebnisse versucht, mit mysql_fetch_row()
und mysql_result()
und numerische Werte werden als Strings zurück.
Gibt es eine Möglichkeit, die Daten zu holen als Datentyp in der Tabelle gespeichert ist?
Die Anwendung wird die Abfrage viele verschiedene Abfragen sein, damit ich nicht in der Lage sein werde, die Werte wie der beabsichtigten Datentyp auf einer 1 um 1 Basis zu werfen.
Lösung
Ich glaube nicht, Daten in ihrem nativen Datentyp immer (d. Irgendetwas anderes, dass Strings) in PHP 5.2 ...
erfolgenIn PHP 5.3 wird es möglich, wenn ich mich richtig erinnere, wenn Sie den neuen verwenden (neu, wie in PHP> = 5.3) mysqlnd (MySQL-Native-Treiber) Treiber.
Nach mehr Graben durch meine Lesezeichen ich diesen Artikel über mysqlnd gefunden: PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3
Er sagt, dieses (Zitat):
Die Vorteile der Verwendung mysqlnd für PDO
mysqlnd kehrt nativen Datentypen, wenn mit Server-Seite Prepared Statements, zum Beispiel ist eine INT Kolonne zurück als eine ganzzahlige Variable nicht als String. Das bedeutet weniger Daten Conversions 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 Prepared Statements: - (
Was nicht ganz Hilfe tut, in Ihrer Situation, denke ich ...
Und hier ist ein anderer, noch über die neuen Funktionen von mysqlnd, die Gespräche über diese nicht nur für Prepared Statements: PHP:. Neuer Netzwerkverkehr, CPU- und Speichereinsparungen mit mysqlnd
Nicht sicher, dies wurde in die offiziellen mysqlnd Fahrer verschmolzen, obwohl - bester Weg, um zu versuchen, wäre; aber es wird immer noch sein PHP> = 5,3 nur, sowieso ...
Eine andere Lösung wäre, zu haben, auf der PHP-Seite, eine Art von Mapping-System (wie ein ORM) zu den Ergebnissen konvertieren von der DB zu PHP kommenden Datentypen ...
Und ja, das ist schlecht, wenn Sie den Einsatz Operatoren wie ===
und !==
wollen, welche Art empfindliche ...
Andere Tipps
versuchen Sie dies, wenn Mysqli anstelle von PDO mit
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
Ich habe dies die manuelle Art und Weise umgesetzt. Es ist eigentlich nicht so schlimm, nur ein paar Zeilen.
Wie bereits angedeutet, Call mysqli_fetch_fields () auf der Ressource aus der Abfrage führt.
Neben Pascal MARTIN Antwort, wenn Sie verwenden MySQLi sollte auch Arbeit. 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:
id = 1 (integer)
label = a (string)
Sie können weitere Informationen erhalten Sie hier: https: //dev.mysql .com / doc / api-php / en / apis-php-mysqli.quickstart.prepared-statements.html
Hope, das hilft