Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PHP - cUrl

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PHP - cUrl

    Hallo zusammen,
    ich arbeite seit geraumer Zeit an einem Projekt. Dabei muss ich mit einer API einer Firma arbeiten. Um die von mir benötigten Daten zu erlangen, starte ich per JavaScript mit einem xmlHttpRequest-Objekt eine Anfrage:
    Code:
    var xmlhttp = new XMLHttpRequest();
    	xmlhttp.onreadystatechange = function(){
    		if(xmlhttp.readyState == 4){
    			result = xmlhttp.responseText.split(", ");
    			result_array = JSON.parse(result[12]);
    			result_array_2 = JSON.parse(result[13]);
    			result_array_3 = JSON.parse(result[15]);
    			result_array_4 = JSON.parse(result[16]);
    			result_array_5 = JSON.parse(result[17]);
    			var spellurl = "http://ddragon.leagueoflegends.com/cdn/4.13.1/img/spell/";
    			var itemurl = "http://ddragon.leagueoflegends.com/cdn/4.13.1/img/item/";
    			$("#div_header").slideDown(500);
    			$("#div_header").html("<img src='img/" + result[11] + "_Splash_0.jpg' style='left: -200px; opacity: 0.75; position: absolute; top: -125px;'/>" +
    			"<img id='summonericon' src='" + result[14] + "' /><label class='header_label' id='l10'>" + result[0] + "</label><label class='header_label' id='l11'>" +
    			result[2].toUpperCase() + "</label><label class='header_label' id='l12'>Level " + result[3] + "</label>");
    			$("#div_content").html("<img id='leagueicon' src='img/" + result[4] + "_" + result[5] + ".png' /><label id='l13'>" + result[4] + " " + result[5] + "<br>" +
    								   result[6] + " lp<br>" + series(result[10]) + "<br>" + result[7] + " / <font style='color: green;'>" + result[8] + "</font> / "+
    								   "<font style='color: red;'>" + result[9] + "</font></label><div id='vr'></div><div class='mpcd' id='d1'>most played champions</div><div class='mpcd' id='d2'><img class='mpci' src='img/" +
    								   changeName(result_array[0]["champion"]) + "_Square_0.png' /><label class='mpcl'>" + result_array[0]["champion"] +
    								   "<br>total games: " + result_array[0]["total_games"] + "</label></div>" +
    								   "<div class='mpcd' id='d3'><img class='mpci' src='img/" + changeName(result_array[1]["champion"]) + "_Square_0.png' /><label class='mpcl'>" +
    								   result_array[1]["champion"] + "<br>total games: " + result_array[1]["total_games"] + "</label></div>" +
    								   "<div class='mpcd' id='d4'><img class='mpci' src='img/" + changeName(result_array[2]["champion"]) + "_Square_0.png' /><label class='mpcl'>" +
    								   result_array[2]["champion"] + "<br>total games: " + result_array[2]["total_games"] + "</label></div><div class='mpcd' id='d5'>" +
    								   "<img class='mpci' src='img/" + changeName(result_array[3]["champion"]) + "_Square_0.png' /><label class='mpcl'>" +
    								   result_array[3]["champion"] + "<br>total games: " + result_array[3]["total_games"] + "</label></div>" +
    								   "<div class='mpcd' id='d6'><img class='mpci' src='img/" + changeName(result_array[4]["champion"]) + "_Square_0.png' /><label class='mpcl'>" +
    								   result_array[4]["champion"] + "<br>total games: " + result_array[4]["total_games"] + "</label></div>" +
    								   "<div id='hr'></div><div id='mh1'><img class='playedchampion' src='img/" + changeName(result_array_5[0][0]) + "_Square_0.png' /><img class='spell1' src='" + spellurl +
    								   result_array_5[1][0][0] + ".png' /><img class='spell2' src='" + spellurl + result_array_5[1][1][1] + ".png' /><img class='item1' src='" + checkURL(itemurl +
    								   result_array_5[3][0][0], 1) + ".png' /><img class='item2' src='" + checkURL(itemurl + result_array_5[3][0][1], 2) + ".png' /><img class='item3' src='" + checkURL(itemurl +
    								   result_array_5[3][0][2], 3) + ".png' /><img class='item5' src='" + checkURL(itemurl + result_array_5[3][0][3], 5) + ".png' /><img class='item6' src='" + checkURL(itemurl +
    								   result_array_5[3][0][4], 6) + ".png' /><img class='item7' src='" + checkURL(itemurl + result_array_5[3][0][5], 7) + ".png' /><img class='item4' src='" + checkURL(itemurl +
    								   result_array_5[3][0][6], 4) + ".png' /><label id='score'>" + checkScore(result_array_5[5][0]) + "/" + checkScore(result_array_5[6][0]) + "/" +
    								   checkScore(result_array_5[7][0]) + "</label><label id='playedtime'>" + checkPlaytime(result_array_5[8][0]) + "</label></div>");
    		}else if(xmlhttp.readyState == 3){}
    	};
    	xmlhttp.open("POST", "data.php", true);
    	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    	xmlhttp.send(fetchParameter());
    	$("#div_content").empty().append("<img id='loadinganimation' src='img/ajax-loader.gif'/>");
    Diese Anfrage funkioniert auch einwandfrei, alles kein Problem.
    Diese vom Nutzer eingegebenen Daten, welche hier and die PHP-Datei übergeben werden können allerdings durchaus Schreibfehler oder nicht vorhandene Nutzernamen enthalten.
    Ich habe nun, um die Fehlercodes (400, 401, 404, 429, 500 und 503) von cUrl bzw. der API abzufangen, in der Datei der API, welche von "data.php" aus aufgerufen wird, folgendes "Konstrukt":
    PHP-Code:
    $info curl_getinfo($ch);
                
    //getting http error codes
                
    if($info['http_code'] != 200){
                    switch(
    $info['http_code']){
                        case 
    400: echo("Es ist folgender Fehler aufgetreten: die Anfrage ist nicht korrekt."); break;
                        case 
    401: echo("Es ist folgender Fehler aufgetreten: Sie haben keine Zugriff auf diese Informationen."); break;
                        case 
    404: echo("Es ist folgender Fehler aufgetreten: Dieser Beschwörer existiert nicht."); break;
                        case 
    429: echo("Es ist folgender Fehler aufgetreten: das Anfragelimit wurde überschritten."); break;
                        case 
    500: echo("Es ist folgender Fehler aufgetreten: es ist ein interner Serverfehler aufgetreten."); break;
                        case 
    503: echo("Es ist folgender Fehler aufgetreten: dieser Service ist im Moment nicht verfügbar."); break;
                        default: ; break;
                    }
                    
    curl_close($ch);
                    die();
                }else{
                    
    //close the connection to the riot statistics server
                    
    curl_close($ch);
                    
    //returning the result
                    
    return($result);
                } 
    Nun ist das zwar eine funktionable Lösung, jedoch nicht sonderlich elegant. Ich würde stattdessen lieber eine Art PopUp auf der Seite (der Eingabe) generieren. Hierzu würde ich vorzugsweise JavaScript bzw. jQuery einsetzen. Nun stellt sich mir die Frage, nachdem ich den JavaScript-Code nicht direkt hier (im PHP-Code) per "echo" ausführen kann, wie ich dies sonst tun könnte. Oder alternativ, wie ich das xmlHttpRequest-Objekt mit einer Fehlermeldung aus der PHP-Datei beantworten könnte, um wieder in der JS-Datei zu landen und dort den JS-Code auszuführen zu können.
    Falls es noch Fragen zu meiner Erklärung gibt, beantworte ich diese gerne!
    Ich bedanke mich schonmal im Vorraus für eure Ratschläge.
    Schöne Grüße,
    IwiS


  • #2
    Hab mich momentan nicht so sehr mit dem Thema beschäftigt, aber dir bleibt wohl nichts anderes übrig als mit Ajax zu arbeiten. Ich hab mal als Beispiel das hier im Internet gefunden. Vielleicht bringt dich das auf eine Idee und/oder hilft dir das Problem zu lösen.

    PHP-Code:
    // handles the click event, sends the query
    var function getOutput() {
       $.
    ajax({
          
    url:'myAjax.php',
          
    complete: function (response) {
              $(
    '#output').html(response.responseText);
          },
          
    error: function () {
              $(
    '#output').html('Bummer: there was an error!');
          },
      });
      return 
    false;

    Kommentar


    • #3
      Eine Idee, die mir vorhin noch gekommen ist, wäre, den HTTP-Statuscode der xmlHttpRequest auf "Fehler" zu setzen (manuell, in der switch-Funktion (zweiter Codeausschnitt)) und die Anfrage dann abzubrechen, um so wieder im JS zu landen und dann den Fehler anzuzeigen. Leider habe ich keine Idee wie ich das umsetzen soll.
      Schöne Grüße,
      IwiS

      Kommentar


      • #4
        Dein Titel ist php - cUrl und du holst deine Daten mit javascript?
        Bei deinen Hin- und Her zwischen serverseitigen PHP und clientseitigen Javascript blicke ich nicht durch, andere vermutlich auch nicht. Kommt mir etwas so vor wie 'hinten durch die Brust ins Auge'.
        Nun kenne ich weder die API noch die konkrete Aufgabe, aber prüfe mal, ob du nicht alle benötigten Daten einmal serverseitig per PHP (cUrl) holen und diese dann für deine Javascripte zur Verfügung stellen kannst.
        PHP-Klassen auf github

        Kommentar


        • #5
          Ganz einfach, nutze jQuery Ajax dafür, dann schrumpft dein ganzes Codewirrwar auf 15 Zeilen und du hast das was du willst.
          Edit: Fuel hats dir bereits serviert

          Kommentar


          • #6
            Meine Anfrage ist auch jetzt nur 17 Zeilen lang, was hier das "Codewirrwar" ausmacht, ist die anschließende Verarbeitung, um die Ergebnisse anzuzeigen - und das bleibt mir auch bei Ajax nicht erspart mein Lieber.
            Wann greift den die "error"-Funktion von Ajax genau?
            Schöne Grüße,
            IwiS

            Kommentar


            • #7
              Zitat von IwiS Beitrag anzeigen
              Meine Anfrage ist auch jetzt nur 17 Zeilen lang, was hier das "Codewirrwar" ausmacht, ist die anschließende Verarbeitung, um die Ergebnisse anzuzeigen - und das bleibt mir auch bei Ajax nicht erspart mein Lieber.
              Wann greift den die "error"-Funktion von Ajax genau?
              Sorry...aber es ist Codewirrwar...senden einer Anfrage ans Backend welches wiederrum die Anfrage weiterschickt und die Antwort dann wieder ans Frontend schicken soll...also wenn DAS kein Wirrwar ist weiß ichs auch nicht!
              http://api.jquery.com/jquery.ajax/
              Wenn du statt complete success nimmst sollte dein Problem erledigt sein.
              Oder du schaust dir mal statusCode genauer an...

              Kommentar


              • #8
                dein JS-Code wird noch kürzer, wenn PHP nicht ein Daten-Array schickt, sondern direkt den richtigen Html-Code.
                "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                Kommentar


                • #9
                  Wenn du das jquery-gemülle weglässt und stattdessen angular benutzt, wird es erst richtig gut.
                  Standards - Best Practices - AwesomePHP - Guideline für WebApps

                  Kommentar


                  • #10
                    PHP - cUrl

                    @eagle: Wobei so etwas nur bei einem vernünftigen MVC-Prinzip sinnvoll ist.
                    GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                    Kommentar


                    • #11
                      Da ich keine Ahnung habe, wie ich es sonst umsetzten sollte, können wir es hierbei belassen!
                      Trotzdem vielen Dank für eure Ratschläge!
                      Schöne Grüße,
                      IwiS

                      Kommentar


                      • #12
                        Es wurden doch schon viele Möglichkeiten benannt, um was zu verbessern.

                        Kommentar

                        Lädt...
                        X