Ohne return-Befehl Werte immer 'false'

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

  • #16
    @pekka Am Ende des ersten Schrittes wird der Erfolg des Vorgangs, also im Beispiel das Schreiben von $z, als 'false' gewertet (dies sieht man, wenn man nur den ersten Schritt ausführt). Die intakte, aber als 'false' vorgestellte Variable $z wird dann im zweiten Schritt verarbeitet, aber das Ergebnis ist fehlerhaft.

    Kommentar


    • #17
      Was macht die Funktion slash()?
      Was zeigt eine Testausgabe von $z direkt nach der Zuweisung von slash()?

      Kommentar


      • #18
        Es liegt nicht an cURL, auch andere zweischrittige Funktionen sind betroffen. Was hatte es mit dem Hinweis auf sich, dass Funktionen ohne 'return' immer 'Null' ausgeben? Das stimmt hier fast. $z wird im ersten Schritt erfolgreich geschrieben, wird im zweiten Schritt aber nicht mehr richtig gelesen und ist am Ende leer (bzw. nur der Dateiname wurde kopiert).

        Kommentar


        • #19
          Prüfe mal durch schrittweise Testausgaben, an welcher Stelle $z geleert wird. Ab welcher Zeile ist $z leer?

          Kommentar


          • #20
            Die Funktion slash() setzt bloß die Schrägstriche im Dateipfad, daran liegt es nicht. Wie gesagt, wenn man die Funktion in zwei Funktionen aufteilt, kann man sehen, wie Funktion 1 oder Schritt 1 erfolgreich die Datei schreibt (die dann auch auf dem Server vorhanden ist), was, da 'return' fehlt, im Funktionsaufruf nicht gemeldet wird. Eigentlich sollte also in diesem Fall nichts gemeldet werden. Seit der Umstellung wird jetzt aber die false-Meldung ausgegeben.

            Kommentar


            • #21
              Sorry, aber ich verstehe immer noch nicht, was das Problem ist
              Beschreibe es mal bitte ganz simpel für blöde.
              Was ist falsch?
              Welche Variable hat in welcher Zeile welchen Wert?
              Welchen Wert sollte sie haben?

              Kommentar


              • #22
                Also $z ist ja eigentlich nie komplett leer, da der Dateiname in Schritt 2 übertragen wird. Die Datei ist leer.

                Kommentar


                • #23
                  Schritt 1 schreibt die Datei $z. Es wird aber nicht 'return' getätigt. Schritt 2 liest $z. Allerdings nur den Dateinamen.

                  Kommentar


                  • #24
                    Wie weißt Du, daß die Datei $z leer ist - Du löschst sie doch kurz vor dem Return?

                    Kommentar


                    • #25
                      Ahh jetzt versthee ich.

                      Was sagt eine Testausgabe des Dateiinhalts von $z vor dem curl_exec()?

                      Kommentar


                      • #26
                        Habe zur Veranschaulichung ein kleines Skript erstellt:
                        PHP-Code:
                        <?php
                        function addieren ($a$b) {
                          
                        $c $a $b;
                          if (
                        $c == true) {
                            echo 
                        "<p style=\"color:#008000; font-weight:bold\">Rechenvorgang ausgeführt. Ergebnis: $c</p>";
                            
                        // Kein 'return' des Ergebnisses
                        //    return $c;
                          
                        } else {
                            echo 
                        "<p style=\"color:#bb0000; font-weight:bold\">Rechenvorgang kann nicht ausgeführt werden</p>";
                            
                        // 'return'
                            
                        return false;
                          }
                        }
                        $ergebnis addieren("1""2");
                        if (
                        $ergebnis == true) {
                          echo 
                        "<p style=\"color:#008000; font-weight:bold\">Funktion meldet 'true'. Ergebnis: $ergebnis";
                        } else {
                          echo 
                        "<p style=\"color:#bb0000; font-weight:bold\">Funktion meldet 'false'</p>";
                        }
                        ?>
                        Die Funktion kann hier zwar nicht richtig arbeiten, da das Ergebnis des Rechenvorgangs nicht durch 'return' ausgegeben wird, aber beim Funktionsaufruf dürfte doch kein 'false' ausgegeben werden, weil es nicht so programmiert ist, oder? Unter http://www.weltvolk.de/php/addieren.php kann es aufgerufen werden. Hier die Ausgabe:
                        Code:
                        Rechenvorgang ausgeführt. Ergebnis: 3
                        
                        Funktion meldet 'false'
                        Zu erwarten wäre doch, dass kein 'false' ausgegeben wird, aber jetzt bedeutet 'nicht true' wohl dasselbe wie 'false'. So war es vorher aber nicht!

                        Kommentar


                        • #27
                          Zu erwarten wäre doch, dass kein 'false' ausgegeben wird,
                          Nö, kein Rückgabewert entspricht dem Wert NULL.
                          aber jetzt bedeutet 'nicht true' wohl dasselbe wie 'false'. So war es vorher aber nicht!
                          NULL ist auf jeden Fall nicht true, weshalb dein else-Zweig ausgeführt wird. Der Wahrheitswert von NULL ist nämlich false.

                          Kommentar


                          • #28
                            PHP-Desaster hat schon alles gesagt... Und genau aus dem Grund bin ich sicher, daß dein Problem seine Wurzel woanders hat

                            Was sagt eine Testausgabe des Dateiinhalts von $z? Denn der Punkt ist ja im Moment, wenn ich es richtig verstanden habe, daß eine leere Datei übergeben wird.

                            Kommentar


                            • #29
                              Zitat von PHP-Desaster Beitrag anzeigen
                              Nö, kein Rückgabewert entspricht dem Wert NULL.
                              NULL ist auf jeden Fall nicht true, weshalb dein else-Zweig ausgeführt wird. Der Wahrheitswert von NULL ist nämlich false.
                              Habe sogar auch mal 'return false' mit ausgeklammert, so dass die Funktion zum Wahrheitswert 'true/false' gar keine Aussage mehr machen dürfte. Trotzdem wird bei Funktionsaufruf weiterhin 'false' ausgegeben, was auf eine große Selbstständigkeit von PHP 5 schließen lässt, denn bei PHP 4 (jedenfalls bei meinem Provider) erfolgte gar keine Meldung.

                              Das Zweite, was mir aufgefallen ist, ist, dass eine Funktion durch 'return' gar nicht mehr abgebrochen/beendet wird, sondern, wenn in der Funktion nach einem return-Befehl noch Code folgt, die Funktion dann auch bis zum Ende des Codes weiterläuft. Das war bei PHP 4 auch anders!

                              Jetzt muss ich die Skripte in Bezug auf die problematischen Funktionen komplett umschreiben, d. h. alle zweischrittigen Funktionen, auf die ich so stolz war, in zwei Funktionen teilen. Wie soll ich das schaffen, wo diese Funktionen Bestandteil von anderen Funktionen sind? Jetzt wird alles viel zu kompliziert!

                              @pekka Es hat wirklich nichts mit cURL zu tun.
                              Zuletzt geändert von weltvolk; 03.08.2009, 10:15.

                              Kommentar


                              • #30
                                Das Verhalten beim Zurückgeben von Funktionen hat sich mit PHP 5 nicht geändert. Glaub mir: Ich hab ein Tutorial zu dem Thema geschrieben. Auch return hat sich nicht verändert. Hast Du eine konkrete Stelle, an der return die Bearbeitung einer Funktion nicht abbricht?`Zeig mal.

                                Zeig auchb mal die Original-Stelle, an der Du den Rückgabewert vergleichst. Passiert das so wie oben von Dir geschrieben? Daß das mal funktioniert hat, ist fast unmöglich bzw. für mich im Moment nicht nachzuvollziehen wie das gegangen sein soll.
                                Zuletzt geändert von pekka; 03.08.2009, 10:18.

                                Kommentar

                                Lädt...
                                X