Ankündigung

Einklappen
Keine Ankündigung bisher.

JSON URL in PHP Werte in Variable speichern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • JSON URL in PHP Werte in Variable speichern

    Hallo.

    Ich möchte aus einer JSON URL einzelne Werte in eine PHP Variable speichern
    Irgendwie komme ich nicht weiter, kann mir jemand einen Tipp geben.


    PHP-Code:
      <?php  
    // JSON auslesen    
    $url "https://api.corona-zahlen.org/districts/09362";  
    $json file_get_contents($url);  
    $data json_decode($jsontrue);

    // Datei mal  ausgeben    
    echo"<pre>";  
    var_dump($data);  
    echo
    "</pre>";    

    // Werte ausgeben    
    foreach ($data as $element) {  
    echo  
    $element["name"] ;
     echo 
    "<br>";  
    echo  
    $element["deaths"] ;
      }
     
    ?>
    Die JSON Datei lasse ich ausgeben.

    HTML-Code:
    array(2) {
      ["data"]=>
      array(1) {
        ["09362"]=>
        array(14) {
          ["ags"]=>
          string(5) "09362"
          ["name"]=>
          string(10) "Regensburg"
          ["county"]=>
          string(13) "SK Regensburg"
          ["state"]=>
          string(6) "Bayern"
          ["population"]=>
          int(153094)
          ["cases"]=>
          int(6935)
          ["deaths"]=>
          int(82)
          ["casesPerWeek"]=>
          int(40)
          ["deathsPerWeek"]=>
          int(0)
          ["stateAbbreviation"]=>
          string(2) "BY"
          ["recovered"]=>
          int(6733)
          ["weekIncidence"]=>
          float(26.127738513593)
          ["casesPer100k"]=>
          float(4529.8966647942)
          ["delta"]=>
          array(3) {
            ["cases"]=>
            int(5)
            ["deaths"]=>
            int(0)
            ["recovered"]=>
            int(3)
          }
        }
      }
      ["meta"]=>
      array(5) {
        ["source"]=>
        string(20) "Robert Koch-Institut"
        ["contact"]=>
        string(35) "Marlon Lueckert (m.lueckert@me.com)"
        ["info"]=>
        string(42) "https://github.com/marlon360/rki-covid-api"
        ["lastUpdate"]=>
        string(24) "2021-06-06T00:00:00.000Z"
        ["lastCheckedForUpdate"]=>
        string(24) "2021-06-06T10:21:54.526Z"
      }
    }
    


  • #2
    PHP-Code:
    $meinWert $data["data"]["09362"]["ags"]; 
    Du musst für jede Ebene des Arrays einmal eckige klammern hinten dran schreiben Mehrdimensionale Arrays.
    Tutorials zum Thema Technik:
    https://pilabor.com
    https://www.fynder.de

    Kommentar


    • #3
      Offenbar unterliegst Du einem Irrtum über die Struktur des Arrays $data.

      Die Werte, die Du suchst „liegen“ in $data['data']['09362']['name'] bzw. $data['data']['09362']['deaths']

      Du hast im Kern zwei Möglichen:

      Entweder erst den Array „reduzieren“:

      PHP-Code:
      <?php  
      header
      'Content-Type: text/plain; charset=utf-8' );

      // JSON auslesen    
      $url "https://api.corona-zahlen.org/districts/09362";  
      $json file_get_contents$url );  
      $data json_decode$jsontrue );

      // Datei mal  ausgeben    
      /*
      echo PHP_EOL;
      var_dump( $data );  
      echo PHP_EOL;
      #*/

      # Array reduzieren:
      $arPath=['data''09362'];
      foreach ( 
      $arPath  as $path ) {
          
      $data $data[$path];
      }
      #/*
      echo PHP_EOL;
      var_dump$data );  
      echo 
      PHP_EOL;
      #*/
      // Werte ausgeben    


      echo  $data['name']  , PHP_EOL;
      echo  
      $data['deaths'], PHP_EOL;
      oder (in diesem Einzelfall ist das wohl schneller, weil keine aufwändige Verarbeitung erfolgt) Du greifst auf Deine Daten dort zu, wo diese wirklich liegen:

      PHP-Code:
      <?php
      header
      'Content-Type: text/plain; charset=utf-8' );

      // JSON auslesen    
      $url "https://api.corona-zahlen.org/districts/09362";  
      $json file_get_contents$url );  
      $data json_decode$jsontrue );

      // Datei mal  ausgeben    
      #/*
      echo PHP_EOL;
      #var_dump( $data );  
      var_dump$data['data']['09362'] );  
      echo 
      PHP_EOL;
      #*/

      // Werte ausgeben    


      echo  $data['data']['09362']['name'],   PHP_EOL;
      echo  
      $data['data']['09362']["deaths"], PHP_EOL;
      Hinweise:
      • Da die Werte aus einer Dritten Quelle kommen würde ich vorsehen, dass diese zwischengespeichert und
      • darüber hinauscontextgerecht behandelt, also „entschärft“ werden, sonst hast Du ein Sicherheitsproblem:
        • Was passiert wenn im "Name-Feld" etwas wie <script>alert("böse");</script> steht?
      • Außerdem musst Du prüfen, ob sich die Struktur änderte.
      • Und natürlich, ob Du überhaupt eine Antwort erhalten hast, die darüber hinaus keine Fehlermeldung ist.
      • Womöglich wäre unter diesem Aspekt die Verwendung von curl angemessener. (Viele Hoster verbieten auch das Öffnen von entfernten URLs via file_get_contents())

      Kommentar


      • #4
        Hallo Andreas,
        hallo fastix,

        dann sage ich mal Danke für die schnelle und kompetente Hilfe.

        Hab schon wieder was gelernt

        Schöne Grüße
        Jürgen

        Kommentar


        • #5
          Vereinfachter Zugriff auf 3. Dimension
          PHP-Code:
          <?php

          // JSON auslesen    
          $url "https://api.corona-zahlen.org/districts/09362";  

          if ( 
          $json file_get_contents($url) ){  

              
          $alldata json_decode($jsontrue);

              
          $data $alldata["data"]["09362"];  // auf 3. Dimension reduzieren

              
          $stadt $data["name"];
              
          $bundesland $data["state"];
              
          $wocheninzidenz ceil($data["weekIncidence"]);
          }
          Wenn ein Hoster einem Grundfunktionen verbietet, baut man nicht drum herum, sondern wechselt den Hoster. Es gibt unzählige Hoster, da muss man sich nicht mit Einschränkungen zufrieden geben.

          Kommentar


          • #6
            Ein Like von mir, für die Korrektur meines Unsinns, den Array in zwei Schritten zu „reduzieren“. Das mit dem Hoster ist natürlich nicht überall durchsetzbar. Ein Fehler auf OSI-Level 9 kann nicht durch darunter sitzende Schichten behoben werden...

            Eine Ergänzung noch:

            Wenn (falls) das Skript (hoffentlich nur einmal am Tag, via Cronjob, nicht Webbrowser und Webserver) ausgeführt wird, dann hinten noch ETWAS wie

            PHP-Code:
            else {
                
            mail(
                    
            'somebody@example.org',
                    
            'Fehler: Keine Daten empfangen.',
                    
            'Das Skript ' $_SERVER['PHP_SELF'] . ' hat keine verwertbaren JSON-Daten erhalten.'
                
            );

            ranhängen. Bei installiertem at-Dienst (den gibt es nicht überall) kann man außerdem via system() und „Füttern“ des at-Dienstes) den erneuten Aufruf in 10 Minuten oder so vorsehen:

            PHP-Code:
            $cmd 'echo /usr/bin/php "' $_SERVER['PHP_SELF'] . '" | at now +10 minutes';
            system$cmd ); 
            Hinweis: Auf manchen Systemen bekommt man dann auch ein Mail mit den Ausgaben...

            Kommentar


            • #7
              Zitat von fastix Beitrag anzeigen
              Das mit dem Hoster ist natürlich nicht überall durchsetzbar.
              Eigentlich schon. Ein Hoster ist nur ein Dienstleister. Wenn der sich quer stellt und auf dein Geld verzichten möchte, ist das sein Pech. Schon kurios, dass manche ihrem Hoster gegenüber so unterwürfig sind.

              Kommentar


              • #8
                Zitat von hellbringer Beitrag anzeigen

                Eigentlich schon. Ein Hoster ist nur ein Dienstleister. Wenn der sich quer stellt und auf dein Geld verzichten möchte, ist das sein Pech. Schon kurios, dass manche ihrem Hoster gegenüber so unterwürfig sind.
                OSI-Level 9 sind die Chefs...

                Kommentar


                • #9
                  Aber bevor ich jetzt meinen Code an willkürliche Hoster-Umgebungen anpasse, würde ich gleich sowas wie Guzzle verwenden:

                  https://docs.guzzlephp.org/en/stable/

                  Man muss ich das Leben ja nicht unnötig selber schwer machen. Weil als nächstes kommt der Hoster vielleicht auf die Idee auch cURL zu deaktivieren und man muss seinen Code wieder umschreiben.

                  Kommentar


                  • #10
                    Zitat von fastix Beitrag anzeigen
                    OSI-Level 9 sind die Chefs...
                    Schön dann hätten wir das auch geklärt, wusste gar nicht dass man mich so bezeichnet.

                    Lies dir mal die Fragestellung durch. Du verhaspelst dich immer tiefer am Thema vorbei. Er hat ja bereits filegetcontents verwendet, also hat er damit kein Problem.

                    Das man mail nicht roh verwenden sollte, so wie du es in deinem korrigierten Beitrag zeigst, sei nur am Rande erwähnt.

                    Kommentar


                    • #11
                      Zitat von protestix Beitrag anzeigen
                      Das man mail nicht roh verwenden sollte, so wie du es in deinem korrigierten Beitrag zeigst, sei nur am Rande erwähnt.
                      Hehe. Zum Versenden einfacher Textmails - wie z.B. der gezeigten Statusmeldung - ist es absolut geeignet, und die kommen sogar an. Kirche, Dorf und so weiter.

                      Du verhaspelst dich immer tiefer am Thema vorbei.
                      Nun, wenn der TO die ursprünglichen Probleme hat - warum sollte man ihm nicht ein paar Tipps mit auf den Weg geben?

                      wusste gar nicht dass man mich so bezeichnet.
                      Eigentlich zielt Level 9 auf die „Organisation“ ab, damit ist etwas wie „Firma“, „Institut” u.s.w. gemeint. Aber da (vorliegend bei der Wahl des Hosters) bestimmen ja die Chefs. Es gibt (natürlich nur inoffiziell) außer dem noch den Level 10 (den Staat a.k.a. „Legal and External Compliance Layer“)

                      Quelle: https://de.wikipedia.org/wiki/Layer_8

                      Kommentar


                      • #12
                        Zitat von fastix Beitrag anzeigen

                        Hehe. Zum Versenden einfacher Textmails - wie z.B. der gezeigten Statusmeldung - ist es absolut geeignet, und die kommen sogar an. Kirche, Dorf und so weiter.
                        Das Problem ist, das es bei dir jetzt funktioniert und du das öffentlich machst. Dann kommt der Nächste und beruft sich auch noch auf diesen Tipp in diesem Thread. Behalte also deine eigenen Vorgehensweisen für dich und gib nur Tipps weiter, die nicht an deine Umgebung gebunden sind.

                        Zitat von fastix Beitrag anzeigen
                        Nun, wenn der TO die ursprünglichen Probleme hat - warum sollte man ihm nicht ein paar Tipps mit auf den Weg geben?
                        Weil dieser Tipp hier
                        PHP-Code:
                        $cmd 'echo /usr/bin/php "' $_SERVER['PHP_SELF'] . '" | at now +10 minutes';
                        system$cmd ); 

                        Unsinn ist.
                        Was hat das mit PHP zu tun?
                        $_SERVER['PHP_SELF'] sollte man nicht verwenden.
                        /usr/bin/php funktioniert nicht auf allen Systemen(windows etc.).
                        Mit Systemaufrufen sollte man generell vorsichtig sein.

                        Will das hier abschliessen, da das sonst nur unendlich weiter geht, ich hoffe du hast verstanden was ich mitteilen wollten. Ansonsten kannst du gerne unter Offtopic einen Faden eröffnen, da dies hier mit der eigentlichen Fragestellung des TE nichts mehr zu tun hat.


                        Kommentar


                        • #13
                          Ich glaube, Du willst „nur ein wenig schimpfen“, denn
                          1. der Tipp ist keineswegs Unsinn: Wenn der TO die JSON-Daten von einem fremden Server abholt, dann sollte er das (gerade im Hinblick auf die gezeigten, auch nur einmal am Tag aktualisierten Daten) seinerseits regelmäßig tun (Cronjob)- und reagieren können, wenn das nicht klappt z.B. weil der Server gerade überlastet ist,. PHP hat dafür keine eigene Funktionalität, es ist also eine gute Idee, den systemeigenen at-Dienst zu benutzen. (Viel Spaß mit Windows, auf dem Mac kann man den haben.)
                          2. mail() war, ist und bleibt (mindestens) zum Versenden einfacher Statusmails ausreichend. Wenn es wie hier vorliegend einfacher Text ist, die Empfangsadresse, das Subjekt und der Text vom Programmierer bestimmt werden, dann musst Du nicht ein ganzes Framework benutzen, mit dem man Tod, Teufel und Bargeld verschicken kann.
                          3. mail() (aus php) und das Unix-Tool mail funktionieren auf meinem Webserver und auf meinem Homeserver seit Jahren bestens. Die Mails kommen sogar bei gmail an. Grundlage ist ein sauber konfigurierter exim4. Beide mit „Smarthost“. Mit XAMPP wird das (wie auch at) natürlich nicht laufen.
                          Du solltest nicht so unbedarft mit harten und unberechtigten Worten um Dich werfen. Ansonsten kann es Dir passieren, dass ich Dir auf genau die selbe Weise komme. Und glaube mir, dann fühlst Du Dich nicht weniger „dumm bekrittelt“ als ich.

                          Kommentar


                          • #14
                            Zitat von fastix Beitrag anzeigen
                            [*]mail() war, ist und bleibt (mindestens) zum Versenden einfacher Statusmails ausreichend. Wenn es wie hier vorliegend einfacher Text ist, die Empfangsadresse, das Subjekt und der Text vom Programmierer bestimmt werden, dann musst Du nicht ein ganzes Framework benutzen, mit dem man Tod, Teufel und Bargeld verschicken kann.[*]mail() (aus php) und das Unix-Tool mail funktionieren auf meinem Webserver und auf meinem Homeserver seit Jahren bestens. Die Mails kommen sogar bei gmail an. Grundlage ist ein sauber konfigurierter exim4. Beide mit „Smarthost“. Mit XAMPP wird das (wie auch at) natürlich nicht laufen.[/LIST]Du solltest nicht so unbedarft mit harten und unberechtigten Worten um Dich werfen. Ansonsten kann es Dir passieren, dass ich Dir auf genau die selbe Weise komme. Und glaube mir, dann fühlst Du Dich nicht weniger „dumm bekrittelt“ als ich.
                            Du verlässt dich also darauf, dass mail() beim Hoster richtig konfiguriert ist? Wozu sich auf irgendwas blind verlassen, wenn man selber die Kontrolle haben kann? PHPMailer ist jetzt nicht wirklich ein Framework, sondern nur eine kleine und bewährte Library. Also ich persönlich sehe keinen Grund mail() zu verwenden. Es bietet keinen Vorteil, aber dafür mögliche Probleme, wenn nicht alles 100% korrekt konfiguriert ist.

                            Was jeder bei sich daheim macht, bleibt ihm überlassen. Aber ich würde hier keine Empfehlung für mail() aussprechen, die andere lesen und dann potenziell Probleme damit haben.

                            Kommentar


                            • #15
                              Zitat von hellbringer Beitrag anzeigen
                              Du verlässt dich also darauf, dass mail() beim Hoster richtig konfiguriert ist?
                              Unter unixoiden Betriebsystemen (darunter Linux, Mac) beschränkt die Konfiguration der PHP-Funktion mail() auf die Angabe des Programms, ggf. des Pfades zum Programm sendmail und dessen Optionen in der PHP.ini. Die Defaults passen wenn man nicht etwas sehr seltenes und spezielles hat:

                              Code:
                              [mail function]
                              ; For Win32 only.
                              ; http://php.net/smtp
                              SMTP = localhost
                              ; http://php.net/smtp-port
                              smtp_port = 25
                              
                              ; For Win32 only.
                              ; http://php.net/sendmail-from
                              ;sendmail_from = me@example.com
                              
                              ; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
                              ; http://php.net/sendmail-path
                              ;sendmail_path =
                              
                              ; Force the addition of the specified parameters to be passed as extra parameters
                              ; to the sendmail binary. These parameters will always replace the value of
                              ; the 5th parameter to mail().
                              ;mail.force_extra_parameters =
                              
                              ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
                              mail.add_x_header = Off
                              
                              ; The path to a log file that will log all mail() calls. Log entries include
                              ; the full path of the script, line number, To address and headers.
                              ;mail.log =
                              ; Log mail to syslog (Event Log on Windows).
                              ;mail.log = syslog

                              Wenn der Hoster das nicht hinbekommt sollte man ihn wechseln. Denn dann hat er gezeigt, dass er etwas sehr grundlegendes nicht kann. Man kann ihm auch einen Kurs bei mir empfehlen...

                              Kommentar

                              Lädt...
                              X