PHP: assoziatives Array mit allen Inhalten aus einer Tabelle füllen und als JSON Objekt speichern?


11.08.2020, 15:30

Mein Code sieht nun wie folgt aus:

$stmt = $con->query("SELECT * FROM Tabelle1 WHERE ID=$id");
$arr = array();
while ($row = $stmt->fetch()) {
    $arr = $row;
}
$obj->premium = $arr;

Leider bekomme ich folgende Ausgabe:

Zuerst wird der Index des Arrays ausgegeben. Wo liegt der Fehler?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Du brauchst gar keine Schleife. Verwende die fetch_all-Methode, um alle Einträge aus dem ResultSet in ein Array zu holen. Als zweites Argument übergibst du der Methode den Flag MYSQLI_ASSOC.

regex9  11.08.2020, 16:56

Korrektur:

Für PDO wäre fetchAll die Methode der Wahl. Der korrekte Flag (fetch_style) wäre PDO::FETCH_ASSOC.

1

Zufälligerweise, stand ich bis vor kurzen vor genau der gleichen Sachlage.

Ich hab das so gelöst:

  1. Ein JSON Object ist sogesehen ein Array. Das heißt du musst die Informationen (Arrays) in einem Array speichern.

Hier ist mein Code. Bedenke das mein Code eine Vermischung der verschiedenen PHP Arten darstellt. (Prozedurales und Objektorientiertes wurde vermischt. Bin selbst noch nicht dazu gekommen es zu ändern. Es funktioniert aber.)

  $result = mysqli_query($mysqli, $sqlQuery);
 
 
$json_array = array();
 
while($row = mysqli_fetch_assoc($result)){
 
$json_array[] = $row;
}
 
header("Content-Type: application/json");
print json_encode($json_array , true);

In dem Codesnippet wird das result ausgelesen. Dann wird ein Array initialisiert. Anschließend wird jede Row, die ja aus einzelnen Columns besteht, und selbst ein Array darstellt, in dem Array gepsiechert. Das passiert solange, bis sämtliche Datensätze ausgelesen wurden.

Hier ist wichtig, dass der Content-Type festgelegt wird. Also dass im header steht, um was es sich genau handelt. Am Ende gibst du das Array zurück.

Ich hoffe ich konnte dir helfen.

Wenn du noch weitere Fragen hast, wie du diese Objekte beispielsweise in Java weite verarbeitest, kann ich dir auch weiterhelfen. Da hatte ich hier super Hilfe bekommen.

Als kleines Extra hier ein Link, das Thema betreffend. Evtl hilft dir das ebenfalls weiter.

https://www.gutefrage.net/frage/in-php-daten-aus-der-datenbank-in-json-speichern#answer-361158019

Woher ich das weiß:eigene Erfahrung
Ollig00 
Fragesteller
 11.08.2020, 14:06

Vielen Dank für dein CS! In dem Fall habe ich noch ein kleines Problem: https://prnt.sc/txqh2y

Ich bekomme das Ergebnis zwei mal. Einmal mit und einmal ohne Spaltenname. Ich brauche das Ergebnis mit Spaltenname.
Hast Du da eine Idee?

MfG

0
Nevron  11.08.2020, 14:53
@Nevron

Ich hatte das gleiche Problem. ich arbeite mit Prepared Statements. Daran lag es. :)

0
Ollig00 
Fragesteller
 11.08.2020, 14:59
@Nevron

Ich nutze auch prepared statements, in dem Fall ist $id ein fixer Wert, also völlig irrelevant von einer Injection. :) Aber wo bitte ist denn execute? Mein Code:

$stmt = $con->query("SELECT * FROM Tabelle1 WHERE ID=$id");
$arr = array();
while ($row = $stmt->fetch()) {
    $arr = $row;
}
$obj->premium = $arr;

MfG

0
Nevron  11.08.2020, 15:16
@Ollig00

In deinem Fall musst du nochmal gucken. Ich habe gelesen, dass die Statements schon im Vorfeld abgesetzt sind. Deswegen sind es ja Prepared Statements. Die Parameter werden ja erst danach eingebunden. Ich kann dir sagen, dass es daran liegt. Das hatte ich wie gesagt, auch so nachgelesen gehabt. In meinem Fall lag es dann am Execute().

Ich guck grad mal und poste gleich nochmal.

0
Ollig00 
Fragesteller
 11.08.2020, 15:26
@Nevron

Ja, bei prepared statements werden die Statements vorbereitet, daher auch prepared. Im Wesentlichen wird das zum Schutz vor SQL Injections verwendet. Bei der Vorbereitung werden die Parameter mit in das Statement eingebunden, also 1:1 wie der Parameter ist. Bei der normalen, von mir verwendeten Methode, werden keine Parameter mit eingebunden, sondern es wird nur der String mit den verwendeten Variablen gebaut. Bei den prepared Statements ist das wie, als würde man im HTML Code statt

"

einfach

&#34

schreiben. Auf der Seite wird dann das gleiche Zeichen ausgegeben.
Aber da das nicht unser Thema ist, schreibe ich mal mit dem Wesentlichen weiter :)

Ich frage mich, wieso ich als erstes den Index des Arrays ausgegeben bekomme... Ich versuche schon zu debuggen, aber bisher kam ich noch nicht auf das Ergebnis.

MfG

0
Nevron  11.08.2020, 15:29
@Nevron

Bei mir war die Situation etwas anders. Ich glaube du müsstest etwas mehr von dem Code zeigen. (Natürlich ohne die Serververbindungsdaten).

Aber guck dir mal den Link hier an:

https://stackoverflow.com/questions/55011439/sql-query-inserts-data-in-database-twice

Eventuell hilft dir das weiter. Bin aktuell ebenfalls dran meine PHP Kentnisse auszubauen und daher nicht der kompetenteste Ansprechpartner im Augenblick für solche Sachen.

*edit* Ja das weiß ich. ich nutze auch prepared Statements gegen Injection.

Sorry. Würde dir gern mehr weiterhelfen.

0
Ollig00 
Fragesteller
 11.08.2020, 15:37
@Nevron

Danke. Was meine Kenntnisse in PHP angeht, bin ich mit diesem Problem auch dabei, sie zu erweitern. Ich kann eigentlich relativ gut in PHP programmieren, aber solche meist kleinen Probleme sind dann doch immer wieder eine neue Hürde.

Darf ich denn mal fragen, an welche Programmierarbeit Du dich aktuell befindest? Vielleicht kann ich Dir auch weiterhelfen bzw. wir beide uns mal speziell darüber unterhalten? Wenn Du magst, kannst Du mir auch eine Freundschaftsanfrage senden, damit wir uns privat austauschen können.

MfG

0
Nevron  11.08.2020, 16:22
@Ollig00

Gerne. Ich habe bis jetzt PHP meist nur für kleinere Abfragen genutzt. Accountverifizierungen, prüfen ob ein Account existiert und jetzt als letztes JSON-Objekte zum Java-Client zurücksenden um die Daten dort weiter zu verarbeiten. Meine Skripte waren bisher nur kleinerer Natur. Aber berufsbedingt muss und will ich mich ohnehin mit PHP intensiv beschäftigen.

0
regex9  11.08.2020, 16:22
@Ollig00

Das Problem liegt darin, dass PHP die Daten nach unterschiedlichem Schlüssel aufbereitet. Einmal nach Index, einmal nach Key. Du kannst also selbst beim Auslesen entscheiden, ob du den Spaltennamen nutzen möchtest oder den Index.

Eine Filterung ist möglich und wird im Snippet der Antwort auch schon gemacht:

mysqli_fetch_assoc($result)

An der Stelle wird ein assoziatives Array geholt, welches für die Keys zu den Einträgen nur die Spaltennamen verwendet.

Für dich wäre das:

$stmt->fetch_assoc()

Die Alternative (indexiert) dazu:

$stmt->fetch_row()
2
Ollig00 
Fragesteller
 11.08.2020, 16:40
@regex9
$stmt->fetch_assoc()
$stmt->fetch_row()

funktioniert bei mir nicht. Also ich nehme mal an, dass das so in die while-Schleife soll, richtig? Ich habe sogar mal einfach nur das Statement ausgeführt und da kommt schon das Ergebnis zweimal raus.

$stmt = $con->query("SELECT * FROM Tabelle1 WHERE ID=$id");
$stmt->fetch();

Ich verstehe das nicht... ._.

0
regex9  11.08.2020, 16:52
@Ollig00

Moment einmal, hier ist gerade etwas ziemlich durcheinandergekommen. Nevron bezieht sich auf MySQLi, du aber nutzt PDO. Da sieht das dann natürlich etwas anders aus.

Die Erklärung ist die Gleiche, nur brauchst du diese Änderung:

$stmt->fetch(PDO::FETCH_ASSOC);

Meine Antwort oben korrigiere ich jetzt auch gleich noch.

1