foreach-Schleife zur Text-Verschlüsselung

  • Hallo zusammen,
    Ich hoffe jemand kennt das Problem oder zumindest die Lösung :) :

    Ziel ist ein PHP-Skript (eingebunden in HTML), welches einen Text aus einem Eingabefeld empfängt, in ein array umwandelt und Wert für Wert mit einem alternativen Alphabet ersetzt. Schließlich wird alles via implode wieder zum string, der in einer Textdatei abgespeichert wird. Übliche Ersetzungsfunktionen habe ich von Anfang an ausgeklammert, da sie stets alle Werte innerhalb eines arrays ersetzen und damit bereits ersetzte Werte nochmals ersetzt werden könnten. Ich habe versucht, mit einer foreach-Schleife mein Text-array zu durchlaufen, jeweils den anvisierten Wert in einem Standartalphabet (ist auch ein array) zu suchen. Der Zielcursor liegt dann im Standartalphabet auf einem Index (0, 1, 2, etc.). Man sucht unter dem selben Index in der eigentlichen Verschlüsselung (array mit genau so vielen Werten wie das Standartalphabet) den neuen Wert. Dieser ersetzt den alten im Text-array.

    Die Browser-Ausgabe des momentan noch fehlerhaften Skriptes ist eine leere Seite.

    Mein Problem ist anscheinend die foreach-Schleife, denn ein Eliminieren der darin enthaltenden if-else-Bedingungen (also ein Vereinfachen) hat scheinbar nichts verändert. Ein vollständiges Entfernen der foreach-Schleife hat darüber hinaus gezeigt, dass sie jedwede Browser-Ausgabe des php-Skriptes verhindert. Ohne sie wird der Rest durchgeführt/angezeigt, mit ihr eben nicht. Vielleicht hat jemand von Euch einen Blick dafür, ob ich etwas bei der Verwendung der Schleife noch grundsätzlich falsch mache oder ob irgendwo kleinere Fehler alles blockieren.

    Vielen Dank für Eure Antworten!


    Das folgende Skript ist nur ein Aussschnitt und enthält eine Vielzahl von Kommentaren, die hoffentlich zum Verständnis beitragen:

  • Und wo ist jetzt das Problem? Fehlermeldungen?
    Die Zeile

    PHP
    if  ( $AbgleichText = FALSE)

    ist falsch. Vergleiche mit == (in deinem fall ===, denn wenn es das 0te element des arrays ist zählt es mit == auch als false)

    PHP
    echo "<font color="red">$value</font>";

    Ist enbenfalls grottenfalsch.
    Wo hört der String auf? Bei ". Escape mit \ oder benutze '

    Du hast das script nochnichtmal ausgeführt, richtig?
    Ich mach jetzt mal nicht weiter, führ das mal aus unde verbessre die Fehler, ich bin mit sicher, du findest die Lösung selbst.

    P.S.: Sicher ist das nicht.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Und wo ist jetzt das Problem? Fehlermeldungen?

    Siehe oben. Die Schwierigkeit liegt eben darin, dass KEINE Fehlermeldung ausgegeben wird. Die Ausgabe ist (wie gesagt) eine leere Browser-Seite. Und ja, natürlich starte ich das Skript von einem PHP-fähigen Server.

    Du hast das script nochnichtmal ausgeführt, richtig?
    Ich mach jetzt mal nicht weiter, führ das mal aus unde verbessre die Fehler, ich bin mit sicher, du findest die Lösung selbst.

    P.S.: Sicher ist das nicht.

    Falsch. Warum sollte ich es nie ausgeführt haben und dann Details zur Fehlerfindung geben können? Und ich finde leider das Problem selber nicht. In früheren Skripten ist es mir häufiger passiert, dass eben solche Fehler eingebaut werden, wie du sie oben aufgezeigt hast. Da ich mir PHP selber beibringe (learning by doing), kommt das vor, ohne, dass es mir auffällt. Daher auch die Vermutung, ich hätte die foreach-Schleife vollkommen falsch angewand.

    Und nochmal zur Vergewisserung: $arrText gibt ohne den ganzen Rest dahinter tatsächlich ein indiziertes array. Die wichtigste Grundvorraussetzung ist also erfüllt :P

  • haste auch

    error_reporting(E_ALL);
    und
    ini_set("display_errors", true);

    in deinem script stehen? hier sieht mans ja nicht....
    dann sollten dir nämlich auch fehler angezeigt werden :)


    das konstrukt hier:
    foreach ($arrText as &$value)
    kenn ich so auch nicht.
    das &-zeichen ist doch als verweis also referenz(zeiger) anzusehen.
    da du nirgendwo eine variable $value hast gibts auch keine "referenzobjekte"
    aber ich bin selber kein pro in php und lass mich da gerne eines besseren belehren ;)

  • Ok, ich dachte, auch ohne Zusatzzeile würde wie immer eine Fehlermeldung kommen. Ich packe es gleich mal mit rein.

    Die Verwendung von &$value ist auch so ne Sache. Auf einer Internetseite steht, damit würde man $value veränderbar machen. Auf einer anderen sollen dadurch eben nur Referenzen erstellt werden, die neben den eigentlichen Werten existieren und sogar vorsichtshalber gelöscht werden sollen, damit das ursprüngliche array in sich ja auch erhalten bleibt. Was generell $value angeht: Die Anwendungsbeispiele auf dne Internetseiten haben alle bedeutet, dass es sich tatsächlich auf die nacheinander abgerufenen Werte vom behandelten array versteht. Man konnte zum Beispiel, alle Werte in einem array mit einer Zahl addieren/multiplizieren/etc.. Also müsste auch eine andere Funktion zum Ersetzen der Werte durch andere funktionieren.

  • Ja, alle Änerdungen sind vorgenommen worden. Die Echos habe ich vorsichtshalber ausgequotet. Das & entfernt, die Bedingung $AbgleichText === FALSE gesetzt.

    ---> leeres Browserfenster und vorher wurden mir auch keine Parse-Errors angezeigt, wie man es vielleicht vermuten würde.

    Falls gewollt, gebe ich einfach das gesamte Skript durch, zu Testzwecken.

  • ganzes script wär nicht verkehrt.
    Und da Synaptic so gerne belehrt wird: $value wird im foreach-Konstrukt erzeugt und erhält bei jedem Durchlauf den nächsten Wert von $arrText. Normal wäre $value eine Kopie, dessen Änderungen sich nicht auf den tatsächlichen Wert in $arrText auswirken. Wird $value im foreach-Konstrukt aber als Referenz ausgewiesen, so werden Änderungen an &$value auch sofort auf den Wert in $arrText angewandt. Inwiefern das gewollt ist muss jeder selber wissen. Meiner Meinung nach liest es sich deutlich einfacher, wenn gewünschte Änderungen explizit wieder in $arrText unter Verwendung des Schlüssels von $value gesetzt werden. Referenzen führen vor Allem bei unerfahrenen Programmierern schnell zu schwer zu findenden Fehlern.

    PS: wo führst du das Script denn aus? manche (free-)Provider unterdrücken nämlich die Ausgabe von Fehlern.


  • ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    über include wird das eigentlich Verschlüsselungs-Skript aufgerufen:

    Wundert Euch bitte nicht, wozu es ISchluessel gibt. Das ist ein Relikt und hat ohnehin erstmal keinen Einfluss.

    Als Provider nutze ich funpic.de, da es nach kurzem Umschauen dort noch ne Menge Freiheiten gab, abgesehen vom Bilderhochladen und anderen datenlastigen Handlungen. Bisher wurden mir auch immer brav Fehlermeldungen ausgegeben. Deswegen ist es auch verwunderlich, dass keine Rede war von einem parse error vor den letzten Veränderungen.

    2 Mal editiert, zuletzt von Permafrost (22. Februar 2011 um 12:57)

  • So wie dus verwendest musst du $value als Referenz ausweisen. sonst wird schon mal garnix.
    Du holst dir den Zeiger ins Übersetzungsarray mit

    PHP
    $ZeigerAlph = key ($arrAlph);

    Dieser ist aber immer 0. Somit wird in deinem Text alles mit "ü" übersetzt.
    Kleiner Tipp: schau dir mal in der php-doku den Rückgabewert von array_search an.


  • Der Grund, warum ich dich unberechtigter weise des nicht.ausführens bezichtig habe ist, dass ich eigentlich glaube, dass da mindestens EIN syntax-fehler kommen sollte, zumindes bei dem <font color="red">.
    Setz mal zwischen jede anweisung ein echo "1<br>"; nach die nächste echo "2<br>"; usw. bis ans ende. Dann sollte die Asugabe ziemlich aufschlussreich sein.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • danke für die info jojo, hab solch konstrukte nie gebraucht, weil ich wenn ne key=>value-schleife hatte und somit via key aufs array zugegriffen hatte..

    hab mir des aber bevor ich dein posting gesehen hab nochma von einem meiner kollegen verklickern lassen :)

  • PHP
    danke für die info jojo, hab solch konstrukte nie gebraucht, weil ich wenn ne key=>value-schleife hatte und somit via key aufs array zugegriffen hatte..

    bevorzuge ich auch, ist schlich einfacher zu lesen und man weiss gleich was los ist. Son & übersieht man schnell...


  • Woohoo, die Lösung ist da. Aber der Reihe nach:

    1) Der blödeste Fehler war (wie bereits von euch erkannt) der Einsatz von $irgendwas in '' der echos
    ----> das hat überhaupt eine Ausgabe im Browser verhindert, ohne einen Fehler anzuzeigen

    2) Ich bin nicht wirklich dahintergestiegen, warum ich trotz as &$value keine array-Werte verändern konnte aber ihr hattet noch den netten Weg drumherum. as $key => $value lässt sich viel intutiver anwenden

    3) Alle Werte im Text-array wurden tatsächlich nur mit ü ersetzt. Mir war nur nicht (mehr) klar, dass array_search den key ausgibt und dann wohl an den Anfang des arrays zurückspult.

    Auf jeden Fall klappt es jetzt mit folgender foreach-Schleife:


    Dann nochmal vielen Dank für die tollen Tipps. Da scheint jeder etwas beigetragen zu haben.

  • Noch ein kleiner Tipp am Rande: Du musst das font nicht in 3 echos ausgeben. Man kann strings in PHPP verknüpfen:

    PHP
    echo '<font color="red">'.$value.'</font>';


    ;)

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!