Fehler in Script den ich nicht finde!

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

  • Fehler in Script den ich nicht finde!

    hi, ich bin der webmaster von dem deutschen team des distributed computing projekts climateprediction.
    für the website (www.cpdndeutschland.de.vu) habe ich ein script geschrieben das die xml-stats ausliest und formatiert in die mysql gibt.


    my code:

    PHP-Code:
    <?
    include("confixx.php");
    //$source = "grpstatsxml-id.xml";
    $source = "http://cpdn.comlab.ox.ac.uk/user/grpstatsxml.php?gid=349";

    $open = fopen($source,"b");
    $read = fread($open,50000);

    $gentime = substr($read,strpos($read,"<GENERATED>")+11,strpos($read,"</GENERATED>")-strpos($read,"<GENERATED>")-11);


    $sumend = strpos($read,"</SUMMARY>");

    $read = substr($read,$sumend);
    $array = explode("</USER>",$read);

    for($i=1;$i<=count($array)-1;$i++)
    {
        
        $name = substr($array[$i-1],strpos($array[$i-1],"<NAME>")+6,strpos($array[$i-1],"</NAME>")-strpos($array[$i-1],"<NAME>")-6);
        $name = str_replace (" ","%20",$name);
        $machines = substr($array[$i-1],strpos($array[$i-1],"<ACTIVEMACHINES>")+16,strpos($array[$i-1],"</ACTIVEMACHINES>")-strpos($array[$i-1],"<ACTIVEMACHINES>")-16);
        $modelyears = substr($array[$i-1],strpos($array[$i-1],"<MODELYEAR>")+11,strpos($array[$i-1],"</MODELYEAR>")-strpos($array[$i-1],"<MODELYEAR>")-11);
        $cpudays = substr($array[$i-1],strpos($array[$i-1],"<CPUDAYS>")+9,strpos($array[$i-1],"</CPUDAYS>")-strpos($array[$i-1],"<CPUDAYS>")-9);

        
        //überprüfen ob user exsistiert, ansonsten anlegen  
        $result = mysql_query("SELECT id FROM stats_users WHERE username = '$name'");
        if(mysql_num_rows($result) == 0)
        {

            mysql_query("INSERT INTO stats_users (username) VALUES ('$name')");
            $id = mysql_insert_id();
        }
        else
        {
            $row = mysql_fetch_array($result);
            $id = $row['id'];
        }
        
        //Persönliche Stats lesen
        $source2 = "http://cpdn.comlab.ox.ac.uk/user/userxml.php?name=$name";
        $open2 = fopen($source2,"r");
        $read2 = fread($open2,750);
        
        $tslast = substr($read2,strpos($read2,"<TSLAST>")+8,strpos($read2,"</TSLAST>")-strpos($read2,"<TSLAST>")-8);
        $last_phase = substr($read2,strpos($read2,"<PHASELAST>")+11,strpos($read2,"</PHASELAST>")-strpos($read2,"<PHASELAST>")-11);
        $runs_started = substr($read2,strpos($read2,"<RUNSALLOC>")+11,strpos($read2,"</RUNSALLOC>")-strpos($read2,"<RUNSALLOC>")-11);
        $shortruns = substr($read2,strpos($read2,"<RUNSSHORT>")+11,strpos($read2,"</RUNSSHORT>")-strpos($read2,"<RUNSSHORT>")-11);
        $clompleteruns = substr($read2,strpos($read2,"<RUNSCOMP>")+10,strpos($read2,"</RUNSCOMP>")-strpos($read2,"<RUNSCOMP>")-10);
        $last_trickle = substr($read2,strpos($read2,"<TRICKLELAST>")+13,strpos($read2,"</TRICKLELAST>")-strpos($read2,"<TRICKLELAST>")-13);
        $regdate = substr($read2,strpos($read2,"<REGDATE>")+9,strpos($read2,"</REGDATE>")-strpos($read2,"<REGDATE>")-9);
        $total_rank = substr($read2,strpos($read2,"<RANKING>")+9,strpos($read2,"</RANKING>")-strpos($read2,"<RANKING>")-9);
        
        //last trickle => formatting
        $last_trickle_day = substr($last_trickle,0,2);
        $last_trickle_month = substr($last_trickle,3,3);
        $month_array = array("01" => "Jan","02" => "Feb","03" => "Mar","04" => "Apr","05" => "May","06" => "Jun","07" => "Jul","08" => "Aug","09" => "Sep","10" => "Oct","11" => "Nov","12" => "Dec");
        $last_trickle_month = array_search($last_trickle_month,$month_array);
        $last_trickle_year = substr($last_trickle,7,2);
        $last_trickle_hour = substr($last_trickle,10,2);
        $last_trickle_minute = substr($last_trickle,13,2);
        $last_trickle_second = substr($last_trickle,16,2);
        // last trickle => creating timestamp
        $last_trickle_timestamp = mktime($last_trickle_hour,$last_trickle_minute,$last_trickle_second,$last_trickle_month,$last_trickle_day,$last_trickle_year);
        
        //regdate => formatting
        $regdate_day = substr($regdate,0,2);
        $regdate_month = substr($regdate,3,3);
        $regdate_month = array_search($regdate_month,$month_array);
        $regdate_year = substr($regdate,7,2);
        $regdate_hour = substr($regdate,10,2);
        $regdate_minute = substr($regdate,13,2);
        $regdate_second = substr($regdate,16,2);
        // regdate => creating timestamp
        $regdate_timestamp = mktime($regdate_hour,$regdate_minute,$regdate_second,$regdate_month,$regdate_day,$regdate_year);
        
        
        $total_rank = str_replace("out of","/",$total_rank);
        
        
        //trennzeichen
        $id2 .= "$id . ";
        $name2 .= "$name . ";
        $machines2 .= "$machines . ";
        $modelyears2 .= "$modelyears . ";
        $cpudays2 .= "$cpudays . ";

        $tslast2 .= "$tslast . ";
        $last_phase2 .= "$last_phase2 . ";
        $runs_started2 .= "$runs_started . ";
        $shortruns2 .= "$shortruns . ";
        $clompleteruns2 .= "$clompleteruns . ";
        $last_trickle_timestamp2 .= "$last_trickle_timestamp . ";
        $regdate_timestamp2 .= "$regdate_timestamp . ";
        $total_rank2 .= "$total_rank . ";
        
    }
        // " . " am Ende entfernen
        $id2 = substr($id2,0,strlen($id2)-3);
        $name2 = substr($name2,0,strlen($name2)-3);
        $machines2 = substr($machines2,0,strlen($machines2)-3);
        $modelyears2 = substr($modelyears2,0,strlen($modelyears2)-3);
        $cpudays2 = substr($cpudays2,0,strlen($cpudays2)-3);
        
        $tslast2 = substr($tslast2,0,strlen($tslast2)-3);
        $last_phase2 = substr($last_phase2,0,strlen($last_phase2)-3);
        $runs_started2 = substr($runs_started2,0,strlen($runs_started2)-3);
        $shortruns2 = substr($shortruns2,0,strlen($shortruns2)-3);
        $clompleteruns2 = substr($clompleteruns2,0,strlen($clompleteruns2)-3);
        $last_trickle_timestamp2 = substr($last_trickle_timestamp2,0,strlen($last_trickle_timestamp2)-3);
        $regdate_timestamp2 = substr($regdate_timestamp2,0,strlen($regdate_timestamp2)-3);
        $total_rank2 = substr($total_rank2,0,strlen($total_rank2)-3);
        $date = time();
        

        mysql_query("INSERT INTO stats_user_data (generated,date,userid,computer,modelyears,cpudays,last_phase,last_ts,runs_started,shortruns,completeruns,last_trickle,regdate,total_rank) VALUES ('$gentime','$date','$id2','$machines2','$modelyears2','$cpudays2','$tslast2','$last_phase2','$runs_started2','$shortruns2','$clompleteruns2','$last_trickle_timestamp2','$regdate_timestamp2','$total_rank2')");

    ?>

    Das script kann ganz normal ausgeführt werden und wird ohne fehler beendet. auch landen die werte richtig in der mysql, aber nur die ersten 8 von über 110.
    wär sehr nett wenn sich n paar von euch mal die zeit nehmen könnten sich das script genauer anzuschaun, weil ich bin schon seit über einem tag dran, und kann den fehler nicht finden.

    vielen dank schonmal

    greez scorpion2k

  • #2
    Re: Fehler in Script den ich nicht finde!

    Das script kann ganz normal ausgeführt werden und wird ohne fehler beendet. auch landen die werte richtig in der mysql, aber nur die ersten 8 von über 110.
    PHP-Code:
    mysql_query("INSERT INTO stats_user_data (generated,date,userid,computer,modelyears,cpudays,last_phase,last_ts,runs_started,shortruns,completeruns,last_trickle,regdate,total_rank) VALUES ('$gentime','$date','$id2','$machines2','$modelyears2','$cpudays2','$tslast2','$last_phase2','$runs_started2','$shortruns2','$clompleteruns2','$last_trickle_timestamp2','$regdate_timestamp2','$total_rank2')"); 
    bezieht sich das auf diese query? ja, oder? die steht doch außerhalb der schleife .... dein code ist ganz schön aufgebläht, ... kennst du regexp? das würde glaub ich viel arbeit sparen
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      nein regxp kannte ich bin vor 5 min noch nicht....
      werde ich mir mal anschaun was das ist.

      ja, die insert befehl ist ausserhalb der schleife. zum prinzipiellen ablauf des scripts:

      aus der ersten datei werden die members des teams geholt, mit einigen ihrer werte
      dann wird überprüft ob für den nickname schon eine id zugewiesen wurde, ansonsten wird sie erstellt
      dann wir die persönliche statsdatei (in der schleife) jedes users gelesen.
      danach werden alle werte so formatiert dass sie passend sind, und für jede kategorie (wie zb id) wird eine kette an werten gebildet.
      die sieht dann zb so aus: "1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9"
      die wird dann nach der schleife in die mysql geschrieben


      /e: was genau ist dieses regexp ?
      Zuletzt geändert von Scorpion2k; 18.01.2004, 02:31.

      Kommentar


      • #4
        was genau ist dieses regexp ?
        reguläre ausdrücke! damit ließe sich der umfang deines scriptes auf wenige zeilen reduzieren ... das schreit sozusagen nach regexp

        probier mal (ungetestet)
        PHP-Code:
        preg_match_all ("/<(.*)>(.*)<\\/\\\\1>/U"$read2$results);
        echo 
        "<pre>";
        print_r ($results);
        echo 
        "</pre>"
        irgendwo in deinem code aus, ... am besten gleich hinter
        PHP-Code:
        $read fread($open,50000); 
        falls der regexp paßt, soltest du eine wunderschöne ausgabe aller objekte der form <name>inhalt</name> erhalten, ... muß sicher noch angepaßt werden, und liefert vielleicht mehr als du brauchst, aber acht mal einfacher als deine variante.

        danach werden alle werte so formatiert dass sie passend sind, und für jede kategorie (wie zb id) wird eine kette an werten gebildet.
        die sieht dann zb so aus: "1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9"
        die wird dann nach der schleife in die mysql geschrieben
        na dann, selbst schuld. die db-struktur stammt nicht von dir?
        Die Zeit hat ihre Kinder längst gefressen

        Kommentar


        • #5
          ich habe ein anderes script als vorlage genommen.
          soweit ich wdas weiss ist das die sinnvollste methode speicher zu sparen, da die website auf einem host mit 25 mb ist und da ist die mysql dabei.

          da die stats eins bis zwomal pro tag geupdated werden, würde die db sonst unübersichtlich viele tables bekommen!

          das mit regexp musst du mir nochmal genauer erklären? ist das eine server-erweiterung? und gibts binaries davon, wiel ich habe nur uncompilten sourcecode gefunden!

          naja aber eigendlich will ich ja keine ausgabe sondern das ganze in eine mysql, aber das dürfte ja kein problem sein

          Kommentar


          • #6
            zum thema regex:
            http://www.php-resource.de/tutorials/read/10/1/
            ansonsten => google

            zu deinem eintragsproblem:
            setz mal:
            PHP-Code:
            mysql_query('die query ....') or die(mysql_error()); 
            ein.
            wenns nach einer bestimmten anzahl einträge abbricht, hast du uU ein nicht escapte
            sonderzeichen wie ' oder " in den variablen, dann ist addslashes() oder
            mysql_real_escape_string() dein freund
            Kissolino.com

            Kommentar


            • #7
              Original geschrieben von Wurzel
              wenns nach einer bestimmten anzahl einträge abbricht, hast du uU ein nicht escapte
              sonderzeichen wie ' oder " in den variablen, dann ist addslashes() oder
              mysql_real_escape_string() dein freund [/B]

              nein. es sind ausschließlich zahlenwerte, und die ersten 8 sind ja auch ohne probleme....

              /e: das mysql_error bringt keine veränderung
              Zuletzt geändert von Scorpion2k; 18.01.2004, 14:51.

              Kommentar


              • #8
                mysql steigt ja nicht ohne grund aus, was sagt denn mysql_error() ?
                Kissolino.com

                Kommentar


                • #9
                  habs grade oben editiert

                  kein fehler und sonst nix. es wirkt fast so als ob die schleife nur 8 mal durchliefe, aber auch wenn ich anstelle von
                  PHP-Code:
                  count($array
                  meinetwegen 50 eingebe bleibts beim gleichen

                  Kommentar


                  • #10
                    was passiert, wenn du mit dem 5. datensatz beginnst und von da an versuchst 10 datensätze einzutragen?
                    Kissolino.com

                    Kommentar


                    • #11
                      Original geschrieben von Wurzel
                      was passiert, wenn du mit dem 5. datensatz beginnst und von da an versuchst 10 datensätze einzutragen?
                      hmm dann macht er auch nach dem 8ten schluss....

                      komisch....

                      Kommentar


                      • #12
                        folgendes: eben habe ich bemerkt, das alles funzt wenn die erste datei auf meinem pc liegt (lokaler webserver). dann liest das script die ganze datei.

                        wenn ich die datei über die url öffne, liest er nur einen teil!!! folglich kann er auch nur diesen teil verarbeiten!

                        gibt es php settings wie weit das script externe dateien maximal liest oder woran liegt das?

                        Kommentar


                        • #13
                          hmm,

                          laß dir alle querys per echo ausgeben und poste die letzte ausgeführte ....
                          post mal zusätzlich das CREAT TABLE deiner tabelle, ich möchte mal die typen sehn ...
                          Die Zeit hat ihre Kinder längst gefressen

                          Kommentar


                          • #14
                            wenn ich die datei über die url öffne, liest er nur einen teil!!! folglich kann er auch nur diesen teil verarbeiten!
                            hmm,

                            wenn du
                            schon seit über einem tag dran
                            bist, hätte ich persönlich erwartet, daß du das schon wußtest, ...
                            Die Zeit hat ihre Kinder längst gefressen

                            Kommentar


                            • #15
                              hmm ich muss selber sagen dass es mich enttäuscht aber irgendwie war das nicht immer so...

                              naja wie dem auch sei.

                              die table ist das das:

                              Code:
                              CREATE TABLE stats_user_data (
                                generated varchar(255) NOT NULL default '',
                                date varchar(255) NOT NULL default '',
                                userid blob,
                                computer blob,
                                modelyears blob,
                                cpudays blob,
                                last_phase blob,
                                last_ts blob,
                                runs_started blob,
                                shortruns blob,
                                completeruns blob,
                                last_trickle blob,
                                regdate blob,
                                total_rank blob,
                                UNIQUE KEY date (date)
                              ) TYPE=MyISAM;
                              aber das ist unwichtig, da es funzt.

                              es geht eigendlich nur noch darum warum er die datei über die rul nur zum teil liest, aber die lokale komplett.

                              Wenn ich die datei lokal speicher funzta ALLES


                              so sieht die datei im IE aus:

                              Code:
                                <?xml version="1.0" encoding="UTF-8" ?> 
                              - <GROUPSTATS>
                              - <SUMMARY>
                                <ACTIVEMACHINES>218</ACTIVEMACHINES> 
                                <STATUS>1</STATUS> 
                                <CPUPETA>1604.746</CPUPETA> 
                                <USERCOUNT>113</USERCOUNT> 
                                <MODELYEAR>11229.577</MODELYEAR> 
                                <GENERATED>18-Jan-04 12:29:11</GENERATED> 
                                <INSTITUTION>Fuer alle CPDN User aus Deutschland: joinen!!!</INSTITUTION> 
                                <GROUPTYPENAME /> 
                                <GROUPTYPEID /> 
                                <CPUDAYS>11074.37</CPUDAYS> 
                                <URL>[url]http://www.cpdndeutschland.de.vu[/url]</URL> 
                                <NAME>Deutschland</NAME> 
                                <GROUPPARTID>349</GROUPPARTID> 
                                <CREATIONDATE>05-OCT-03</CREATIONDATE> 
                                <RANKING>3</RANKING> 
                                <TOTALGROUPS>551</TOTALGROUPS> 
                                <RUNSALLOC>436</RUNSALLOC> 
                                <RUNSCOMP>130</RUNSCOMP> 
                                <ADMINNAME>yo</ADMINNAME> 
                                <RUNSSHORT>49</RUNSSHORT> 
                                </SUMMARY>                                                                              
                              - <USER>                                             <---- ab hier wird vom script verarbeitet
                                <ACTIVEMACHINES>19</ACTIVEMACHINES> 
                                <URL>[url]http://www.adminsend.de[/url]</URL> 
                                <MODELYEAR>1733.518</MODELYEAR> 
                                <NAME>andreas huemmer</NAME> 
                                <CPUPETA>249.456</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>1402.511</CPUDAYS> 
                                <RANKING>1</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>18</ACTIVEMACHINES> 
                                <URL /> 
                                <MODELYEAR>814.923</MODELYEAR> 
                                <NAME>tarnowski</NAME> 
                                <CPUPETA>84.153</CPUPETA> 
                                <BETATESTER>1</BETATESTER> 
                                <CPUDAYS>985.624</CPUDAYS> 
                                <RANKING>2</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>8</ACTIVEMACHINES> 
                                <URL /> 
                                <MODELYEAR>806.838</MODELYEAR> 
                                <NAME>jack8</NAME> 
                                <CPUPETA>124.485</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>964.46</CPUDAYS> 
                                <RANKING>3</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>11</ACTIVEMACHINES> 
                                <URL /> 
                                <MODELYEAR>556.417</MODELYEAR> 
                                <NAME>sevri</NAME> 
                                <CPUPETA>77.622</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>539.085</CPUDAYS> 
                                <RANKING>4</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>7</ACTIVEMACHINES> 
                                <URL>[url]www.geologie-service.de[/url]</URL> 
                                <MODELYEAR>530.135</MODELYEAR> 
                                <NAME>gsg geologie-service gmbh - germany</NAME> 
                                <CPUPETA>75.23</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>472.581</CPUDAYS> 
                                <RANKING>5</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>6</ACTIVEMACHINES> 
                                <URL /> 
                                <MODELYEAR>363.222</MODELYEAR> 
                                <NAME>lala</NAME> 
                                <CPUPETA>45.421</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>373.973</CPUDAYS> 
                                <RANKING>6</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>5</ACTIVEMACHINES> 
                                <URL /> 
                                <MODELYEAR>343.854</MODELYEAR> 
                                <NAME>cyberlong</NAME> 
                                <CPUPETA>39.289</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>225.04</CPUDAYS> 
                                <RANKING>7</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>6</ACTIVEMACHINES> 
                                <URL>[url]http://www.andre-wissbrock.de[/url]</URL> 
                                <MODELYEAR>343.221</MODELYEAR> 
                                <NAME>cyclotron</NAME> 
                                <CPUPETA>55.278</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>432.626</CPUDAYS> 
                                <RANKING>8</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>3</ACTIVEMACHINES> 
                                <URL>[url]www.tabsnet.com[/url]</URL> 
                                <MODELYEAR>311.943</MODELYEAR>               <<<---- bis zu der 9 in dieser zeile liest das script, also : <MODELYEAR>311.9 ist der letzte eintrag
                                <NAME>tabsnet.com</NAME> 
                                <CPUPETA>27.932</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>188.792</CPUDAYS> 
                                <RANKING>9</RANKING> 
                                </USER>
                              - <USER>
                                <ACTIVEMACHINES>4</ACTIVEMACHINES> 
                                <URL /> 
                                <MODELYEAR>300.733</MODELYEAR> 
                                <NAME>themadone</NAME> 
                                <CPUPETA>46.819</CPUPETA> 
                                <BETATESTER>0</BETATESTER> 
                                <CPUDAYS>385.868</CPUDAYS> 
                                <RANKING>10</RANKING> 
                                </USER>
                              Zuletzt geändert von Scorpion2k; 18.01.2004, 17:05.

                              Kommentar

                              Lädt...
                              X