JSON Key nicht hardcodieren, sondern via Variable zugreifen

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 ü 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