• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Lesen und schreiben zu einen Textdatei

Sorry, aber viel Lesen heißt nicht, richtig lesen oder gar verstehen. Ich weiß, was du willst, das hast ja im ersten Post darzustellen versucht. Und ich habe dir (indirekt) Hinweise gegeben dass du mittels $arr=split($section) (bzw str_split) oder $arr=file('config-txt') an die Zeilen kommst, indem du sie in ein Array einliest.Dann kannst beispielsweise einfach mittels $zeile3=$arr[2] auf die 3. Zeile zugreifen. Aber Arrays sind absolute Grundlagen ebenso wie das Ausgeben oder Aufteilen einer Zeichenkette und die solltest erst mal lernen.
 
Zuletzt bearbeitet:
Werbung:
Wenn ich das halbwegs richtig verstanden habe, worum es geht:

PHP:
<?php
   function splitData($data)
   {
      $result = array();
     
      foreach ($data as $line)
      {
         $line = trim($line);
         $line = str_replace("int ", "", $line);
         $line = str_replace("= ", "", $line);
         $line = str_replace(";", "", $line);
         $line = explode(" ", $line);
         $result[$line[0]] = $line[1];
      }
     
      return $result;
   }
   
   if (isset($_POST['field']))
   {
       $data = array();
       foreach ($_POST['field'] as $key => $value)
           $data[] = "int $key = $value;";
           
       file_put_contents("config.txt", implode("\n", $data));
   }
   else
      $data = file("config.txt", FILE_SKIP_EMPTY_LINES);
   
   $data = splitData($data);
?>

<html>
<body>
  <form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<?php

   foreach ($data as $key => $value)
       echo "$key: <input typ='text' name='field[$key]' value='$value'><br>\n";
?>
   <input type="submit" name="submit" Value="Speichern">
</form>
</body>
</html>
 
Statt file_get_contents() würde ich empfehlen, einfach file() zu nehmen, dann stehen die einzelnen Zeilen deiner Configdatei in einem Array und Du kannst sehr einfach über den Index darauf zugreifen:
PHP:
$config=file('config.txt', FILE_IGNORE_NEW_LINES);
$line = $config[3];
Wenn die Zeile so aussieht:
Code:
int timer1 = 10; // Standartwert ist 10 sec.
kannst Du mit regexp die beiden Kompomenten, die wichtig sind, heraus holen:
PHP:
$pattern = '/[^\s]*\s+([^\s=]*)\s*=\s*([^\s;]*)\s*;/';
preg_match ($pattern , $line, $matches);
$fieldname = $matches[1];
$value = $matches[2];
$value kannst Du dann deinem Textfeld zuweisen.
PS: Ich würde empfehlen, schrittweise vorzugehen und zunächst nur die Configdatei auszulesen und das Formular zu generieren.
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Ich denke regexp sind viel zu kompliziert für unseren am Beginn stehenden Frager und wäre froh gewesen, wenn er mit den Anfangshinweisen von alleine auf die Idee gekommem wäre, mit dem einfachen Split die Zeile am = zu trennen, um an die 10 zu kommen. Das int kann man ja mit einem einfachen Replace eliminieren
 
Zuletzt bearbeitet:
Hallo Leute,

@bdt600,
Dank für das Script funktioniert sehr gut nur das speichern von die geänderte eintrage geht nicht, warum weiß nicht bekomme auch kein Fehlermeldung.
Jetzt versuch ich mich mit diesen Script mich schlau zu machen.

@Sempervivum,
Wenn ich das Script von bdt600 verstehe dann versuch ich deine Empfehlung mal ein zu bauen.

@NetAktiv,
Auch deine Empfehlung nehme ich mir zu Herzen.
Es ist nicht so dass ich nicht lehren will, bin Frührentner und habe sehr viel Zeit und beschäftige mich die ganze Zeit mit diesen Problem.
Für Leute die sich mit die Sprache aus kennen ist es alles einfach und stell ich vielleicht blöde Fragen.
Die letzte paar Tagen hab ich viel über PHP und HTML gelehnt, und sei mir nicht böse bei die nächste frage.
 
Wenn ich das Script von bdt600 verstehe dann versuch ich deine Empfehlung mal ein zu bauen.
Was das Lesen mit file() betrifft, macht er es genau so wie ich vorgeschlagen habe. Habe ich erst hinterher bemerkt.
Edit: Möchtest Du eigentlich alle Zeilen aus deiner Config-Datei editieren, oder nur ausgewählt?
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
nur das speichern von die geänderte eintrage geht nicht
Könnte an den Dateirechten liegen
Tausche
PHP:
<?php
   foreach ($data as $key => $value)
       echo "$key: <input typ='text' name='field[$key]' value='$value'><br>\n";
?>
gegen
PHP:
<?php
   if (! is_writable("config.txt"))
     echo "<span style='font-weight: bold; color: #ff0000'>config.txt nicht beschreibbar</span><br>\n";

   foreach ($data as $key => $value)
       echo "$key: <input typ='text' name='field[$key]' value='$value'><br>\n";
?>
 
Für Leute die sich mit die Sprache aus kennen ist es alles einfach und stell ich vielleicht blöde Fragen, ... und sei mir nicht böse.
Hallo Andreas,

ich bin dir sicher nicht böse, aber ich finde, du hast dir das leben zu schwer gemacht, indem du gleich ein für Anfänger relativ komplexes Problem lösen wolltest, und man gleich merken konnte, dass dir sogar die einfachsten Grundlagen fehlen. Ich habe mir mal ein einfaches Beispiel ausgedacht, dass ich gut zum Üben finde, schrittweise erweitert wird und nach dessen Lösung du in der Lage sein solltest, deine eigene ursprüngliche Aufgabe völlig selbständig zu lösen. Bei allen Schritten soll die Eingabe und das Ergebnis angezeigt werden. Ist eine Operation nicht erfolgreich, so soll der Benutzer eine Fehlermeldung erhalten.
  1. Erstelle Formulare mit zwei Feldern X und Y und einen Submit-Button.
  2. Die Felder sollen, wenn beides Zahlen sind (im PHP prüfen) addiert werden, ansonsten als String verkettet werden.
  3. Es sollen nur noch Ganzzahlen im Bereich 1..100 zugelassen werden, es gibt nun 4 Schaltflächen für die Grundrechenarten +-*/ (Eingabe prüfen, Fehler bei Division durch 0, ...)
  4. Es gibt ein zusätzliches Feld für Kommentar (Umlaute erlaubt), und der ist nur gültig (sonst Fehlermeldung), wenn er die ausgewählte Rechenart plus, minus, ... enthält. Verwende String Funktionen, zunächst keine Regular Expressions.
  5. Der Kommentar darf die Wort Mist, Käse und Quatsch nicht enthalten, diese sollen von PHP durch Toll, Klasse und Gut ersetzt werden.
  6. Beim erneuten Aufruf des Formulars sollen die alten Werte als Vorgabe vorhanden sein (Stichwort Session und/oder Cookies).
  7. Im Formular soll es noch einen Benutzernamen geben, die Aufgabe wird bei Erfolg in einer Datei benutzername.txt gespeichert.
  8. Die neue Schaltfläche Aufgabe anfordern erlaubt, die letzte Aufgabe des eingegebenen Benutzers aus der Datei einzulesen.
  9. Nun kannst versuchen, die verwendeten einfachen String-Funktionen wie strpos, split, str_replace durch Regular Expressions zu ersetzen.
Ich denke, jeder dieser Schritte ist gesehen vom vorigen so einfach, dass er auch alleine durch Suchen und Lesen der Doku lösbar ist, zumindest wenn man einen Hinweis auf eine entsprechende Funktion bekommt. Und wenn du viel Zeit hast und PHP lernen willst, dann kannst ja nun mal versuchen, diese Aufgabe ohne Hilfe zu lösen.
 
Werbung:
HTML:
<html>
<head>
    <title>Beispiel</title>
</head>
<body>
<center>
    <form NAME="Beispiel formular" METHOD="post" ACTION="beispiel.php"><br>
X : <input type="text" name="X" size="10" ><br>
Y : <input type="text" name="Y" size="10" > <br>
<br>
    <input type="submit" value="Speichern" name="speichern">
    </form>
</center>
</body>
</html>
 
Hallo Andreas,
also wegen mir musst deine Ergebnisse nicht zeigen und ich glaube auch nicht, dass die von allgemeinem Interesse sind. Was mir am ersten auffällt (bin aber auch kein Profi, mach das auch nur als Autodidakt für meine Homepages), muss nicht richtig sein:
  1. Am Anfang fehlt <!DOCTYPE html>
  2. Im Head sollte der Metatag für den Zeichensatz sein <meta charset='utf-8'>
  3. Element Attribute wie NAME schreibt man klein.
  4. <center> nimmt man vermutlich nicht mehr, sondern Formatierung macht man mit CSS, was neues zum Lernen. Gibt ein paar Ausnahmen, manchen Tags wie <strong> hat man kurzer Hand eine semantische Bedeutung verpasst und statt (früher) Fett nennt man das (heute) Wichtig, und stellt den Text fett dar :D.
  5. Man hat normalerweise Form und das verarbeitende PHP (zumindest bei so kleinen Projekten) in einer PHP Datei und entscheidet anhand der Parameter, was man alles anzeigt.
Grüße, Rainer
 
Werbung:
Hallo Rainer,

Ich mach etwas falsch aber komm nicht dahinter was es ist o_O

HTML:
<!DOCTYPE HTML PUBLIC>
<html>
<head>
<meta charset='utf-8'>
<title>Beispiel</title>
</head>
<body>
<?php
$x = "X";
$y = "Y";

$x + $y = $total;

echo Total = $total;   
?>
<form name="berechnen" method="post" action="" >
    <div align="center">
    <table border="0" width="50%" id="table1" cellspacing="0">
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>X :<input type="text" name="X" size="10" onclick="Rechnen()"></td> <br>
            <td>Y :<input type="text" name="Y" size="10" onclick="Rechnen()"></td> <br>
            <td>Total :<input type="text" name="total" size="10" onclick="Rechnen()"></td> <br>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td><input type="button" value="Berechnen" onclick="Rechnen()"></td>
        </tr>
    </table>
    </div>
</form>
</body>
</html>
 
echo verlangt einen String als Parameter, du hast 3 Möglichkeiten
Code:
//Verkettung von Strings, String 1 in doppelten Hochkomma
echo "Total = " . $total;
//Verkettung von Strings, String 1 in einfachen Hochkomma
echo 'Total = ' . $total;
// String 1 und Variable in doppelten Hochkomma
echo "Total = $total";
//Das geht nicht, $total wird nicht interpretiert
echo 'Total =  $total';
Schau dir zusätzlich mal die Funktion sprintf an, die ist an vielen Stellen auch sehr nützlich. Mit ihr wäre der Code
Code:
echo sprintf("Total = %s", $total);
Außerdem bekommen ja $x, $y nicht die richtigen Werte, du musst denen die Daten aus dem Formular zuweisen
Code:
$x = $_POST['X'];
$y = $_POST['Y'];

oder, wenn man die Daten auch mittels GET übermitteln will
http://localhost/beispiel.php?x=4&y=5
Code:
$x = $_REQUEST['X'];
$y = $_REQUEST['Y'];
Selbst dann bekommst eine Warnung, wenn du das Script ohne x oder y aufrufst, also schau dir mal die Funktion isset an.

Außerdem muss Total die Summe aus $x und $y sein, nicht umgekehrt, also
Code:
$total = $x + $y;
Dann braucht deine Form natürlich eine action="beispiel.php". Aber besser nimmt man hier dynamisch den Scriptnamen, suche dazu mal nach PHP_SELF. Das onclick="Rechnen()" würde eine JavaScript Funktion im HTML aufrufen, nicht das PHP Script auf dem Server.

Du siehst, wie wichtig es ist, erst mal an den Grundlagen zu arbeiten. Genauer besehen war nämlich aus dem PHP Bereich nichts richtig

Nachtrag: Zum HTML sage ich nun nichts, aber du verwendest kein CSS zum Formatieren und nimmst Tabellen-Leerzeilen, um Abstand zu erreichen. Das sind für Puristen alles nicht akzeptierbare Vorgehensweisen, aber Schritt für Schritt, nun erst mal das PHP.
 
Zuletzt bearbeitet:
Werbung:
Ich habe es mal ein wenig überarbeitet und kommentiert. Wichtig war noch, dass der button vom Typ submit sein muss, sonst werden die Formulardaten nicht übertragen.

Code:
<?php
    function main() {
        //print_r für Debugging aktivieren
        //echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
        //Formulardaten einlesen
        $x = (isset($_REQUEST['x'])) ? $_REQUEST['x'] : '';
        $y = (isset($_REQUEST['y'])) ? $_REQUEST['y'] : '';
        $total = $x + $y;
        //Daten prüfen muss noch gemacht werden
        //Wenn Prüfung OK, Daten ausgeben.
        echo "Daten empfangen x=[$x], y=[$y] <br/><br/>";
        echo "Summe Total = x + y = $total <br/>";
    }
?>
<!DOCTYPE HTML PUBLIC>
<html>
<head>
    <meta charset='utf-8'>
    <title>Beispiel</title>
    <style type="text/css">
        #input { width:600px; margin: 0 auto; padding:30px; }
        #result { width:600px; margin: 0 auto; background-color:#DDDDDD; padding:30px }
    </style>
</head>
<body>
    <form name="berechnen" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
        <!-- Formular für die Eingabe zentriert, Tabelle zur Formatierung fraglich-->
        <div id="input">
            <table>
                <tr>
                    <td>X:</td><td><input type="text" name="x" id="x" size="10" /></td>
                    <td>Y:</td><td><input type="text" name="y" id="y" size="10" /></td>
                </tr>
                <tr>
                    <td>&nbsp;</td><td><input type="submit" value="Berechnen"></td>
                    <td>&nbsp;</td><td>&nbsp;</td>
                </tr>
            </table>
        </div>
    </form>
    <!-- Ergebnis ausgeben, farblich hinterlegt und zentriert -->
    <div id="result">
        <?php  main(); ?>
    </div>
</body>
</html>
 
Zuletzt bearbeitet:
$_REQUEST ist grundsätzlich zu vermeiden, man sollte schon wissen, woher die Daten kommen. Also $_GET oder $_POST benutzen
 
$_REQUEST ist grundsätzlich zu vermeiden, man sollte schon wissen, woher die Daten kommen. Also $_GET oder $_POST benutzen
Das mag für produktive Umgebungen stimmen. Bei Tests (und um das handelt es sich hier) habe ich es gerne, wenn ich ein Script auch mal ohne Formular aufrufen kann, also berechnen.php?x=1&y=5. Wichtig ist nur, dass man weiß, was man tut und wie es sich verhält, wenn man den gleichen Feldnamen im Formular und der URL hat.
 
Werbung:
Hallo Andreas,

ich habe dir nochmals das Script ein wenig überarbeitet, um den sprintf zu demonstrieren und dabei auch die Tabelle entfernt und eine rudimentäre Datenprüfung eingebaut.

PHP:
<?php
    define("ALARM_TEMPLATE", "<h1 class='alarm'>Fehler:</h1><p>%s</p>");
    function main() {
        //print_r für Debugging aktivieren
        //echo "<pre>" . print_r($_REQUEST, true) . "</pre>";
        //Formulardaten einlesen
        $x       = (isset($_REQUEST['x'])) ? $_REQUEST['x'] : '';
        $y       = (isset($_REQUEST['y'])) ? $_REQUEST['y'] : '';
        $errText = '';

        //Daten prüfen
        if (($x == '') && ($y == '')) {
            $errText = "<p>Bitte Daten für x und y eingeben";
        } else if ($x == '') {
            $errText = sprintf(ALARM_TEMPLATE, "Kein Wert für [x] eingegeben");
        } else if ($y == '') {
            $errText = sprintf(ALARM_TEMPLATE, "Kein Wert für [y] eingegeben");
        }     
        //Bei einem Fehler oder ohne Daten die Info ausgeben und aufhören
        if ($errText != '') {
            echo $errText;
            return;
        }
       
        //Die Prüfung war OK, es sind zumindest Daten vorhanden
        //Eigentlich müssen wir noch prüfen, ob es Zahlen sind
        $total = $x + $y;
        echo "Daten empfangen x=[$x], y=[$y] <br/><br/>";
        echo "Summe Total = x + y = $x + $y = $total <br/>";
    }
?>
<!DOCTYPE HTML PUBLIC>
<html>
<head>
    <meta charset='utf-8'>
    <title>Beispiel</title>
    <style type="text/css">
        #input { width:600px; margin: 0 auto; padding:30px;}
        #result { width:600px; margin: 0 auto; background-color:#DDDDDD; padding:30px }
        .alarm  { color:red; }
        .spalte1 { width:40px; display:inline-block;}
    </style>
</head>
<body>
    <form name="berechnen" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
        <!-- Formular für die Eingabe zentriert, Tabelle zur Formatierung fraglich-->
        <div id="input">
            <p><label for="x" class="spalte1">X:</label><input type="text" name="x" id="x" size="10" /></p>
            <p><label for="y" class="spalte1">Y:</label><input type="text" name="y" id="y" size="10" /></p>
            <p><label class="spalte1">&nbsp;</label><input type="submit" value="Berechnen"></p>
        </div>
    </form>
    <!-- Ergebnis ausgeben, farblich hinterlegt und zentriert -->
    <div id="result">
        <?php  main(); ?>
    </div>
</body>
</html>
 
Das mag für produktive Umgebungen stimmen.
Das stimmt immer.
Bei Tests (und um das handelt es sich hier) habe ich es gerne, wenn ich ein Script auch mal ohne Formular aufrufen kann, also berechnen.php?x=1&y=5.
Gerade bei Test sollte man doch den richtigen Weg nehmen. Und hier geht es nicht um einen Test, sondern du machst hier eine Grundlagenschulung. Gerade da sollte man auf soetwas verzichten, einmal falsch gelernt und schon bleibt man dabei

PHP:
$_SERVER['PHP_SELF']
Ganz böse! google -> php_self xss
 
Zurück
Oben