konvertieren mysql-Ergebnis in json mit dem richtigen Typen
Weiß ich, wie man eine mysql-Zeile und wandelt Sie in eine json:
$row = mysqli_fetch_assoc(mysqli_query($db, "SELECT * FROM table WHERE id=1"));
echo json_encode($row); //it's an ajax-call
aber:
die db-Reihe verfügt über verschiedene Typen wie int, float, string.
durch Konvertierung mit Funktionen json_encode() alle Ergebnisse sind Streicher.
Gibt es eine bessere Art und Weise zu korrigieren, die Typen, als diese:
$row['floatvalue1'] = 0+$row['floatvalue1'];
$row['floatvalue2'] = 0+$row['floatvalue2'];
$row['intvalue1'] = 0+$row['intvalue1'];
Ich würde gerne eine Schleife über die Schlüssel, und fügen Sie 0, weil:
- ersten coding-Regel: DRY - dont repeat yourself
aber ich kann nicht, weil:
- Zeile hat, auch andere Datentypen als zahlen (string, date)
- es gibt viele Spalten
- design ist in der Entwicklung, so dass Spalten-Namen ändert sich oft
Vielen Dank im Voraus und entschuldigen Sie mein schlechtes Deutsch 🙂
BEARBEITEN (Antwort auf die Kommentar-Frage von Casimir et Hippolyte):
Nenne ich diesen php-code mit ajax dynamisch sql-Werte. in meinem javascript-code, den ich verwenden die Ergebnisse wie dieses:
result['intvalue1'] += 100;
können sagen, dass die json-Ergebnis intval1 50 ist, ist das berechnete Ergebnis:
"50100", nicht 150
- Warum wollen Sie das tun?
- in diesem Fall werfen Sie Ihre Werte in den javascript-code: parseInt, parseFloat.
- gleiche problem in der javascript-code dann. außerdem habe ich eine Abfall-Verkehr durch das senden unnötiger "-chars.
- Sie können
mysqli_fetch_field()
in einer Schleife, um Informationen über jede Spalte aus der Ergebnismenge und verwenden Sie es, um zu wissen, wenn Sie brauchen, um konvertieren Sie den Wert in eine Zahl oder halten Sie es als string. Aber ich denke, es ist einfacher, Sie zu konvertieren Sie den Wertint
oderfloat
(soweit erforderlich) in das javascript, bevor Sie es verwenden. - Durchlaufen Sie das Objekt, und konvertieren Sie entsprechend. Ich würde sscanf verwenden
unnecessary "
:), es ist nichts! und das problem ist nicht die gleichen in javascript, denn javascript hat einen nativen Zugriff auf json-Objekten.- guter Punkt mit mysqli_fetch_field(). Es gibt VIELE Spalten in das Ergebnis-Zeile, mit verschiedenen Typen wie string, date, int, float, manuell konvertieren ist nicht die Lösung. bitte Lesen Sie meine Frage bis zum Ende 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code unten ist nur ein proof-of-concept. Es muss die Kapselung in einer Funktion/Methode und Polieren, bevor Sie es in die Produktion (f.e. rufen Sie
mysqli_fetch_field()
in einer Schleife und Speicher die Objekte, die es gibt, bevor die Verarbeitung einer Zeile, nicht einmal für jede Zeile).Er verwendet die Funktion
mysqli_fetch_field()
, um Informationen über jede Spalte der Ergebnismenge und konvertiert, um zahlen, Spalten, die numerische Typen. Die Werte derMYSQLI_TYPE_*
Konstanten finden Sie in der Dokumentations-Seite Mysqli-vordefinierte Konstanten.$result
fehlte. Ich denke, dass ich entfernt es durch Fehler, wenn ich den code-fragment in die Antwort (ich dachte, es wurde in einer einzigen Ort, und inlined es). Ich habe es jetzt behoben.etwas wie
Wenn Sie einfach nur versuchen, um sicherzustellen, dass Ihre Werte sind operabel mit Bezug auf Ihre Art, müssen Sie zuerst werfen Ihre Art richtig.
Sofern Sie diese benötigen, server-side, nur würde ich-pass-auf die json direkt an den front-end-und die Arbeit dort.
In Javascript, könntest du einen Versuch zur Umwandlung der zahlen in etwa so:
Diese beiden Zeilen versuchen zu casten die Werte als Datum/Anzahl. Wenn Sie können nicht gewirkt werden, bleiben Sie String's.
Einer MySQLi-OO-version, basierend auf @axiac die Antwort, das ergibt ein JSON-array ($jsnAll), die alle Datensätze. In diesem code-snippet, die Methode FixSQLType aufgerufen, um fix eine Zeile. Hinweis: es werden sollte, eingewickelt in ein try{}catch{} block und "objMySQLi" wurde bereits instanziiert:
Den FixSQLType Methode. Dies ist fast identisch mit @axiac Antwort, außer für den Aufruf von $this-> "sqlResult" ->fetch_field_direct($i). "fetch_field" schien, um sich verloren, mit "fetch_field_direct" überwand das problem.