JSON Key nicht hardcodieren, sondern via Variable zugreifen


djinfinity

Grünschnabel
Liebe Boardies
Ich bin absoluter Anfänger in Bezug auf "json" - viele Tutorials durchgelesen, viele Videos mir angesehen,
doch irgendwann kam ich nicht mehr weiter ...

Die Aufgabe :

PHP:
///////////////////////////
// Sender Zahl eintragen
// Hinterlegte Seite nur als Beispiel
$url = "https://deineseite.de/?ch=0";
// Inhalte holen
$daten = file_get_contents($url);
// Dekodieren der Inhalte
$inhalte = json_decode($daten);
// IDs der Moderatoren
// 146 = Moderator 1
// 353 = Moderator 2
// 339 = Moderator 3
//////////////////////////
<b><br /> Moderator</b><br />
<?php
echo $inhalte->live_show ->presenter_array ->{'339'}
?>
In der Json steht folgendes drin :
JSON:
            [presenter_array] => Array
                (
                    [339] => Moderator 3
                )
Das Problem, was ich nicht verstehe :
Wie kann ich das bewerkstelligen, das beim " presenter_array ->{'339'} " eine Variable hinterlegt werden kann, welche in der { hier eine Variable? },
damit ich die " IDs " der jeweiligen Moderatoren ansprechen kann, und diese entsprechend ausgebe.
Da die Variablen "wechselnd" sind, stellt dieses für mich eine Hürde da.

In der Json wechseln die Zahlen in der [ ] - deswegen habe ich in der php bereits "ID´s" angelegt.

Würde mich freuen, wenn Ihr mir dabei helfen könntet - Danke sehr
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Willkommen im Forum! :)

Nimm die Zugriffsart per eckiger Klammern: ...->presenter_array[$yourVariable]. Das nächste Mal bitte einen aussagekräftigen Threadtitel wählen. Ich habe mich mal darum gekümmert und das Thema außerdem in das PHP-Forum verschoben ;)
 

djinfinity

Grünschnabel
Willkommen im Forum! :)

Nimm die Zugriffsart per eckiger Klammern: ...->presenter_array[$yourVariable]. Das nächste Mal bitte einen aussagekräftigen Threadtitel wählen. Ich habe mich mal darum gekümmert und das Thema außerdem in das PHP-Forum verschoben ;)
Danke erst mal für das Verschieben - Bin ein "Newbie" in diesem Forum ;)

Zur Antwort Deinerseits :
Funktioniert dieses auch bei wechselnden IDs ????
 

ComFreek

Mod | @comfreek
Moderator
Probier's halt aus! Im Zweifel funktioniert alles, was eine Variable nutzt, immer für variable Inhalte.
 

djinfinity

Grünschnabel
PHP:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Aktualisierung einbinden
// Aktualisierung ist auf 30 secs
// header("refresh: 30;");
///////////////////////////
// Konfiguration
// Sender - Nummern
// RMNradio = 0
// Hier können noch weitere Sender stehen
///////////////////////////
// Sender Zahl eintragen
$url = "https://api.schlagerparadies.de/get_basic_summary/?ch=0";
// Inhalte holen
$daten = file_get_contents($url);
// Dekodieren der Inhalte
$inhalte = json_decode($daten, true);
// Variablen zum Auslesen
// Interpret
$artist = $inhalte ['meta'] ['artist'];
// Title
$title = $inhalte ['meta'] ['title'];
// Amazon Asin
$amazon = $inhalte ['meta'] ['amazon'] ['asin'];
// cover
$cover = $inhalte ['meta'] ['amazon'] ['images_url']['large'];
// kein Cover 
$nocover ="nocover.jpg";
// Kein Cover - Tag Anzeige
$nocovertitle ="kein Cover verf&uuml;gbar";

?>

<table width="100%">
<tbody>
<tr>
<td rowspan="2" valign="top" align="left"><span style="text-decoration:underline;">Interpret:</span>&nbsp;
<?php echo $artist;?><br />
<span style="text-decoration:underline;">Titel :</span>&nbsp;
<?php echo $title;?><td valign="top" align="left"><span style="text-decoration:underline;">
<?php echo "<img src=\"".$cover."\" title=\"".$artist."\">";?>
<?php 
// Check - ob Cover vorhanden
if ($cover==Null)
{
 echo "<img src=\"".$nocover."\" title=\"".$nocovertitle."\">";
}
else
{
echo "<img src=\"".$cover."\" title=\"".$artist."\">";
}
?>

<br />
<?php echo "<a href=\"https://amazon.de/gp/product/".$amazon."\" target=\"_blank\"><span style=\"text-decoration:underline;\"><img src=\"./station_logos/ama_logo.png\" width=\"32px\" height=\"32px\" title=\"Bei Amazon kaufen\"</span></a>"; ?>
&nbsp;<a href="http://metadyn.rmnradio.net/playlist.php?chid=0&bgcol=00315c&fgcol=fff" target="webtoolframe" onClick="window.open('http://metadyn.rmnradio.net/playlist.php?chid=0&bgcol=00315c&fgcol=fff', 'webtoolframe', 'width=600,height=400,hotkeys=no,menubar=no,locationbar=no,resizeable=no,status=no')"><img src="./station_logos/plist.png" title="Playliste anzeigen"></a>&nbsp;<a href="http://metadyn.rmnradio.net/wunschbox/index.php?ch_id=0" target="webtoolframe" onClick="window.open('http://metadyn.rmnradio.net/wunschbox/index.php?ch_id=0', 'webtoolframe', 'width=600,height=400,hotkeys=no,menubar=no,locationbar=no,resizeable=no,status=no')"><img src="./station_logos/mail.png" title="Dein Musikwunsch"></a></td>
</td>
</tr>
</tbody>
</table>
Tante Edit ;)
Ich glaube, das ich es gefunden habe ...
Bitte dennoch drüber schauen ...
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
Ah :) Ja, ich erinnere mich auch noch an das HTML-Buch von 1998 von Markt & Technik mit dem ich damals angefangen habe! Das liegt sogar noch im Regal aus nostalgischen Gründen :)
 

djinfinity

Grünschnabel
Immer noch XSS durch naive Interpolation von Daten in HTML.
Was meintest Du mit dieser Aussage ? Ich bin ja "NEWBIE" in Sachen "JSON" und ehrlicherweise, ich bin froh, das das so funktioniert ;) Falls du aber eine andere Lösung haben solltest, welche einfacher und effizienter wäre / ist - Gern nehme ich diese ...

Ja, ich erinnere mich auch noch an das HTML-Buch von 1998 von Markt & Technik mit dem ich damals angefangen habe! Das liegt sogar noch im Regal aus nostalgischen Gründen
Mein Anfangsbuch steht noch immer im Regal - Kannst Du dich noch an ein "HTML-Schnellstart" VErzeichnis in Größe einer etwas größeren "Scheck-Karte" erinnern ? Das funktioniert noch heute ...
Ausserdem bin ich so gestrickt, das alles sauber funktionieren sollte - und das mit den Umlauten, das schreibste einfach automatisch in das HTML - auch im Dreamweaver etc ;)
 

ComFreek

Mod | @comfreek
Moderator
Was meintest Du mit dieser Aussage ?
Ich halte mich manchmal hier extra kurz, wenn das Internet bereits eine Fülle an Informationen dafür bereitstellt. In den Fällen sind meine Sätze nur als Container von Schlüsselwörtern gedacht ;) Such also etwa nach "php prevent xss html" im Internet.
Du wirst dann auf PHP: htmlspecialchars - Manual stoßen. Poste ruhig den Code nach den Änderungen, dann kann ich nochmal drüberschauen ;)

Ausserdem bin ich so gestrickt, das alles sauber funktionieren sollte
Ich bin ja heutzutage der Ansicht, dass wenn du ein Zeichen direkt in den Quelltext schreibst (also ä, ö, ü oder auch ) und es nicht funktioniert, dann ist irgendetwas am Setup kaputt :) Insofern, wann immer ich &uuml; sehe, ist das entweder historischer Code oder Code in einem kaputten Setup. (Es gibt wohl nur sehr wenige gute Gründe kein UTF-8 zu nutzen.)

Edit: Wie lustig, oben in "oder auch )" ist das Emoji verschwunden, was ich hier eingefügt hatte. Ist der Editor hier etwa kaputt oder absichtlich abgeschirmt gegenüber Emojis?


Kannst Du dich noch an ein "HTML-Schnellstart" VErzeichnis in Größe einer etwas größeren "Scheck-Karte" erinnern ? Das funktioniert noch heute ...
Ne, das kenne ich gar nicht :) In dem Buch, was ich meinte, gab es ein großes Kapitel zu VRML.
 

djinfinity

Grünschnabel
jetzt habe ich aber mal eine Frage [ erneut :( ]
Dieses steht in meiner Config
PHP:
// Sender Zahl eintragen
$url = "https://api.schlagerparadies.de/get_basic_summary/?ch=0";
// Inhalte holen
$daten = file_get_contents($url);
// Dekodieren der Inhalte
$inhalte = json_decode($daten, true);

// Uhrzeit holen
$zeit = $inhalte ['meta'] ['starttime'];
Dieses lasse ich dann in eine Datenbank schreiben ... Soweit so gut

PHP:
// Json Daten holen
          $daten = file_get_contents($url);
      echo "Datei geladen.\n";
          $array = json_decode($daten, true);
          //foreach($array as $row)

//Daten Speichern
$sql = "INSERT INTO showdaten (starttime, artist, title, cover, amazon) VALUES ('$zeit', '$artist', '$title','$cover', '$amazon')";

if ($datenbank->query($sql) === TRUE) {
    echo " Daten eingetragen ";
}
else {
    echo "Fehler: Keine Verbindung zur Datenbank " . $sql . "<br>" . $datenbank->error;
}


$datenbank->close();
Dann möchte ich das aber wieder umwandeln - So das es sauber angezeigt werden kann.
Das mache ich so :
PHP:
<?php
require 'db.php';
$sql = "SELECT * FROM showdaten ORDER BY id DESC LIMIT 10";
echo '<table>';
foreach ($datenbank->query($sql) as $row)
  {
    echo '<tr>';
    echo '<td>' . $row[starttime] . '</td>';
    echo '<td>' . '<img src="'.$row[cover].'"</td>';
    echo '<td>' . $row[artist] . '</td>';
    echo '<td>' . $row[title] . '</td>';
    echo '</tr>';
  }
  echo '</table>';

?>
Jetzt zu meinem Problem :
Wie bekomme ich das hin, das das Datum aus der Datenbank richtig angezeigt wird - und nicht als langer String :
Code:
"Sat, 18 Apr 2020 10:16:24 +0200"
Wenn es :
PHP:
date_default_timezone_set('Europe/Berlin');
echo "um: ";
echo date("H:i ",strtotime($zeit));
echo "Uhr";
so angezeigt werden könnte, wäre es top - Doch irgendwie fehlt mir der Dreh gerade, wie ich das bewerkstelligen kann ...

Anmerkung : Die Zeit wird als varchar 255 in die Datenbank eingetragen

Danke der Hilfe ;)
 
Zuletzt bearbeitet:

ComFreek

Mod | @comfreek
Moderator
$sql = "INSERT INTO showdaten (starttime, artist, title, cover, amazon) VALUES ('$zeit', '$artist', '$title','$cover', '$amazon')";
Und hier ist leider die nächste Sicherheitslücke: SQL Injection.
echo '<td>' . $row[starttime] . '</td>'; echo '<td>' . '<img src="'.$row[cover].'"</td>'; echo '<td>' . $row[artist] . '</td>'; echo '<td>' . $row[title] . '</td>';
Und wieder XSS -- abgesehen davon, dass das invalider PHP-Code ist: starttime, cover, artist und title müssten in Quotes stehen. (Dass PHP das trotzdem akzeptiert, ist m. E. ein Designfehler von PHP.)


Anmerkung : Die Zeit wird als varchar 255 in die Datenbank eingetragen
Kannst du hier ein Beispieldatensatz geben? Meines Erachtens ist hier die Speicherung als VARCHAR auch ein Designfehler.
 

djinfinity

Grünschnabel
Code:
Json

{"req_unique_id":"5e970e3a8a341","req_timestamp":"Wed, 15 Apr 2020 15:38:02 +0200","listcount_24h":37564,"prg_name":"Rockhausradio","live_show":{"key":{"id":"722","named":"RockZone"},"type":{"id":"0","named":"Auto-DJ","id_possible":["Auto-DJ (Musikautomation)","Vorproduktion","Livesendung","Aussenuebertragung","Livesendung (Simulcast)","Wiederholung"]},"epg":{"description":"mit Rock - hardrock und Metal durch den Nachmittag","starttime_hour_minute":"15:00","stoptime_hour_minute":"18:00"},"presenter_array":{"149":"RMN Alice_C"},"wishbox":{"routing":{"id":"1","named_modinterface":"Routing der Wunschbox zur Sendeautomation","id_possible":["Ausgeschaltet","Sendeautomation","Sendestudio"]},"wish_count_max":"2"}},"meta":{"artist":"Schoengeist","title":"Wehe!","starttime":"Wed, 15 Apr 2020 15:35:02 +0200","amazon":{"asin":null,"manufacturer":null,"images_url":{"std":"http:\/\/metadyn.rmnradio.net\/img\/no_cover.jpg","mini":"http:\/\/metadyn.rmnradio.net\/img\/no_cover._SL30_.jpg","med":"http:\/\/metadyn.rmnradio.net\/img\/no_cover._SL75_.jpg","large":"http:\/\/metadyn.rmnradio.net\/img\/no_cover._SL110_.jpg","big":"http:\/\/metadyn.rmnradio.net\/img\/no_cover._SL160_.jpg"},"cache":{"inserted":"Wed, 30 Nov -001 00:00:00 +0100"}}}}
Auslesen soll er die Starttime : Macht er
Eintragen in DB : Macht er
Umwandeln : Bei mir ein Denkfehler

Und hier ist leider die nächste Sicherheitslücke: SQL Injection.
Darum kümmere ich mich noch - Ist noch nicht auf "Life-Server"

Und wieder XSS -- abgesehen davon, dass das invalider PHP-Code ist: starttime, cover, artist und title müssten in Quotes stehen. (Dass PHP das trotzdem akzeptiert, ist m. E. ein Designfehler von PHP.)
Wird ebenfalls noch korrigiert ....
 

djinfinity

Grünschnabel
Das Problem mit der Zeit wurde gelöst
Einfach in der "config" dieses eintragen :

PHP:
// Zeit umwandeln
$zeit_datum = date_format(new datetime($zeit ), 'H:i');
Damit wäre das gelöst, und es wird auch entsprechend angezeigt :
Hier ansehen

Jetzt habe ich aber noch ein klitzekleines - Sprich DENKPROBLEM :(
In die Datenbank wird alles sauber eingetragen, Datum, Zeit, Cover, Amazon etc ... Eben alles, was gebraucht wird. Doch, und jetzt mein Problem :
Es gibt einige Titel, welche kein " Cover " und Amazon haben,eingetragen wird es trotzdem, weil notwendig.

Wie kann ich das jetzt realisieren, das der die Datenbank ausliest, und wenn er keine Daten findet, das er dann mir ein definiertes Fehlerbild anzeigt ?

Danke der Hilfe
 

djinfinity

Grünschnabel
ist dieser Ansatz richtig ????

PHP:
// Datenbank Abfrage
$sql = "SELECT artist, cover FROM showdaten ORDER BY id DESC LIMIT 5";
$result = $datenbank->query($sql);

if ($result->num_rows > 0) {
    // Daten zählen
    while($row = $result->fetch_assoc()) {
        echo "<br>Interpret : " . $row["artist"]. " <br>Cover: ". $row["cover"]. "<br>";
    }
} else {
    echo "<img src=\"./img/nocover.jpg\">";
}
 

ComFreek

Mod | @comfreek
Moderator
Nein, deine IF-Abfrage macht eher wenig Sinn. Davon unabhängig, bist du dir sicher, dass in deiner Tabelle (zum Beispiel in der letzten Zeile in deinem Screenshot) tatsächlich NULL-Werte und nicht etwa nur leere Strings gespeichert sind?
 

djinfinity

Grünschnabel
habe das Problem gelöst ...
Es darf gerne geschlossen werden ...
Falls einer das Script haben möchte, bitte mich per PN anschreiben ...
Danke der Hilfe