Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Laufzeit Probleme?

Einklappen

Neue Werbung 2019

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

  • MySQL Laufzeit Probleme?

    Hallo zusammen,

    ich bin mittlerweile ratlos.

    Also ich bekomme über eine API ein JSON mit ca. 970 Datensätze, diese gehe ich mittels foreach durch, und prüfe ob der Eintrag schon existiert oder nicht um zu entscheiden ob insert oder update.

    PHP-Code:
    $json json_decodefile_get_contents$url ), true );
    ...
    foreach(
    $json['members'] as $char ){
    ...

    $statement $pdo->prepare("SELECT COUNT(*) AS anzahl FROM wow_baelgun_guild WHERE cid = ?");
            
    $statement->execute(array($cid));  
            
    $row $statement->fetch();

            if(
    $row['anzahl'] > ){

                
    $statement $pdo->prepare("UPDATE wow_baelgun_guild SET level=:lvl,points=:points,avatar=:avatar,specicon=:specicon,rank=:rank WHERE cid=:cid");
                
    $statement->execute(array('cid' => $cid,'lvl' => $char['character']['level'], 'points' => $char['character']['achievementPoints'], 'avatar' => $char['character']['thumbnail'], 'specicon' => $char['character']['spec']['icon'],'rank' => $char['rank'] ));

            }else{
                
    $statement $pdo->prepare("INSERT INTO wow_baelgun_guild (name,realm,level,avatar,cid,race,class,points,specicon,rank) VALUES (?,?,?,?,?,?,?,?,?,?)");
                
    $statement->execute(array($char['character']['name'],$char['character']['realm'],$char['character']['level'],$char['character']['thumbnail'],$cid,$char['character']['race'],$char['character']['class'],$char['character']['achievementPoints'],$char['character']['spec']['icon'],$char['rank']));
            }
    .... 
    mein erstes Problem ist das nur 670 anstatt der 970 Datensätze eingetragen werden?! Ich erhalte keine Fehlermeldung!

    Das zweite Problem ist, dass ich in der obrigen Schleife Abfrage ob "Level == 120" dann update Daten von einem anderen JSON Array

    PHP-Code:
     if( $char['character']['level'] == 120 ){
               
    UpdateMember$cid );
            } 
    Also von den 970 sind etwa 100 auf 120 ...

    PHP-Code:
     $pdo = new PDO('mysql:host=localhost;dbname=ojmd_de''ojmd_de''DLwufBNB');

        
    $statement $pdo->prepare("SELECT name,realm FROM wow_baelgun_guild WHERE cid = ?");
        
    $statement->execute(array($cid));  
        
    $row $statement->fetch();

        ....
        
    $json json_decodefile_get_contents$url ), true );

        if(
    is_array$json['items'] ) ){


            
    $statement $pdo->prepare("UPDATE wow_baelgun_guild SET ilvl = :ilvl,ilvla = :ilvla,herzlvl = :herzlvl,last = :last WHERE cid = :cid");
            
    $statement->execute(array('cid' => $cid'ilvl' => $json['items']['averageItemLevel'], 'ilvla' => $json['items']['averageItemLevelEquipped'], 'herzlvl' => $json['items']['neck']['azeriteItem']['azeriteLevel'],'last' => $json['lastModified'] ));



            echo 
    "OK| "$cid."<br/>";
        } 

    Das Update läuft wie erwartet sehr lange, aber am Ende werden die echo Anweisungen nicht angezeigt auch wurden die Daten der zweiten Abfrage nicht Ausgeführt bzw. geändert!?

    Kann mir jemand ein Paar Tipps geben warum oder wie man solche Updates richtig durchführt?


    Mit freundlichen Grüßen Oliver



  • #2
    Sofern in der Tabelle wow_baelgun_guild das Feld cid eine eindeutiges Feld ist, also nur einmal je Wert vorkommen sollte, pack da einen entsprechenden Index drauf (PRIMARY oder UNIQUE) sofern das noch nicht der fall ist und nutze INSERT .. ON DUPLICATE KEY UPDATE .. anstatt dieses Konstrukt mit erst ein SELECT und anhand des Ergebnisses dann entweder UPDATE oder ein INSERT
    Das sind dann nur noch halb so viele SQL Anfragen an der Stelle

    @see https://dev.mysql.com/doc/refman/8.0...duplicate.html


    Der Rest ist leider etwas aus dem Zusammenhang gerissen ... da man die Gesamtlogik nicht erkennt ...
    Was ist denn UpdateMemebr()?
    an welcher Stelle befindet sich die Abfrage mit dem if? .. .usw ...


    Bezüglich der 670 statt 970 .. prüf das doch einfach mal nach an den entsprechenden Stellen, wo irgendwelche Filter/Auswahlen stattfinden..
    Versuche den Pfad nachzuverfolgen, wo deine Daten langlaufen und so zu identifizieren, welche Datensätze fehlen und dann jagst du meinetwegen nur einen einzelnen Datensatz durch dein System und versucht den Fehler so zu finden ...


    Und du sagst zwar dass es keinen Fehler gäbe, aber eine Fehlerprüfung bei deinen Statements sehe ich auch nicht..

    @see http://php.net/manual/de/pdostatement.errorinfo.php
    @see http://php.net/manual/de/pdostatement.errorcode.php

    Kommentar


    • #3
      Hallo Gnom42,

      vielen Dank für dein Hilfe und konstruktive Kritik. Ich werde die Punkte Stück für Stück durch gehen!


      Hier die Einbindung der Funktion:
      PHP-Code:
      foreach($json['members'] as $char ){

              
      $cid $char['character']['realm'] ."-".$char['character']['name'];


              if( 
      $char['character']['level'] == 120 ){
                 
      UpdateMember$cid );
              }

              unset(
      $row);

              
      $statement $pdo->prepare("SELECT COUNT(*) AS anzahl FROM wow_baelgun_guild WHERE cid = ?");
              
      $statement->execute(array($cid));  
              
      $row $statement->fetch();

              if(
      $row['anzahl'] > ){

                  
      $statement $pdo->prepare("UPDATE wow_baelgun_guild SET level=:lvl,points=:points,avatar=:avatar,specicon=:specicon,rank=:rank WHERE cid=:cid");
                  
      $statement->execute(array('cid' => $cid,'lvl' => $char['character']['level'], 'points' => $char['character']['achievementPoints'], 'avatar' => $char['character']['thumbnail'], 'specicon' => $char['character']['spec']['icon'],'rank' => $char['rank'] ));

              }else{
                  
      $statement $pdo->prepare("INSERT INTO wow_baelgun_guild (name,realm,level,avatar,cid,race,class,points,specicon,rank) VALUES (?,?,?,?,?,?,?,?,?,?)");
                  
      $statement->execute(array($char['character']['name'],$char['character']['realm'],$char['character']['level'],$char['character']['thumbnail'],$cid,$char['character']['race'],$char['character']['class'],$char['character']['achievementPoints'],$char['character']['spec']['icon'],$char['rank']));
              } 
      Gruß Oliver

      Kommentar


      • #4
        So,

        UNIQUE habe ich gesetzt.

        Und ich habe jetzt auch das Problem für die fehlenden Einträge gefunden, es liegt an der Schreibweise der unterschiedlichen Namen zB: "Hornôchse" und "Hornochsê" ! Welche Kollation muss ich denn hier wählen damit er diese Namen unterscheiden kann?


        Grüße

        Kommentar


        • #5
          Welche hat du denn jetzt für die DB, für die Tabelle und für die Spalte gewählt?

          Kommentar


          • #6
            Gewählt habe ich eigentlich kpl. utf8_general_ci.

            Kommentar


            • #7
              Ich glaube ich habe den Fehler gefunden, set_time_limit() kann ich nicht verändern, da das Script länger läuft bricht es einfach nach 30 Sekunden ab. Deshalb bekomme ich nur 763 Datensätze in die DB und deshalb sehe ich auch nicht die Echo´s am Ende.

              Und nun ....?

              Kommentar


              • #8
                Guten Abend,

                ich hab jetzt den Fehler gefunden, warum ich anstatt 971 Daten nur 763 Einträge bekommen habe. In den JSON Array gab es ein Feld, welches ich abgefragt hatte, was nicht jeder Datensatz hatte. Das ist mir so nicht aufgefallen.

                Jetzt hab ich nur noch das zweite Problem, das beim aktualisieren der ca. 100 Datensätze nur die hälfte im ersten Durchlauf aktualisiert werden!?!

                Kommentar

                Lädt...
                X