Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » HTML, JavaScript & CSS » Json objekt enthält Javascript    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
dreide
Mitglied
Anfänger


Dabei seit: 12.04.2016
Herkunft: keine Angabe
Posts: 42
     Json objekt enthält Javascript Zitat | Bearbeiten

Hallo, ich bin gerade dabei eine kleine Anwendung zu machen die mit hilfe der Ebay-Api verschiedene Anzeigen durchsucht. Der Benutzer kann vorher in ein Interface seine suchkriterien eingeben, die dann mit Javascript kontrolliert werden und über Ajax an PHP zurück gegeben werden. Die Anzeigen werden mittels einer Schleife durchgegangen und immer der Preis und die Bild-URL an Javascript mittels Json übergeben. Da dies teilweise sehr lange dauert wollte ich einen Ladebalken hinzufügen der z.B pro 5 durchgegangene Items um 1% nach vorne geht. Dazu müsste ich über PHP eine Javascript Funktion via echo aufrufen, die den Balken skalliert oder den Javascript Code dierekt in die PHP Schleife integrieren. Das ganze sieht zurzeit ungefähr so aus:
 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:

<html>
<body>
//Eingabeformular
<div style="position: absolute;height: 16px; background-color: green;" id="bar">
</body>

<?php
$x 
1;
//via Ajax übergebene Variablen
// Ebay-Api Call
      
foreach($resp->searchResult->item as $item) {//Jedes Item wird durchlaufen
          
$picURL $item->galleryURL;
        
        
$price sprintf("%01.2f"$item->sellingStatus->convertedCurrentPrice);

        
$x++;
        if (
== $x){
            
$x $x."%";
?>
<script>
    width++;
    var elem = document.getElementById("bar");   
        elem.style.width = width + '%';
</script>
<?php
          $x 
1;
      }
        
}
    
$arr = array('price' => $price'picURL' => $picURL);
    echo 
json_encode($arr);
    exit();
?>
<script>
var width = 0;
//Auswertung des Eingabeformulars
        $.ajax({
      type: "POST",
      url: "ebayapi.php",
      data: {//Werte für API-Call an PHP zurück geben
             }
    }).done(function(test) { //Rückgabe als Json
        alert(test);// Merkwürdige Ausgabe
        arr = JSON.parse(test);
    
     });

</script>
</html>
//wenn irgendwo Fehler im Code sind einfach verbessern, ist nur ein schnell zusammengestückelter ausschnitt

Das alert welches das übergebene Json objekt ausgibt hat nun aber einen seltsamen wert, denn es enthält den in PHP eingebundenen Javascript Code obwohl dieser ja gar nicht über echo ausgegeben wird. Ich habe schon nahezu alles ausprobiert doch es gab immer eine falsche ausgabe. Logischerweise aber nur wenn Javascript oder css im PHP eingebunden war. ansonsten funktioniert das Script super. Ich hoffe, dass alles soweit verständlich ist und mir irgendjemand helfen kann. Wäre sehr dankbar dafür.




Post wurde schon 1x editiert, das letzte mal am 21.10.2016 um 23:14 von dreide
21.10.2016, 18:33 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2364
      Zitat | Bearbeiten

Wieso dauert das denn so lange? Normalerweise sollte das Durschlaufen und "Umformen" eines Arrays nicht so viel Zeit in Anspruch nehmen.

Ansonsten wird das auf diese Weise nicht funktionieren.
Ich würde das mit mehreren Ajax-Requests lösen. Mit einem Request "startest" du diesen Prozess, der so lange dauert und übergibst dabei eine Eindeutige ID.
Während des langen Prozesses speicherst du den aktuellen Fortschritt z.B. in eine extra Datei mit dieser ID im Namen oder eben in der Datenbank.

Dann fragst du mit einem anderen Ajax-Request ständig den aktuellen Fortschritt des Prozesses mit dieser ID ab (z.B. alle 5 Sekunden). In dem dafür notwendigen Skript musst du nur die entsprechende Datei mit dem Fortschritt dieser ID oder eben in der Datenbank mit der ID, die du bei diesem Ajax-Request natürlich mit übergibst, nach dem aktuellen Fortschritt suchen und diesen entsprechend ausgeben. Dann kannst du damit entsprechend einen Fortschrittsbalken mittels JavaScript anpassen.

Wenn das Ergebnis vorliegt, liefert das der erste Ajax-Request ja entsprechend und so kannst du dieses dann einfach verwenden und anzeigen.


Ich hoffe ich hab das einigermaßen verständlich erklärt :)


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
21.10.2016, 20:37 Profil | PM | E-Mail  
dreide
Mitglied
Anfänger


Dabei seit: 12.04.2016
Herkunft: keine Angabe
Posts: 42
      Zitat | Bearbeiten

Danke erstmal für deine Antwort aber wie genau soll ich den aktuellen Fortschritt ermitteln wenn ich die länge des Gesamten prozesses ja noch nicht weiß ,da diese ja je nach Internetverbindung variieren kann. Ich muss mich verbessern, das was so lange dauert ist natürlich nicht das durchlaufen des Arrays sondern ehr die Zeit die die Anfragen an die Ebay-Api benötigen, da pro Api Call nur maximal 100 Ergebnisse abgerufen werden können braucht man je nach Anzahl wie viele Ergebnisse man will mehrere Anfragen welche auch entsprechend Zeit benötigen.




Post wurde schon 1x editiert, das letzte mal am 21.10.2016 um 23:24 von dreide
21.10.2016, 23:20 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2364
      Zitat | Bearbeiten

Zitat:
Orginal von dreide
Danke erstmal für deine Antwort aber wie genau soll ich den aktuellen Fortschritt ermitteln wenn ich die länge des Gesamten prozesses ja noch nicht weiß ,da diese ja je nach Internetverbindung variieren kann. Ich muss mich verbessern, das was so lange dauert ist natürlich nicht das durchlaufen des Arrays sondern ehr die Zeit die die Anfragen an die Ebay-Api benötigen, da pro Api Call nur maximal 100 Ergebnisse abgerufen werden können braucht man je nach Anzahl wie viele Ergebnisse man will mehrere Anfragen welche auch entsprechend Zeit benötigen.


Das ist aber doch dann ein generelles Problem bei dir, welches dir dann entsprechend gar nicht ermöglicht eine entsprechende Fortschrittsanzeige zu erstellen, unabhängig von der technischen Umsetzung.

Normalerweise muss es aber eigentlich eine Möglichkeit geben über die API auch entsprechend die Anzahl der Ergebnisse geliefert zu bekommen, auch wenn man dann z.B. bei 2500 gefundenen Anzeigen diese dann in 100er Schritten auslesen muss.

Ansonsten musst du dir doch sowieso generell überlegen, wie du den Fortschritt entsprechend dann berechnest, um diesen überhaupt anzeigen zu können.
Und egal wie du das machst (selbst wenn du einfach nur die Anzahl der bis zu diesem Zeitpunkt "gescannten" Anzeigen entsprechend hochzählen möchtest, damit der Nutzer sieht, dass dein Skript arbeitet und wie viel es bereits ausgewertet hat), mit meiner Lösung kannst du entsprechend live den Fortschritt anzeigen.


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
22.10.2016, 01:36 Profil | PM | E-Mail  
dreide
Mitglied
Anfänger


Dabei seit: 12.04.2016
Herkunft: keine Angabe
Posts: 42
      Zitat | Bearbeiten

Ja, vielleicht mache ich es einfach so, dass die aktuelle Anzahl der "gescannten" Anzeigen Angezeigt wird auch wenn diese dann nach einem Api-Call sehr schnell um 100 steigen würde. Ansonsten wäre die andere möglichkeit doch nach jedem erfolgreichen API-Call den Balken um ein größeres Stück zu scallieren. Sehe ich das richtig?
Zitat:

Während des langen Prozesses speicherst du den aktuellen Fortschritt z.B. in eine extra Datei mit dieser ID im Namen oder eben in der Datenbank.

Ist das nicht auch irgendwie ohne speichern möglich so wie in meinem versuchs-Script oben probiert? Und noch mal zur Ausgangsfrage wieso bekomme ich so einen seltsamen JSON string ausgegeben?


22.10.2016, 12:39 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2364
      Zitat | Bearbeiten

Zitat:
Orginal von dreide
Ja, vielleicht mache ich es einfach so, dass die aktuelle Anzahl der "gescannten" Anzeigen Angezeigt wird auch wenn diese dann nach einem Api-Call sehr schnell um 100 steigen würde. Ansonsten wäre die andere möglichkeit doch nach jedem erfolgreichen API-Call den Balken um ein größeres Stück zu scallieren. Sehe ich das richtig?


Naja, du meinst doch, dass du am Anfang gar nicht weißt, wie viele Requests du da absetzen musst. Wie willst du das dann entsprechend machen, dass der Balken dann nicht vielleicht 5km rechts über den Bildschirmrand hinaus geht?

Und was ist daran schlimm, dass dort eine Zahl in 100er Schritten steigt? Es währen dann doch auch wirklich jeweils 100 Anzeigen, die ausgelesen wurden... Oder man macht es in einer Schritten und nennt es dann eben "X Seiten gescannt" oder so. Da bist du doch komplett frei das festzulegen

Du könntest auch ermöglichen, dass man dann die Anzahl der bereits ausgelesenen Anzeigen/Seiten anzeigst und man dann jederzeit sagen kann "ok Stop. Ich will jetzt die X Seiten/Anzeigen angezeigt bekommen, weil mir das bereits reicht und ich die weiteren X Seiten/Anzeigen nicht brauche", wenn du meine Lösung leicht anpasst, ohne dass der Nutzer das komplett abbrechen muss und dann gar nichts als Ergebnis erhält oder so.

Zitat:
Orginal von dreide
Zitat:

Während des langen Prozesses speicherst du den aktuellen Fortschritt z.B. in eine extra Datei mit dieser ID im Namen oder eben in der Datenbank.

Ist das nicht auch irgendwie ohne speichern möglich so wie in meinem versuchs-Script oben probiert? Und noch mal zur Ausgangsfrage wieso bekomme ich so einen seltsamen JSON string ausgegeben?


Es funktioniert nur mit dem Abspeichern in irgendeiner Weise. Aber das ist ja auch kein Problem... Sessions arbeiten ja auch standardmäßig mit Dateien, die bei jedem Request ausgelesen werden.

Weil du wohl ja die Datei per Ajax aufrufst, wo auch der HTML und JavaScript Code drin ist. Entsprechend ist es doch logisch, dass auch dieser Code in dem Response enthalten ist oder woher soll PHP wissen, dass du nur den JSON Code im Fall eines Ajax-Requests haben willst? Bis auf einen Header-Wert ist ein Ajax-Request ja nur ein ganz normaler Request wie jeder andere auch.
Entsprechend musst du das wenn in ein eigenes Skript packen.


Edit: Ich hab mir die Doku der Ebay-Finding-API angeschaut. Also die liefert auf jeden Fall die komplette Anzahl an gefundenen Anzeigen und auch die dann errechnete Anzahl an Seiten zurück. Entsprechend könnte man ja ganz einfach einen Fortschritt in Prozent angeben.


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen

Post wurde schon 2x editiert, das letzte mal am 22.10.2016 um 13:12 von DingsDaBums
22.10.2016, 13:02 Profil | PM | E-Mail  
dreide
Mitglied
Anfänger


Dabei seit: 12.04.2016
Herkunft: keine Angabe
Posts: 42
      Zitat | Bearbeiten

Ich habe es jetzt einmal so gemacht, dass der aktuelle Fortschritt in eine Textdatei geschrieben wird. Dann sind die sprünge halt größer desto weniger 100er Anfragen man an die Api schickt aber das macht ja nichts.
Zitat:

Dann fragst du mit einem anderen Ajax-Request ständig den aktuellen Fortschritt des Prozesses mit dieser ID ab (z.B. alle 5 Sekunden).

Das Ajax Request muss doch aber auch über PHP wieder auf die Textdatei zugreifen doch das Funktioniert doch nicht da PHP ja momentan noch dabei ist die Anfragen an die Ebay-Api zu senden und wenn ich es danach mache ist der Balken logischerweise gleich bei 100%. Also ist doch die einzige möglichkeit noch ein zweites PHP Script zu machen welches nur dafür zuständig ist die Daten aus der Textdatei (oder Datenbank) auszulesen.Oder?


22.10.2016, 14:41 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2364
      Zitat | Bearbeiten

Zitat:
Orginal von dreide
Ich habe es jetzt einmal so gemacht, dass der aktuelle Fortschritt in eine Textdatei geschrieben wird. Dann sind die sprünge halt größer desto weniger 100er Anfragen man an die Api schickt aber das macht ja nichts.

Ich verstehe im Moment nicht so wirklich, wieso das mit dem Fortschritt anzeigen so ein großes Problem ist, aber gut... Du wirst das dann eben schon auf deine Weise irgendwie umsetzen. Wieso auch einfach, wenn es komplizierter geht..

Zitat:
Orginal von dreide
Zitat:

Dann fragst du mit einem anderen Ajax-Request ständig den aktuellen Fortschritt des Prozesses mit dieser ID ab (z.B. alle 5 Sekunden).

Das Ajax Request muss doch aber auch über PHP wieder auf die Textdatei zugreifen doch das Funktioniert doch nicht da PHP ja momentan noch dabei ist die Anfragen an die Ebay-Api zu senden und wenn ich es danach mache ist der Balken logischerweise gleich bei 100%. Also ist doch die einzige möglichkeit noch ein zweites PHP Script zu machen welches nur dafür zuständig ist die Daten aus der Textdatei (oder Datenbank) auszulesen.Oder?

Klar, in deinem Fall muss das ein eigenes Skript sein, so wie du wohl dein Skript aufgebaut hast.

Also ein Skript, welches diese Abfrage der Ebay-API tätigt und zwischendurch den aktuellen Fortschritt in einer Datei oder in der Datenbank speichert (wenn mehre Nutzer gleichzeitig die Seite nutzen können, entsprechend mit der eindeutigen ID zugeordnet). Dieses liefert dann auch am Ende das Ergebnis zurück.

Ein anderes Skript bekommt nur die ID übergeben und liest einfach den aktuellen Fortschritt der Anfrage aus, die mit dieser ID verknüpft wurde.
Das Skript sollte auch nicht viel mehr machen, weil es ja unter Umständen sehr oft aufgerufen wird und entsprechend möglichst schnell sein sollte.

Dann startest du den Ajax-Request an das erste Skript, um das Ergebnis der Suche zu erhalten und während dieser Request läuft, fragst du alle paar Sekunden das andere Skript ab, um den aktuellen Fortschritt zu erhalten.
Liegt das Ergebnis vor (also ist der erste Ajax-Request fertig), würde ich natürlich nicht mehr alle paar Sekunden den Fortschritt abfragen.

Edit: Wenn du sowieso eine Session aktiv hast, kannst du auch einfach die Session ID dafür verwenden, die ja entsprechend eindeutig ist. Dann musst du den Skripten keine selbst generierte ID übergeben.
Aber Achtung: Nicht die Session verwenden, weil die erst dann geupdatet wird, wenn das Skript fertig ist! Und die Session beenden und wieder neu starten macht auch keinen Sinn, weil PHP dann auch wieder Daten einfach auf dieselbe Weise in eine Datei schreibt, nur noch umständlicher. Also lieber selbst entsprechende Dateien erstellen und beschreiben, die du z.B. am Ende dann wieder löschen kannst, wenn du das Ergebnis ausgibst oder so.


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen

Post wurde schon 1x editiert, das letzte mal am 22.10.2016 um 15:14 von DingsDaBums
22.10.2016, 15:11 Profil | PM | E-Mail  
dreide
Mitglied
Anfänger


Dabei seit: 12.04.2016
Herkunft: keine Angabe
Posts: 42
      Zitat | Bearbeiten

Zitat:

Ich verstehe im Moment nicht so wirklich, wieso das mit dem Fortschritt anzeigen so ein großes Problem ist, aber gut... Du wirst das dann eben schon auf deine Weise irgendwie umsetzen. Wieso auch einfach, wenn es komplizierter geht..

I'm still learning

Dann habe ich aber deinen Weg oben nicht richtig verstanden so wie ich es gemacht habe ist doch eigentlich genau so wie du schriebst. Ein Ajax Request startet den Prozess, dann wird der Fortschritt in einer Datei(Textdatei, Datenbank) gespeichert und anschließend von einem anderen Ajax Request wieder abgefragt und als Statusbalken angezeit.


22.10.2016, 19:51 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2364
      Zitat | Bearbeiten

Zitat:
Orginal von dreide
[...]
Dann habe ich aber deinen Weg oben nicht richtig verstanden so wie ich es gemacht habe ist doch eigentlich genau so wie du schriebst. Ein Ajax Request startet den Prozess, dann wird der Fortschritt in einer Datei(Textdatei, Datenbank) gespeichert und anschließend von einem anderen Ajax Request wieder abgefragt und als Statusbalken angezeit.


Wie? Meinst du den Code den du oben gepostet hast?
Weil der macht nicht ansatzweise das, was ich erklärt habe, oder wo wird in diesem Skript der Fortschritt in eine Datei oder in der Datenbank geschrieben bzw. wo werden die verschiedenen Request abgesetzt? :)

Ich schau mal, vielleicht habe ich später noch was Zeit, um ein kleines Beispiel zu programmieren.


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
22.10.2016, 20:18 Profil | PM | E-Mail  
dreide
Mitglied
Anfänger


Dabei seit: 12.04.2016
Herkunft: keine Angabe
Posts: 42
      Zitat | Bearbeiten

Zitat:

Wie? Meinst du den Code den du oben gepostet hast?

Nein, dass bezog sich ehr darauf:
Zitat:

Ich habe es jetzt einmal so gemacht, dass der aktuelle Fortschritt in eine Textdatei geschrieben wird.

Also auf dass was ich geändert aber nicht gepostet habe.




Post wurde schon 2x editiert, das letzte mal am 22.10.2016 um 20:57 von dreide
22.10.2016, 20:45 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2364
      Zitat | Bearbeiten

Zitat:
Orginal von dreide
Zitat:

Wie? Meinst du den Code den du oben gepostet hast?

Nein, dass bezog sich ehr darauf:
Zitat:

Ich habe es jetzt einmal so gemacht, dass der aktuelle Fortschritt in eine Textdatei geschrieben wird.

Also auf dass was ich geändert aber nicht gepostet habe.


Achso... Von der Formulierung her klang das für mich eher nach einer Frage, ob du das denn nicht genau so wie ich es geschrieben gemacht hättest.


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
22.10.2016, 21:34 Profil | PM | E-Mail  
Seiten (1):  1 
PHP-Support.de » Programmierung » HTML, JavaScript & CSS » Json objekt enthält Javascript   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz