MrSnoot: Wert um 1 erhöhen, Datenkbank zählt falsch oder gar nicht.

Hio,

auch auf die Gefahr hin, dass ich mich blamiere -  ich bekomme es einfach nicht hin, einen Wert in meiner DB um 1 zu erhöhen - poste ich das jetzt :D

Im Grunde handelt es sich um einen Downloadcounter, der beim Download einer Datei um 1 hochzählt. Die gewünschten Downloads werden über Checkboxen ausgewählt, das Formular per Submit abgeschickt und die Datei dann gepackt und runtergeladen.

for($i = 1; $i <= 44; $i++)  
{  
  if(isset($_GET[$i]))  
  {  
    // Zur ID zugehörigen PDF-Pfad ermitteln  
    $abfrage = "SELECT datei, counter FROM pdf WHERE id = '$i'";  
    $ergebnis = mysql_query($abfrage);  
  
    while($row = mysql_fetch_object($ergebnis))  
    {  
      // PDF in Zip einfügen  
      $zipfile->addFileAndRead($row->datei);  
  
      // Counter erhöhen  
      $aendern = "UPDATE pdf SET counter = counter+1 WHERE id = '$i'";  
      $update = mysql_query($aendern);  
    }  
  }  
}

Mit dieser Variante wird der Counter aber immer um 2 erhöht.

Alternativ hätte ich es so gemacht:

  
      // Counter erhöhen  
      $counter = $row->counter;  
      $counter = $counter++;  
      $aendern = "UPDATE pdf SET counter = '$counter' WHERE id = '$i'";  
      $update = mysql_query($aendern);  

So wird der Counterstand aber gar nicht geändert.

Und so würde wieder um 2 erhöht.

  
  
      // Counter erhöhen  
      $counter = $row->counter;  
      $counter = $counter + 1;  
      $aendern = "UPDATE pdf SET counter = '$counter' WHERE id = '$i'";  
      $update = mysql_query($aendern);  

Eigentlich kann es sich dabei doch nur um einen Fehler in der Schleife handeln, aber wo?

  1. Neinm der Fehler liegt nicht in der Schleife sondern an deinem Incrementbefehl.
    Das ++ nach der Variable heißt, mache was mit der Variable und erhöhe sie dann um eins. Ein ++ vor der Variable ist dann erhöhe die Variable um eins und rechne dann.

    Bsp.:
    a=1
    erg=a++
    erg=1, a=2
    erg=++a
    erg=2, a=2

    so sollte es eigentlich gehen ^^.

      
    for($i = 1; $i <= 44; $i++)  
    {  
      if(isset($_GET[$i]))  
      {  
        // Zur ID zugehörigen PDF-Pfad ermitteln  
        $abfrage = "SELECT datei, counter FROM pdf WHERE id = '$i'";  
        $ergebnis = mysql_query($abfrage);  
      
        while($row = mysql_fetch_object($ergebnis))  
        {  
          // PDF in Zip einfügen  
          $zipfile->addFileAndRead($row->datei);  
      
          // Counter erhöhen  
          $aendern = "UPDATE pdf SET counter = ++$row->counter WHERE id = '$i'";  
          $update = mysql_query($aendern);  
        }  
      }  
    }  
    
    

    mfg

    K1

    1. |       // Counter erhöhen  
      
      >       $aendern = "UPDATE pdf SET counter = ++$row->counter WHERE id = '$i'";  
      >       $update = mysql_query($aendern);  
      > 
      
      

      Zählt leider auch nicht.

      Und so zählt es wieder um 2:

      // Counter erhöhen  
             $counter = $row->counter;  
             $counter++;  
             $aendern = "UPDATE pdf SET counter = '$counter' WHERE id = '$i'";  
             $update = mysql_query($aendern);  
      
      

      Welche Debug-Ausgaben hast Du durchgeführt?

      Öööööh ..!? :D

      1. Hi,

        Welche Debug-Ausgaben hast Du durchgeführt?
        Öööööh ..!? :D

        was genau ist an der Frage unklar?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hi,

    auch auf die Gefahr hin, dass ich mich blamiere

    och, eine Blamage ist keine, wenn man daraus etwas lernt.

    Mit dieser Variante wird der Counter aber immer um 2 erhöht.

    Welche Debug-Ausgaben hast Du durchgeführt?

    Alternativ hätte ich es so gemacht:

    $counter = $counter++;

      
    Ist Dir bewusst, was der rechtsseitige "++"-Operator tut und was seine Rückgabe ist?  
      
    Cheatah  
    
    -- 
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|  
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html  
    X-Will-Answer-Email: No  
    X-Please-Search-Archive-First: Absolutely Yes
    
  3. while($row = mysql_fetch_object($ergebnis))
        {
          $aendern = "UPDATE pdf SET counter = counter+1 WHERE id = '$i'";
          $update = mysql_query($aendern);
        }

    }

    
    >   
    > Mit dieser Variante wird der Counter aber immer um 2 erhöht.  
      
      
    `$aendern = "UPDATE pdf SET counter = counter+1 WHERE id = " . $i;`{:.language-php}  
      
    das muss funktionieren, sofern deine erste abfrage wirklich nur einen datensatz liefert - wie wärs mit einer debugausgabe, die dir ausgibt, wie oft die schleife durchläuft?
    
    1. $aendern = "UPDATE pdf SET counter = counter+1 WHERE id = " . $i;

      Zählt auch um 2 :(

      Das ganze scheint wohl an der Erstellung der Zip-Datei zu liegen, denn wenn ich nur die Schleife laufen lasse, ohne die Zipfunktion, dann wird korrekt um 1 erhöht.

      Muss ich mal etwas mit spielen.

      1. Das ganze scheint wohl an der Erstellung der Zip-Datei zu liegen, denn wenn ich nur die Schleife laufen lasse, ohne die Zipfunktion, dann wird korrekt um 1 erhöht.

        ggf gibs in der zip-klasse irgendetwas, welches den counter-wert überschreibt

        allerdings ist es sehr seltsam, dass die while-schleife 2x durchläuft, wegen dieser zip-klasse

        übrigens,  $counter = $counter++; funktioniert nicht - du solltest nur $counter++; schreiben ;)

        1. Langsam versteh ich gar nichts mehr:

          $counter = $row->counter;  
          $counter = counter + 2;
          

          erhöht um '4'. Also auch das doppelte.

          $counter = $row->counter;  
          $counter = counter + 2/2;
          

          erhöht um '2'. Also wieder das Doppelte von '2/2' = '1'.

          Aber:

          $counter = $row->counter;  
          $counter = counter + 1/2;
          

          erhöht um ... '2'. Was zum Geier ist da los!?

          1. wobei ich jetzt hier im Post überall die '$' vergessen habe ;)

            1. Das ganze Script sieht übrigens so aus:

              <?php  
                
              // Startet den Buffer, sodass keine Header-Fehlermeldungen entstehen.  
              ob_start();  
                
              // Läd die Zip-Library  
              require("zip.lib.php");  
                
              // Erstellt eine neue Zipdatei  
              $zipfile = new zipfile("archiv.zip");  
                
              include("dbconnect.php");  
                
              for($i = 1; $i <= 44; $i++)  
              {  
                if(isset($_GET[$i]))  
                {  
                  // Zur ID zugehörigen PDF-Pfad ermitteln  
                  $abfrage = "SELECT datei, counter FROM pdf WHERE id = '$i'";  
                  $ergebnis = mysql_query($abfrage);  
                
                  while($row = mysql_fetch_object($ergebnis))  
                  {  
                    // PDF in Zip einfügen  
                    $zipfile->addFileAndRead($row->datei);  
                
                    //Counter erhöhen  
                    $aendern = "UPDATE pdf SET counter = counter+1 WHERE id = '$i'";  
                    $update = mysql_query($aendern);  
                  }  
                }  
              }  
                
              // Gibt die Zip-Datei aus.  
              echo $zipfile->file();  
                
              ?>
              
              1. Das ganze Script sieht übrigens so aus:

                <?php

                // Startet den Buffer, sodass keine Header-Fehlermeldungen entstehen.
                ob_start();

                // Läd die Zip-Library
                require("zip.lib.php");

                // Erstellt eine neue Zipdatei
                $zipfile = new zipfile("archiv.zip");

                include("dbconnect.php");

                for($i = 1; $i <= 44; $i++)
                {
                  if(isset($_GET[$i]))
                  {
                    // Zur ID zugehörigen PDF-Pfad ermitteln
                    $abfrage = "SELECT datei, counter FROM pdf WHERE id = '$i'";
                    $ergebnis = mysql_query($abfrage);

                while($row = mysql_fetch_object($ergebnis))
                    {
                      // PDF in Zip einfügen
                      $zipfile->addFileAndRead($row->datei);

                //Counter erhöhen
                      $aendern = "UPDATE pdf SET counter = counter+1 WHERE id = '$i'";
                      $update = mysql_query($aendern);
                    }
                  }
                }

                // Gibt die Zip-Datei aus.
                echo $zipfile->file();

                ?>

                  
                wie wärs einfach mal wenn du innerhalb der while schleife folgendes machst  
                  
                ersetze  
                `// PDF in Zip einfügen`{:.language-php}  
                  
                durch  
                ~~~php
                  
                // PDF in Zip einfügen  
                echo "debugausgabe: forschleife " . $i . ", while schleife A<br>";  
                
                

                jetzt solltest du eigentlich sowas bekommen

                debugausgabe: forschleife 1, while schleife
                debugausgabe: forschleife 2, while schleife
                debugausgabe: forschleife 3, while schleife

                wenn du allerdings folgendes bekommst, läuft deine while schleife 2x

                debugausgabe: forschleife 1, while schleife
                debugausgabe: forschleife 1, while schleife
                debugausgabe: forschleife 2, while schleife
                debugausgabe: forschleife 2, while schleife
                debugausgabe: forschleife 3, while schleife
                debugausgabe: forschleife 3, while schleife

                du solltest ggf dann mit mysql_num_rows prüfen, wieviele datensätze du zurückbekommst

                1. Das zählt korrekt jeden Wert einmal.

                  1. Das zählt korrekt jeden Wert einmal.

                    was ist, wenn du in der datenbank direkt die entsprechende abfrage ausführst?

                    ich hab das testweise gemacht - funktioniert bei mir einwandfrei (war nicht anders zu erwarten)

                    1. Jetzt hab ich den Übeltäter - mein Downloadmanager (GetRight) ist schuld.

                      Benutze ich die normale Downloadfunktion des Browsers wird richtig gezählt, benutze ich GetRight wird um 2 erhhöt.

                      Ist nur die Frage, wieso?

                      1. Benutze ich die normale Downloadfunktion des Browsers wird richtig gezählt, benutze ich GetRight wird um 2 erhhöt.

                        getright verbindet wahrscheinlich mehrfach zum server - wenn du eine ip-adress-prüfung bzw sperre einbaust, könntest du das ggf umgehen ;)

                        1. Na ok, das wäre etwas überdimensioniert :D

                          Ich denke, ich akzeptiere das dann einfach mal so.

                          Aber danke für die Hilfe bei der Fehlersuche :)

                      2. Hello,

                        Jetzt hab ich den Übeltäter - mein Downloadmanager (GetRight) ist schuld.

                        Benutze ich die normale Downloadfunktion des Browsers wird richtig gezählt, benutze ich GetRight wird um 2 erhhöt.

                        Der wird wohl erst eine Head-Request absetzen und dann erst einen Get-Request.
                        Darüber könnte Dir das Access-Log des Servers Information geben.

                        Liebe Grüße aus Syburg bei Dortmund

                        Tom vom Berg

                        --
                        Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
  4. Hello,

    munteres Rätselraten - mein Tipp: Debugausgaben, und wenn es in jeder Zeile ein echo ist, gucken wo wie oft mit was langgelaufen wird...

    while($row = mysql_fetch_object($ergebnis))

    <glaskugel>hier kommen zwei Datensätze, die Schleife hat zwei Durchläufer</glaskugel>

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    1. munteres Rätselraten - mein Tipp: Debugausgaben, und wenn es in jeder Zeile ein echo ist, gucken wo wie oft mit was langgelaufen wird...

      das hab ich auch grade vorgeschlagen ;)

      while($row = mysql_fetch_object($ergebnis))
      <glaskugel>hier kommen zwei Datensätze, die Schleife hat zwei Durchläufer</glaskugel>

      weil meine äuglein dies auch langsam vermuten

      erwarte von einem id-feld nicht automatisch, dass es eindeutig ist - überzeuge dich immer, ob darauf ein primärschlüssel liegt - machmal sind datenbankdesigner "lustig" und vergeben die id doppelt und legen den primary key zb auf die hausnummer oder die postleitzahl ;)