Ankündigung

Einklappen
Keine Ankündigung bisher.

Counterfehler beim runterzählen.

Einklappen

Neue Werbung 2019

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

  • Counterfehler beim runterzählen.

    Hallo @all

    ich beschäftige mich gerade mit der Programmierung von PHP. Ich habe damit gerade angefangen und arbeite mich langsam in das Thema ein.

    Nun bin ich auf ein Problem gestoßen, dass ich nicht gelöst bekomme. Bei der Lösungssuche war ich bisher nicht erfolgreich, da ich bei den entsprechenden Hilfeseiten nie auf dasselbe Problem traf. Und ich würde mich freuen wenn mir hier jemand helfen könnte.

    Ich würde auch darum bitten die Lösung zu erklären. Ich habe bei vielen Hilfe die ich inzwischen gelesen habe das Problem gehabt, dass ich die Hilfe mittels eines Codes erfolgreich gegeben wurde, ich aber nicht nachvollziehen konnte, was der Code eigentlich bewirkt und warum er funktioniert. Ich möchte mein Problem nicht nur lösen, ich würde es gerne verstehen.

    Das Skript:
    PHP-Code:
    $fg fopen("Gast.txt""r+"); // Variable $fg gesetzt und das Dokument "Gast.txt" geöffnet mit Lese- und Schreiberlaubnis.
    $counter fgets($fg,4); //Variable $counter wird gesetzt. Dokument "Gast.txt" wird gelesen beschränkt auf 4 Zeichen
    $counter--; // Variable $counter wird um 1 verringert.
    rewind($fg);//Setzt Lesezeiger von "Gast.txt" zurück auf die erste Position.
    fputs($fg$counter);//$counter wird in "Gast.txt" geschrieben.
    fclose($fg); // "Gast.txt" wird geschlossen. 
    Die Datei "Gast.txt"

    PHP-Code:
    10 
    Das Problem:
    Wenn der PHP-Teil nun ausgeführt wird, wird mir "Gast.txt" mit
    PHP-Code:
    90 
    ausgegeben.
    Ich verstehe nicht warum das so ist. Ich hätte es gerne das er mir dann "9" ausgibt.
    Kann mir jemand den Fehler erklären?

    Danke für eure Hilfe

  • #2
    Benutze [MAN]file_get_contents[/MAN]

    Kommentar


    • #3
      Was genau bedeutet das?

      Soweit ich das aus dem Hilfe-Link gelesen habe wird bei file_get_contents() ein String zurück gegeben. Soweit ich gelesen habe ist ein String keine Zahl, die ich hier ausgeben möchte. Das verwirrt mich etwas.

      Mir ist auch nicht ganz klar wie ich den file_get_contents() einsetze und was genau es bewirkt. Reicht es file_get_contents() zu benutzen, oder muss ich es wieder ins Dokument zurück übergeben?

      Ich hätte es jetzt so lösen wollen.
      PHP-Code:
      $counter file_get_contents('Gast.txt',$counter--); 
      Das funktioniert nun gar nicht. Ich nehme an da fehlt nun etwas, aber mir ist ganz und gar nicht klar was.

      Kommentar


      • #4
        Counterfehler beim runterzählen.

        Lies den Manualeintrag nochmals durch.

        Was wird wohl "bool $useIncludePath" bedeuten?

        Du hast 1 Parameter zu viel angegeben.
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          Warum das ganze so ist:

          Code:
          //Dein "cursor ist |
          |10
          
          Du ließt die 10 aus
          
          10|
          
          Du rewindest
          
          |10
          
          Du schreibst eine 9
          
          9|0
          Die 0 wird hierbei nicht angetastet.
          [MAN]file_put_contents[/MAN]
          [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

          Kommentar


          • #6
            @tkausl
            Danke für deine Erklärung. Das machte mir einiges verständlicher.

            @ChristianK
            Soweit ich das gelesen habe löst $useIncludePath eine Suche im Verzeichnis aus. Sprich es sucht die Datei, oder??? Mir ist nicht ganz klar, was das mit meinem Problem zu tun hat.
            Aber ich habe mit eurer Hilfe scheinbar mein Problem gelöst:

            PHP-Code:
            $file 'Gast.txt';//Variable $file wird gesetzt und die zu bearbeitete Datei wird beannt.
            $counter file_get_contents($file);//Variable $counter wird gesetzt und die ganze Datei "Gast.txt" wird ausgelesen.
            $counter--;// Variable $counter wird um 1 verringert.
            file_put_contents($file$counter); //Variable $counter wird in $file geschrieben. 
            Das scheint zu funktionieren.

            Was mich noch interessiert:
            -Habe ich die Funktionen richtig verstanden(Nach den Kommentaren?)
            -Kann man den Code noch verkürzen?

            Danke für eure Hilfe.

            Kommentar


            • #7
              Zitat von Klanuk Beitrag anzeigen
              -Kann man den Code noch verkürzen?
              PHP-Code:
              file_put_contents('Gast.txt'file_get_contents('Gast.txt')-1);
              //Oder, wenn du den Counter noch brauchst:
              file_put_contents('Gast.txt'$counter file_get_contents('Gast.txt')-1); 
              [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

              Kommentar


              • #8
                Danke tkausl.
                PHP-Code:
                file_put_contents('Gast.txt'file_get_contents('Gast.txt')-1); 
                funktioniert super!

                Ich habe jetzt auch verstanden wie das funktioniert

                Kommentar


                • #9
                  würde noch ein flock drumpacken

                  Kommentar


                  • #10
                    Welchen nutzen hätte dies?

                    flock scheint zu bedeutet das es die Datei bzw den Zugriff sperrt. Das ist dafür gedacht das niemand nichts zur gleichen Zeit auf, in meinem Beispiel, "Gast.txt" zugreift?

                    Kommentar


                    • #11
                      Korrekt erfasst.
                      [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                      Kommentar


                      • #12
                        flock in Verbindung mit file_put_contents ist keine gute Idee. Dann muß dies anders realisiert werden.

                        Aber was kann bei der Lösung von tkausl schlimmstenfalls passieren?
                        Mit einer Wahrscheinlichkeit von 1:1 Mio das einmal runterzählen "vergessen wird".

                        Kommentar


                        • #13
                          Sicherlich müsste es anders gelöst werden. Beispiel ist in der verlinkten MAN Seite.

                          Wann und wie oft es passiert ist nicht von Belang. Es kann passieren, es wird passieren und führt zu einem fehlerhaften Verhalten. Also gleich richtig machen. Zumal es dem TE die spätere Sucherei erspart, denn solch ein Fehler ist oft nicht leicht zu erkennen.

                          http://de.wikipedia.org/wiki/Race_Condition

                          Kommentar


                          • #14
                            Das Schlimmste, was da theoretisch passieren kann, ist auch wahrscheinlich nicht das Vergessen des Runterzählens, sondern das Springen auf "-1", wenn das file_get_contents in einem Request B läuft, wenn das file_put_contents von Request A die Datei truncated, aber selbst noch nicht geschrieben hat.

                            Grob so:

                            Ausgangswert in Gast.txt: "1000"

                            Code:
                            Request A                       Request B
                            ------------------------------------------------------------
                            
                            file_get_contents ("1000")
                            -1 ("999")
                            file_put_contents TRUNC ("")
                                                            file_get_contents ("")
                                                            -1 ("-1")
                            file_put_contents WRITE ("999")
                                                            file_put_contents TRUNC ("")
                                                            file_put_contents WRITE ("-1")
                            Wert in Gast.txt ist jetzt "-1", sollte aber "998" sein.

                            Bei zwei Besuchern am Tag ist es nicht wahnsinnig realistisch, dass so was passiert, aber ich würde definitiv nicht ausschließen, dass das vorkommt, wenn die Seite etwas mehr Traffic hat.

                            Kommentar


                            • #15
                              Für meinen Zweck wäre die Lösung von tkausl ausreichend, da den Schreibzugriff für "Gast.txt. tatsächlich nur von einem Benutzer genutzt werden soll.

                              Trotzdem würde ich das Flocksystem gerne verstehen.

                              Warum ist es schlecht Flock und file_get_contents zu verbinden?

                              So wie es im Beispiel von MA steht müsste ich wieder zurück zu fopen, fgets usw. Mit diesem System hat mein Counter nicht funktioniert, da aus 10 90 würde statt 9. Mir ist nicht ganz klar wie ich das lösen sollte.
                              Flock wäre ja lediglich zusätzlich zu dem was ich vorher hatte.

                              Kommentar

                              Lädt...
                              X