Suche unterstützung bei anfängerprojekten

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

  • #16
    ich habe eben direkt nach dem Festlegen der Variable $de in der Schleife, die Variable $de ausgegeben, keine Ausgabe:

    mir geht's einfach nicht rein, dass hierbei wircklich der Fehler ist, zumal, wie ich gesagt habe, habe ich das ganze in einer anderen Datei mit anderen Variablen, so wie ich es gemacht habe, ausprobiert. Die Variablen wurde wie von mir gewünscht ausgegeben, also kann da Nicht der Fehler liegen, sondern eher woanders . . .

    ### Woran es noch liegen könnte ###
    Meldung:
    Die Datei konnte nicht geöffnet werden (andere Datei: deutsch.dat)
    Folge: Die uebersetzung.dat enthält keine Werte (Das Eintragen ging nicht, folglich muss es an der Funktion fputs liegen, oder an der Variablenzuweisung (Definition) kann aber auch nicht sein, wie ich schon gesaGT / ausprobiert habe, dann woanders, aber wo . . .
    kannst mal guken, ich hab echt kein plan, weil die Definition in der Schleife ist richtig, zu mindest weis ich njicht wo der fehler liegen soll / könnte . . .

    . . . ich mein die Sache verstehe ich schon, ich möcht gerne das Ding lösen, zumal es das erste Skript ist, in dem ich mein gelerntes angewendet habe . . .

    . . . ich denke, schlecht ist das für den Anfang nun auch wieder nicht, oder ??
    Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
    ### Eine BITTE ###
    Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

    Danke

    Kommentar


    • #17
      Ich wollte darauf hinaus, dass die Definition von $inhalt innerhalb der while-Schleife steht. Wenn diese Schleife nicht betreten wird, wird auch die Variable nicht definiert.

      Das erklärt sich am einfachsten an folgendem Beispiel:
      PHP-Code:
      while (false) {
          
      $var 'foo';
      }
      echo 
      $foo
      Deine while-Schleife steckt zusätzlich noch in einem if-Block. Wenn die if-Bedingung nicht erfüllt ist, wird auch die while-Schleife im if-Block nicht ausgeführt. Auch dann ist $inhalt nicht definiert.

      Schauen wir mal auf deinen Code:
      PHP-Code:
      if ($germ fopen("german2.dat""a") && $englis2 fopen("english2.dat""a"))
      {
          while (
      $de fgets($germ) && $en fgets($englis2))
          {
              
      $inhalt $de ' ::: ' .$en;
              
      $inhalt.= $en':::' .$de ;
          }
          
      // ...

      Du hast selbst schon bemerkt, dass die eine Datei nicht gelesen werden kann. Also wird der if-Zweig nicht betreten und $inhalt nicht definiert. Ganz einfach.

      Vermutlich hat der Webserverprozess nicht die nötigen Leserechte für die Datei. Ändere das mal ... z.B. mit "chmod 644 dateiname".

      Wenn du sichergestellt hast, dass der if-Zweig ausgeführt wird (mit echo 'klappt'; direkt nach dem if() kannst du das überprüfen), mußt du dir noch überlegen, was du da eigentlich mit $inhalt machst.
      Folgendes Beispiel zeigt, was du zur Zeit programmiert hast. Zur Vereinfachung habe ich das Lesen aus Dateien durch die Selektion von Arrayelementen ersetzt:
      PHP-Code:
      $d_file = array('a''b''c');
      $e_file = array('x''y''z');
      while (
      $de next($d_file) && $en next($e_file)) {
          
      $inhalt $de ' ::: ' $en;
          
      $inhalt .= $de ':::' $en;

      Jetzt schauen wir mal, wie $inhalt in den einzelnen Schleifendurchläufen aussieht.
      PHP-Code:
      // 1. Durchlauf
      $inhalt $de ' ::: ' .$en;    // 'a ::: x'
      $inhalt .= $de ':::' $en;    // 'a ::: xa:::x'

      // 2. Durchlauf
      $inhalt $de ' ::: ' .$en;    // 'b ::: y'
      $inhalt .= $de ':::' $en;    // 'b ::: yb:::y'

      // 3. Druchlauf
      $inhalt $de ' ::: ' .$en;    // 'c ::: z'
      $inhalt .= $de ':::' $en;    // 'c ::: zc:::z' 
      Wie du siehst, wird $inhalt am Ende nur Werte aus dem letzten Durchlauf enthalten. Warum ist das so?
      Ganz einfach, weil du in jedem Durchlauf den aktuellen Wert von $inhalt überschreibst in dem du sagst $inhalt = "bla".
      $inhalt .= "bla" dagegen ist korrekt. Damit hängst du "bla" an den aktuellen Wert an. Signifikanter Unterschied: Anhängen versus Überschreiben!

      Jetzt kümmere dich erstmal um die Datei. Wenn du für die nötigen Rechte gesorgt hast, schaust du im Manual bei fopen() nach, was das 'a' bedeutet.
      Zuletzt geändert von onemorenerd; 20.11.2007, 17:53.

      Kommentar


      • #18
        zu Schleife wird nicht betreten:

        dieses false bedeutet: Bedingung nicht erfüllt
        So verstehe ich das:

        Die if – Anweisung und die while – Schleife hängen miteinander zusammen. Die while – Schleife liegt der if – Anweisung als Anweisungsblock vor. D.h., dass wenn die if – Anweisung nicht umgesetzt wird (betreten) wird, dann kann die while – Schleife nicht in Aktion treten. Die Schleife wird somit nicht verarbeitet/abgearbeitet bzw. nicht betreten.

        Da die if – Anweisung nicht erfüllt ist, kann die while – Schleife nicht in Aktion treten und somit kann die Variable $inhalt nicht gesetzt werden. Fehlermeldung: Undefined: Variable. Also liegt der Fehler nicht in der while – Schleife, sondern eher im Bereich der if – Anweisung, genauer: Die Dateien konnten nicht geöffnet werden. Und das wiederum kann daran liegen, das die Datei nicht erstellt ist, würde ich so sagen.

        zu: Im Manul nachschauen was a macht:
        Ich habe diesbezüglich mal nachgesehen:

        Der Unterschied mit w und a ist zwar nur gering, aber trotzdem ganz entscheidend.

        Kurz mal ausholen. Die Funktion fputs liest de Dateiinhalt zeilenweise aus und schreibt diesen an der Zeigerposition. Diese Position ist bei der Auswahl vonm Modi von großer Bedeutung: Denn je nach Position, wird der Inhalt überschrieben (Zeiger: am Anfang) oder am Ende (was bei a = append = anhängen) der Fall ist. D.h., dass mit dem Modi a der Dateizeiger ans Ende der Datei gesetzt wird und dadurch wird der neue Inhalt am alten angehängt.

        Wäre an dieser Stelle ein anderer Modi gesetzt, beispielsweise: w, dann würde der Zeiger am Anfang der Datei stehen und somit würde die Funktion fgets den bereits eingetragenen Inhalt überschreiben. (wichtig bei: Counter) -hierbei käme es zur Fehlermeldung)

         soweit hab ich das verstanden, hui macht mir das wieder Spass!!!
         (jetzt bin ich wieder anwesend, so gefällt mir das)


        ich hab eben in der php-ini gesucht aber leider nicht gefunden
        (läuft auf der Testumgebung)
        Eine Frage noch: wie heißt die Server Direktive, in der ich den chomed Wert 666, besser 777 (für, lesen, schreiben) ändern kann ?


        Vielen herzlichen Dank für deine Hilfe, man lernt einiges mehr wie im Kurs !

        Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
        ### Eine BITTE ###
        Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

        Danke

        Kommentar


        • #19
          Freut mich zu sehen, dass du Fortschritte machst.

          Den Fehler mit "undefined variable" hast du nun völlig korrekt auf das Fehlschlagen der if-Bedingung zurückgeführt.

          Das Fehlschlagen rührt daher, dass die Datei vom Script nicht gelesen werden kann. Bevor ich dazu komme, warum das so ist und wie du es ändern kannst, muß ich nochmal auf die Modi von fopen() eingehen.

          Den Modus 'a' erklärt das Manual mit "Open for writing only". Du darfst auf eine so geöffnete Datei also nur schreibend zugreifen, nicht lesend.
          fgets() will aber lesen. Das kann nicht gutgehen!

          würde die Funktion fgets den bereits eingetragenen Inhalt überschreiben
          Nein! fgets() schreibt nicht, fgets() liest.

          Fazit:
          Wenn du schreiben willst, mußt du eine andere Funktion benutzen.
          Wenn du lesen willst, mußt du bei fopen() einen anderen Modus angeben.


          Und nun komme ich zum Problem mit der Datei. Es gibt keine Server-Direktive, keine Einstellung in der php.ini oder sonstwo.
          Jede Datei trägt sozusagen "in sich", wer wie darauf zugreifen darf.
          Lies dazu http://de.wikipedia.org/wiki/Dateiberechtigung, http://de.wikipedia.org/wiki/Unix-Dateirechte und http://de.wikipedia.org/wiki/Chmod.

          Kommentar


          • #20
            ich freu mich für die Unterstützung von dir, so wird das was !

            ich hab eben mal kurz reingelesen, möcht für heute mal schluss machen, morgen wieder, oder übermorgen, vielen hezlichen Dank. Das Ganze will ich sammeln und daraus ein Mini Tutorial mit Fehlerseite erstellen. Wird noch sehr lange dauern . . .



            Danke es lohnt sich!


            bin lernbehindert, deswegen!
            Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
            ### Eine BITTE ###
            Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

            Danke

            Kommentar


            • #21
              Hallo, bin wieder am Lernen!
              Ich habe eben deine Antwort gelesen. Hab ich das richtig verstanden?
              Die if Anweisung ist aug Grund des Modus a (oOnly for writing) fehlgschlagen. D.h., dass das Skript die Funktion fgets nicht ausführen kann. Und folglich kann die Schleife, die der If - Anweisung als Anweisungsblock nicht aktiv werden, was folgendes zur Folgfe hat:

              1. Die Lesefunktion fgets, kann die Dateien nicht auslesen, folglich werden die Werte nicht in die Funktionsvaraiable "gepuffert", was wiederum zur Folge hat, dass der Inhalt beider Dateien nicht in die uebersetzung.dat, durch die Funktion fputs eingelesen werden kann, und somit wird der Inhalt nicht ausgegeben.

              Also quasie: eine Verkettung von Ereignissen, die zu den beiden Fehlermeldungen führt. Der ausschlaggebende Fehler ist: nicht direkt die if Anweisung, sondern der Ausdruck / Bedingung der If - Anweisung, bzw. der Modus a. Mit diesem Modus, wird die Datei im Open for Writing Only - Modus geöffnet.

              An dieser Stelle habe ich mal eine Frage:
              Hierbei gibt es, so fern ich es verstanden habe, zwei Faktoren, die für das Scheitern der if - Anweisung, genauer der fopen - Anweisung verantwortlich ist.

              1. eine Funktion wählen, die im Lesemodus öffnet, damit ausgelesen werden kann

              2. und an dieser Stelle, ist auch meine Frage:
              eine anderen Modus, also ich würde (persönlich / fachlich) eher einen anderen Modus wählen. Nämlich a+. Weil: Dieser Modus unterscheidet sich in genau diesen einen Punkt vom Modus a (Open for writing only). Mit dem erweiterten Modus 'For Writing and Reading' wird die Datei im Schreib- und Lesezugriff geöffnet, folglich, würde der Moduswechsel von a in a+ an sich ausreichen, oder?

              Wie heißt denn der Modus zum Schreiben, ich kenne da nur fputs. Und wie gesagt, ich würde nur den Modus ändern.

              Begründung:
              Weil durch den bestehenden Modus 'a', wird nur im Schreibzugriff geöffnet, fgets will aber nur lesen und fputs übernimmt dann die Schreiarbeit je nach Modus, bzw. genauer: Position des Dateizeigers, diese ist ja auch mit entscheident!

              Wird im Modus a+ wie oben geschrieben habe, geöffnet, so wird gleichzeitig geschrieben und geöffnet. Das würde bedeuten, dass zu erst die Lesefunktion aktiviert wird und anschließend -außerhalb der schleife- die Schreibfunktion die Inhalt in die Datei einliest.
              Zuletzt geändert von prophp; 23.11.2007, 02:06.
              Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
              ### Eine BITTE ###
              Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

              Danke

              Kommentar


              • #22
                So, ich habe im php - Manual nach der Schreibfunktion fwrite gesucht und mir die Anwendung angesehen. Ich habe das Ding wie folgt angewendet.

                1. Zum öffnen der Datei 'uebersetzung.dat', habe ich den Modus r Open for Read Only verwendet. (wie du gesagt hattest!)

                2. habe ich die Prgrammstruktur der Aufgae etwas verändert.

                ### Das Neue ###
                Die Dateien, die ausgelesen werden sollen öffnen. Ist dies erfolgreich verlaufen, folgt die Überprüfung von der uebersetzungsdatei.dat beschreibbar ist oder nicht. Ist dies der Fall, wird die nachfolgende Kontrollinstanz zum Überprüfen, ob die zu beschreibende Datei zum beschreiben geöffnet werden kann. Ist dies der Fall, So wird mit der Funktion fwrite -enthält zwei Parameter- 1.Parameter: Pointer, 2.Parameter die Variable mit dem Inhalt.

                => was hälst du davon?

                PHP-Code:
                //kann die Datei 'uebersetzung.dat' beschrieben werden?
                            
                if (is_writable("uebersetung.dat"))
                            {
                                
                //kann die Datei geoffnet werden?
                                
                if(!($fpOut fopen("uebersetung.dat""a") ) )
                                           die (
                "Kann leider nicht geöffnet werden") ;
                            
                    
                // $inhalt in die Datei 'uebersetzung.dat' reinschreiben
                                       
                if(!fwrite($fpOut,$inhalt))
                                      {
                                             print 
                "Die Datei 'uebersetzung.dat' konnte   
                                                        nicht  beschrieben werden!" 
                ;
                                                  }
                                       
                //hier: war kein else Zweig,  in php.net/manual !    
                    
                              
                print "Die Datei 'uebersetzung.dat' konnte  
                                                  beschrieben werden!" 
                ;
                            }
                           else 
                            {
                                 echo 
                "Die Datei 'uebersetzung.dat' konnte zum 
                                               Beschreiben nicht geöffnet werden!" 
                ;

                      } 
                // Ende: innere if - Anweisung
                       
                fclose $fpOut) ;
                        } 
                ### Neue Meldung ###
                Die Datei 'uebersetzung.dat' konnte nicht beschrieben werden!Die Datei 'uebersetzung.dat' konnte beschrieben werden!

                => da fehlt der else zweig, oder?
                (im manual: ist der nämlich weggelassen worden!

                ### kleine Anmerkung ###
                ich weis nicht, nerve ich ??? Ich mein nur so kann ich lernen und Erfahrung sammeln! Ich wollte das was im Manual steht einbauen, Verbesserung für meine geistigen Fähigkeiten! => wie ist das Neue?
                Zuletzt geändert von prophp; 23.11.2007, 02:13.
                Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
                ### Eine BITTE ###
                Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

                Danke

                Kommentar


                • #23
                  1. Zum öffnen der Datei 'uebersetzung.dat', habe ich den Modus r Open for Read Only verwendet. (wie du gesagt hattest!)
                  Du verwendest nicht r sondern a. Ich hatte auch nie etwas von r gesagt ...

                  Original geschrieben von prophp
                  ### Neue Meldung ###
                  Die Datei 'uebersetzung.dat' konnte beschrieben werden!
                  Na bitte, es klappt doch.

                  Der Code sieht auch schon viel aufgeräumter aus.
                  Aber zukünftig bitte etwas mehr Mühe beim Einrücken geben.


                  Hm nein, du nervst nicht. Aber du bist teilweise schwer zu verstehen.
                  Vermutlich wären deine Beiträge verständlicher, wenn du in kurzen Sätzen schreibst. Möglichst ohne Nebensätze, Klammern, Kommata oder sonstwas. Nur ein Fakt pro Satz.
                  Vor dem Abschicken des Beitrags solltest du ihn nochmal komplett lesen und verbessern. Mach ich auch so.

                  Kommentar


                  • #24
                    Entschuldigung bitte, danke für den Hinweis. Naja das liegt wohl an meiner Lernbehinderung (ich geh damit offensiver damit um).

                    Ich hatte da wohl was falsch verstanden!

                    Was mir bei den if- Anweisungen auffällt:
                    Die sind alle miteinander verknüpft. Folglich kann das Problem oftmals ganz woanders liegen, wo man es vermutet. Dies kann außerhalb des if - Block liegen oder, was die Sache ein kleines bischen "einfacher" macht, innerhalb des Blocks. Ziemlich komplexe abstrakte Denkerei!
                    Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
                    ### Eine BITTE ###
                    Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

                    Danke

                    Kommentar


                    • #25
                      zweite Antwort auf deine letzten Beitrag

                      Jetzt habe ich aber folgendes:

                      Wie kann ich die Zugriffsrechte auf lesen und schreiben setzen?
                      ich möchte dies auf folgenden Weg ausführen:

                      1. mittels Skript siehe: die Links, die du mir genannt hattest
                      2. mittels ftp

                      Beim Skript zum Versenden vom Newsletter hatte ich die gleiche Problematik. Jedoch, ohne der Fehlermeldung: Undefined Variable.

                      Das Setzen von den Dateiattributen/Zugriffsrechten, scheint die Hauptfehlerquelle zu sein? –Wieso?

                      Als Lösung wurde mir folgendes gesagt:
                      -leere Datei erstellen,
                      -auf meinen Server hochladen
                      -Dateinamen umbennen

                      Die Datei konnte trotzdem nicht ausgelesen werden und somit auch der Newsletterversandt nicht erfolgen. –Wieso?


                      Bitte sag mir wie beides geht!

                      Ich brauche immer wieder Rückmeldungen über meinen Schreibstil und Tipps, wie ich es verbessern kann und wie Fragen direkt stellen kann.
                      Zuletzt geändert von prophp; 23.11.2007, 22:24.
                      Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
                      ### Eine BITTE ###
                      Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

                      Danke

                      Kommentar


                      • #26
                        Das kleine Einmaleins zur Dateierzeugung:

                        Die wichtigsten Möglichkeiten mit PHP eine Datei zu erzeugen sind fopen(), file_put_contents() und touch().

                        Mit fileowner() kann man den Besitzer einer Datei ermitteln.* Mit chown() kann man ihn ändern.

                        Mit fileperms() kann man die Rechte einer Datei ermitteln. Mit chmod() kann man sie ändern.

                        Mit unlink() kann man eine Datei löschen.


                        *) Der Besitzer der Datei ist meist der User, der das Script ausgeführt hat, also der Webserver-User (wwwrun oder nobody).
                        Bei einem Provider mit suPHP gehört die neue Datei dem User, dem auch das Script gehört, welches die Datei erstellt hat.


                        Spiel einfach mal mit den Befehlen herum. Erzeuge eine Datei, schau dir an, wem sie gehört und welche Rechte gesetzt sind und dann versuche beides mal zu ändern.

                        Kommentar


                        • #27
                          33206 //durch fileperms()
                          Fehler beim Aufruf der php Datei

                          Die Dateieinträge werden ohne einen Whitespace wie in einer Endlosschleife nebeneinander eingetragen.

                          Ich wollte die beiden Werte ich, du, nein untereinader ausgeben lassen.

                          Die komplette Datei, die entsprechenden Stellen habe ich mit einem # kenntlich gemacht:
                          PHP-Code:
                          <?php
                          #liegt hier die ursache für den Eintrag
                          $inhalt "nein";
                          $inhalt.="ich";

                          $datei "datei.txt" ;

                           
                          //beschreibbar
                           
                          if (is_writable($datei))
                           {
                              
                          //kann die zu beschrebende Datei geöffnet werden
                              
                          if(!$zeiger fopen($datei"a") )
                              die (
                          "leider nein") ;
                              
                              if(!
                          fwrite($zeiger,$inhalt))
                              {
                                  print 
                          "In die Datei kann nicht reingeschrieben werden" ;
                                  exit;
                              }

                           print 
                          "fertig" ;

                           
                          //direkt nach dem eintragen, Datei schließen
                           
                          fclose($zeiger) ;

                           }
                          else
                           { print 
                          "konnte nicht beschrieben werden" ;}

                          ### das neue ###

                          //zugriffsrechte zurückgeben, Ausgabe: 33206
                          $perm fileperms($datei) ;
                          echo 
                          $perm;

                          #inhalt untereinander ausgeben, schlug fehl
                          echo "<pre>";
                          include (
                          $datei);
                          echo 
                          "</pre>";
                          ?>
                          ### zum php Manual: ###
                          Wo kann ich zu den Anwendungsbeispielen Erkärungen in deutsch finden. Zum Selbstlernen, wäre es sehr wichtig!
                          Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
                          ### Eine BITTE ###
                          Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

                          Danke

                          Kommentar


                          • #28
                            PHP-Code:
                            echo '<pre>';
                            echo 
                            "Ich bin\nein Zweizeiler."
                            echo '</pre>';

                            echo 
                            "Ich auch, aber<br />aus HTML." 

                            Kommentar


                            • #29
                              Hmm . . .
                              zum Letzten Script:
                              Ich habe mit der Funktion fwrite Werte in die Datei 'datei.txt' reingeschrieben. Nur leider werden die ohne Leerzeichen in einer Reihe eingetragen. Warum?

                              Zudem werden diese mehrmals in die datei.txt eingetragen, wie bei einer Endlos Schleife, die immer wieder die gleichen Werte ausgibt.

                              Ich brauche eine Erklärung des Beispielskiptes zur Funktion $fileperms, wo gibt's die?

                              ### Fehler vom 1. Skript gefunden ? ###
                              Ich habe eben die Funktion fileperms ($dateiname) 511; im Skript gesetzt Ausgabe der Oktalnotation: 438

                              //Eigentümerrechte:
                              lesen

                              Er darf nicht in die Datei schreiben. -richtig?

                              //Benutzerrechte:
                              schreiben und ausführen

                              //Sonstige:
                              lesen
                              schreiben ergibt nur: 7
                              ausführen

                              aber was bedeutet: die 8
                              Ich möchte mich bei Allen dir mir beim Umsetzen von meinen Lernzielen helfen bedanken!
                              ### Eine BITTE ###
                              Bitte gebt mir Rückmeldungen über: Strukturfehler, Schreibstil und Ausdrucksweise in Fragen und Antworten

                              Danke

                              Kommentar

                              Lädt...
                              X