@copy überschreibt nicht!: @copy überschreibt nicht!

Habe in meinem Skript die @copy-Funktion übernommen, um ein Avatar zu speichern:

@copy ($strFileTemp, "$pfad/$actual_user.jpg");

Wenn aber das Bild schon existiert, überschreibt er es nicht.
Habe da bei
http://www.phpcenter.de/de-html-manual/function.copy.html
gelesen, dass derartiges auftreten kann.

Wie kann ich aber die Datei trotzdem überschreiben?

Vielen Dank im voraus für eine Antwort,
Euer Danny.

  1. Hallo Danny.

    siehe http://php.net/unlink

    grüße Chris

    1. Genau!
      Das war auch soeben mein Gedanke.
      Besten Dank!

      Hallo Danny.

      siehe http://php.net/unlink

      grüße Chris

  2. Hallo @copy,

    die @copy-Funktion

    Das ist schonmal der erste Fehler, die Funktion heisst copy(). Mit dem @ davor wird eine moegliche Fehlermeldung unterdrueckt und das ist, wie du gerade erfahren hast, keine gute Idee.

    @copy ($strFileTemp, "$pfad/$actual_user.jpg");

    Muss also heissen copy ($strFileTemp, "$pfad/$actual_user.jpg");

    Wenn aber das Bild schon existiert, überschreibt er es nicht.
    Habe da bei http://www.phpcenter.de/de-html-manual/function.copy.html gelesen, dass derartiges auftreten kann.

    Zitat: bool copy ( string source, string dest )
    Ist dest eine URL, könnte der Kopiervorgang scheitern, sollte der Wrapper das Überschreiben von existierenden Dateien nicht unterstützen.
    dest ist aber keine URL in deinem Fall, also trifft obiges nicht zu.

    Ins Blaue getippt wuerde ich annehmen, dass du
    a) nicht die Rechte hast, um die Datei zu ueberschreiben
    b) noch irgendwo ein Handle auf der Datei liegt

    Fuege in die erste Zeile deines Scriptes ein:
    error_reporting(2047);
    Entferne das @ vor copy()
    Komm wieder mit einer Fehlermeldung

    Gruß,

    Dieter

    1. Ins Blaue getippt wuerde ich annehmen, dass du
      a) nicht die Rechte hast, um die Datei zu ueberschreiben

      Doch. chmod ist 777.

      b) noch irgendwo ein Handle auf der Datei liegt

      Diese Möglichkeit verstehe ich inhaltlich nicht.

      Fuege in die erste Zeile deines Scriptes ein:
      error_reporting(2047);
      Entferne das @ vor copy()
      Komm wieder mit einer Fehlermeldung

      Es wird keine Fehlermeldung angezeigt!

      ?

      Gruß, Danny.

      1. das wird auch net viel bringen..

        ich kann mich zwar täuschen, copy hat aber nicht die aufgabe zu "überschreiben". das was man unter "überschreiben" kennt, ist unlink+copy/rename, also auch immer zwei verschiedenne befehle.

        in einem hat er aber recht, lass bei solchen fehlern das @ weg. dann bekommst du auch eine (meist) aussagefähige fehlermeldung.

        grüße chris

        1. Hallo chris,

          ich kann mich zwar täuschen, copy hat aber nicht die aufgabe zu "überschreiben". das was man unter "überschreiben" kennt, ist unlink+copy/rename, also auch immer zwei verschiedenne befehle.

          Stimmt nicht, siehe http://lu.php.net/manual/de/function.copy.php
          Warning:
          If the destination file already exists, it will be overwritten.

          Gruß,

          Dieter

          1. hm, so kann man sich täuschen. war das unter c/cpp auch so?

            grüße Chris

            1. Hallo chris,

              hm, so kann man sich täuschen. war das unter c/cpp auch so?

              nein, dort gibt es copy() nicht.

              Gruß,

              Dieter

      2. Hallo DannyLupo,

        a) nicht die Rechte hast, um die Datei zu ueberschreiben
        Doch. chmod ist 777.

        Bist Du sicher oder vermutest Du das? Was wird ausgegeben, wenn du unmittelbar vor dem Kopieren einfuegst:
        clearstatcache();
        echo substr(sprintf('%o', fileperms("$pfad/$actual_user.jpg")), -4);

        b) noch irgendwo ein Handle auf der Datei liegt
        Diese Möglichkeit verstehe ich inhaltlich nicht.

        Wenn ein Programm (beispielsweise das vorherige Ausfuehren von copy()) eine Dateioperation durchfuehrt, hat es fuer diese Zeit und haeufig auch danach "den Daumen auf der Datei". Du kennst das sicher von Windows, wenn du vergebens versuchst, eine Datei zu loeschen, die irgendwo geoeffnet ist. Wenn dem so ist, kannst du die Datei natuerlich auch nicht ueberschreiben.

        Es wird keine Fehlermeldung angezeigt!

        Du hast error_reporting(2047) gesetzt und das @ entfernt? Setze das error_reporting unmittelbar vor clearstatcache(). Setze ein echo vor copy(), schau ins Handbuch, was copy() returnt

        Gruß,

        Dieter

        1. Hallo DannyLupo,

          a) nicht die Rechte hast, um die Datei zu ueberschreiben
          Doch. chmod ist 777.
          Bist Du sicher oder vermutest Du das?

          Ich bin sicher.
          Was wird ausgegeben, wenn du unmittelbar vor dem Kopieren einfuegst:

          clearstatcache();
          echo substr(sprintf('%o', fileperms("$pfad/$actual_user.jpg")), -4);

          0644 ... und was bedeutet das?

          Du hast error_reporting(2047) gesetzt und das @ entfernt? Setze das error_reporting unmittelbar vor clearstatcache(). Setze ein echo vor copy(), schau ins Handbuch, was copy() returnt

          0 wird ausgegeben.

          ? über ?

          Was bedeutet das nun alles?
          Gruß, Danny.

          1. Hallo

            a) nicht die Rechte hast, um die Datei zu ueberschreiben
            Doch. chmod ist 777.

            clearstatcache();
            echo substr(sprintf('%o', fileperms("$pfad/$actual_user.jpg")), -4);
            0644 ... und was bedeutet das?

            Der Besitzer der Datei darf die Datei lesen und schreiben (6), die Gruppe des Besitzers und alle anderen dürfen die Datei nur lesen (jeweils 4). Also nix mit 777.

            Die Frage ist jetzt, wer ist der Dateibesitzer, darf also schreiben?

            Tschö, Auge

            --
            Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
            (Victor Hugo)
            Veranstaltungsdatenbank Vdb 0.1
            1. Der Besitzer der Datei darf die Datei lesen und schreiben (6), die Gruppe des Besitzers und alle anderen dürfen die Datei nur lesen (jeweils 4). Also nix mit 777.

              Die Frage ist jetzt, wer ist der Dateibesitzer, darf also schreiben?

              Der Ordner hat 777.
              Die Datei standardmäßig 644.
              Muss dann noch entweder die Datei auf 777 setzen oder ich nehme wechselnde Datei-Namen. Habe mich für letzteres entschieden, was mich allerdings nicht sehr befriedigt. Naja.

              1. echo $begrüßung;

                Muss dann noch entweder die Datei auf 777 setzen

                Bitte wirf nicht wie wild mit Rechten umher, die eine Datei nicht braucht! Das Ausführen-Recht wird für eine Datendatei nicht benötigt. Ihr Inhalt stellt keinen ausführbaren Programmcode dar. Im Zweifelsfall kann dieses Ausführen-Recht eine Sicherheitslücke darstellen, wenn dir beispielsweise jemand irgendwas als Bild verkauft und es ihm dann noch gelingt, diese Datei auszuführen.

                Auch PHP-Dateien benötigen das Ausführen-Recht im Allgemeinen nicht, da sie nicht selbst aufgerufen werden sondern durch den PHP-Interpreter. (Mit den Ausnahmen wirst du vermutlich nicht in Berührung kommen.)

                echo "$verabschiedung $name";

          2. Hallo DannyLupo,

            Offenbar bist Du noch recht neu, was Programmieren mit PHP angeht, deswegen erklaere ich mal, wie ich hier vorgegangen bin. Vielleicht wird dann einiges etwas deutlicher.
            Im PHP-Handbuch steht unter copy():
            [...]
            Beschreibung
            bool copy ( string source, string dest )
            Diese Funktion kopiert die Datei source nach dest. Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE.
            [...]
            Sollte die Zieldatei bereits existieren, wird sie überschrieben.

            Was du vorhast, sollte also im Prinzip funktionieren. Als moegliche Fehlerursachen bieten sich erstmal an:
            a. Du hast, warum auch immer, keine Zugriffsrechte auf die Datei
            b. Du hast zwar die Rechte, aber irgendein Programm verwehrt dir den Zugriff
            c. Die Dateien werden kopiert, aber dein Pfad hat Fehler, das heisst die Dateien landen irgendwo anders

            Diese Fehler musst du systematisch eliminieren, also schaust du ins PHP Manual, bloss wo? - Du weisst ja, wie ich Deinem ersten Posting entnehme, etwas ueber chmod und 777, also fangen wir mal bei chmod() an. Das loest das Problem nicht unmittelbar, immerhin siehst Du, das Zugriffsrechte oktal, nicht dezimal anzugeben sind.
            In der Leiste auf der linken Seite findest Du unter den verwandten Funktionen fileperms() das klingt wie File Permissions, deswegen schaust du dir das mal an.
            Das macht genau, was du willst, aber da steht was von "Das Ergebnis dieses Funktionsaufrufes wird zwischengespeichert. Siehe clearstatcache() für weitere Einzelheiten.". Dort siehst du, erst clearstatcache() aufrufen, dann fileperms().
            Ich hatte dieses Beipiel gepostet, so steht es im englischen PHP-Manual
            clearstatcache();
            echo substr(sprintf('%o', fileperms("$pfad/$actual_user.jpg")), -4);

            0644 ... und was bedeutet das?

            Die Zugriffsrechte sind ein verhaeltnismaessig komplexes Thema aber z. B. hier recht gut erklaert.

            Deine Rechte besagen, dass nur der Fileowner schreiben bzw. loeschen darf. Typischerweise passiert sowas, wenn du die Dateien mit FTP hochlaedst und mit PHP ueberschreiben willst. Dann ist naemlich (ich mache das hier bewusst etwas einfacher) FTP der Owner und nur der kann die Rechte der andern, zB. Apache oder PHP aendern

            0 wird ausgegeben.

            Das waere die Moeglichkeit c. gewesen. Da copy() true oder false (bzw. 1 oder 0) zurueckgibt, haette eine 1 bedeutet, die Dateien werden sehr wohl kopiert, nur vielleicht nicht dorthin, wo du sie gerne haettest

            Frag ruhig nochmal nach, wenn dir noch was unklar ist.

            Gruß,

            Dieter