ppmk22
Goto Top

txt bearbeiten lesen schreiben

Möchte mit PHP eine txt lesen bzw. auswerten und überarbeiten

Hallo Forum

Ich habe eine txt in der stehen 6 Namen mit je einer Zahl dahinter. Diese Zahlen sollen mittels Formular bzw. durch PHP geändert werden.
Die txt sieht so aus:

Svenja H. 51
Svenja Z. 56
Mike 39
Kim 111
Petra 8

Nun kommt aus dem Formular für Petra ein Zähler dazu.
Dann sollte die txt so aussehen:

Svenja H. 51
Svenja Z. 56
Mike 39
Kim 111
Petra 9

Ich denke man müsste den Inhalt der txt in ein Array lesen bearbeiten und dann wieder rein wegschreiben.
Da ich aber nicht so die php Kennerin bin, stehe ich da vor einen großen Problem.

Hat bitte wer einen Lösungsvorschlag für mich.

Liebe Grüsse

Petra

Content-ID: 113343

Url: https://administrator.de/contentid/113343

Ausgedruckt am: 25.11.2024 um 22:11 Uhr

laggflor
laggflor 06.04.2009 um 22:47:55 Uhr
Goto Top
Nabend!

Ja, "Textdatei --> Multidimensionales Array" ist eine Möglichkeit.
Ist aber nicht schön.

Zuerst möcht ich aber eines abklären...
Gibt es einen besonderen Grund Textdateien zu verwenden?
Über eine Datenbank wäre das viel schöner und einfacher zu lösen.

Erzähl doch mal ein bisschen was du damit vorhast.

LG
Florian
ppmk22
ppmk22 07.04.2009 um 00:51:43 Uhr
Goto Top
Hallo Florian

Textdatei muss nicht sein, habe aber kein SQL. Es Könnte auch eine XML oder eine html Seite mit einer Tabelle die durch php dann gleich gefüllt wird sein. Zweck der ganzen Sache ist so nee Art voting.

LG
Petra
dog
dog 07.04.2009 um 03:35:59 Uhr
Goto Top
Hallo,

schau dir mal SQLite an http://de2.php.net/sqlite Das ist eine dateibasierte Datenbank und braucht darum keinen Server.

Wenn du aber auf eine Datenbank (und die Möglichkeiten, die das mit sich bringt) verzichten willst empfehle ich dir mal serialize() und unserialize() in Verbindung mit file_get_contents() und file_put_contents() anzuschauen (das funktioniert natürlich nur, wenn du keinen vorhandenen Datenbestand hast).

Ansonten hat PHP auch einen CSV-Parser http://de.php.net/manual/de/function.fgetcsv.php was hier aber aufgrund der fehlenden Kommas auch problematisch wäre.

Zu guter letzt bleibt natürlich noch die Methode eines eigenen Parsers:

<?php

	function read_file($filename) {
		$handle = fopen ($filename, 'r');  
		$matches = array();
		while (!feof($handle)) {
		    $buffer = fgets($handle, 4096);
		    if(preg_match('/([a-z \.]+)\s+(\d+)/iD', $buffer, $results)) {  
				$matches[$results[1]] = $results[2];
			}
		}
		fclose ($handle);
		
		return $matches;
	}
	
	function write_file($dataArray,$outputfilename)
	{
		$str = '';  
		foreach ($dataArray as $key => $value) {
			$str .= $key.' '.$value."\n";  
		}
		return file_put_contents($outputfilename, $str);
	}

?>
(nicht getestet, so nicht praxistauglich, da Fehlerprüfung fehlt)

Grüße

Max
ppmk22
ppmk22 07.04.2009 um 21:28:42 Uhr
Goto Top
Hallo Max danke schon mal, ich habe es damit mal versucht.
Bei meinem Code wird wohl jeder Programmierer die Hände über den Kopf zusammen schlagen, aber hier ist er.

<?php
	#ERGEBNIS KOMMT AUS DEM VOTE.HTM
	$ergebnis = $_POST["R1"];  
	$datafile = "txt.txt";  
	
	#ANLEGEN DER VARIALBLEN
	$sh ;
	$sz ;
	$m  ;
	$k  ; 
	$p  ;
	
	
	#DER FUNKTION DEN TXT ÜBERGEBEN
	read_file($datafile);

	function read_file($filename) {
		$handle = fopen ($filename, 'r');  
		$matches = array();
		while (!feof($handle)) {
		    $buffer = fgets($handle, 4096);
		    if(preg_match('/([a-z \.]+)\s+(\d+)/iD', $buffer, $results)) {  
				$matches[$results[1]] = $results[2];
			}
			
			#ÜBERPRÜFEN WAS EINGELESEN WIRD
			echo  "  $buffer  <br/>";  
		}
		fclose ($handle);
		
		
		return $matches;
	}
	
	#DER VARIABLEN DIE WERTE DER TXT ZUWEISEN
	
       $sh = ;
	$sz = ;
	$m  = ;
	$k  =; 
	$p  = ;
	
	
	#DAS ZUZÄHLEN DER WERTE AUS VOTE.HTM
	
	if ( $ergebnis == sh)
	{
		$sh++;
	} else {
		if ( $ergebnis == sz)
		{
			$sz++;
		}else{
			if ( $ergebnis == m)
			{
				$m++;
			}else {
				if ( $ergebnis == k)
				{
					$k++;
				}else {
					
				}if ( $ergebnis == p)
				{
					$p++;
				}else {
					
				}
			}
		}
	}

$ergNeu = "Svenja H. $sh\r\nSvenja Z. $sz\r\nMike $m\r\nKim $k\r\nPetra $p";  

$fp = fopen($datafile, "w");  
fputs($fp, $ergNeu);
fclose($fp);


?>

Das mit den "#DER VARIABLEN DIE WERTE DER TXT ZUWEISEN" im Code bekomme ich nicht hin.

Sieh bitte mal drüber

LG
Petra
dog
dog 07.04.2009 um 22:20:05 Uhr
Goto Top
Füg in deinen Code mal
<?php
print_r(read_file($datafile));
?>
ein.

Vielleicht kommst du dann selbst drauf, ansonsten verrate ich dir wie's weitergeht. face-smile

Grüße

Max
ppmk22
ppmk22 08.04.2009 um 08:33:45 Uhr
Goto Top
Leider weiß ich damit nicht anzufangen.

Verrate es mir bitte.

Bin aber daruf gekommen das meine if-else Geschichte mit eine switch-case Abfrage schöne ist.
So also:

	#DAS ZUZÄHLEN DER WERTE AUS VOTE.HTM
	
	switch ($ergebnis)
	{
		case sh : $sh++;
		break;
		case sz : $sz++;
		break;		
		case m : $m++;
		break;		
		case k : $k++;
		break;		
		case p : $p++;
		break;				
	}

LG
Petra
laggflor
laggflor 08.04.2009 um 09:34:17 Uhr
Goto Top
Textdatei muss nicht sein, habe aber kein SQL. Es Könnte auch
eine XML oder eine html Seite mit einer Tabelle die durch php dann
gleich gefüllt wird sein. Zweck der ganzen Sache ist so nee Art
voting.
Ok, Lösungen für Textdateien hast du ja bereits.

Hier noch Varianten in andere Richtungen:
1. Hoster suchen der eine SQL-Datenbank unterstützt. Hetzner bietet das zB bereits um nicht mal 2,-- im Monat an (von der Empfehlung hab ich nichts) mit ner MySQL Datenbank. Für den Zweck reicht definitiv auch schon SQLite - eine kleine File-basierte Datenbank.
2. XML, und zwar zB so: http://www.drweb.de/magazin/php-und-xml-einfach-einfach/

Vorteile von beiden Lösungen:
  • Dein Source-Code muss sich nicht um das genaue Handling der Textdatei kümmern, sondern greift nur auf bereits bestehende Resourcen zu.

Noch zwei Vorteile der Datenbank-Lösung:
  • Gleichzeigiger Zugriff (die bei einem großen Voting mal passieren können) stellen kein Problem dar.
  • Für ne Auswertung ist nur ein SQL notwendig - nicht das durchlaufen der gesamten Datei in einer Schleife.

GLG
Florian http://www.lagg.at
ppmk22
ppmk22 09.04.2009 um 14:22:18 Uhr
Goto Top
Hab jetzt mit einer SQL Lösung angefangen.
Die Lösung hier für hätte ich aber gerne noch gewusst.
Hast Du sie Max?

Andere Frage:
Warum bekomme ich hierbei immer eine Fehlermeldung?

<?php
	echo "hallo";		  
	header("location: next.htm");  
?>

Warning: Cannot modify header information - headers already sent by (output started at ....../test.php:2) in ..../test.php on line 3

Ohne den "echo" Befehl geht es durch.

LG
Petra
dog
dog 09.04.2009 um 15:01:31 Uhr
Goto Top
Warum bekomme ich hierbei immer eine Fehlermeldung?

Das ist ganz einfach: Wegen der Funktionsweise von HTTP.
Eine HTTP Antwort sieht immer so aus:
HTTP/1.1 301 Moved Permanently
Date: Thu, 09 Apr 2009 12:54:41 GMT
Server: Apache
Location: next.htm

hallo
Du siehst, die header() müssen allesamt vor dem eigentlichen Inhalt der Seite kommen.
Darum produziert dein Code einen Fehler. Ein header darf nicht mehr kommen nachdem bereits der Seiteninhalt angefangen hat.
Du kannst diese Einschränkung aber auch umgehen, indem du ganz an den Anfang deiner Seite
ob_start();
schreibst.

Die Lösung hier für hätte ich aber gerne noch gewusst.

Mein Code hätte die Datei in ein assoziatives Array geladen.
Svenja H. 51
Svenja Z. 56
Mike 39
hätte also mit read_file() folgenden Array ergeben:
<code type="plain>
Array
(
[Svenja H.] => 51
[Svenja Z.] => 56
[Mike] => 39
)

Du hättest dann die einzelnen Werte einfach über (z.B.)
$array["Svenja H."];  
abrufen können oder mit foreach alle Werte auflisten...

Grüße

Max
laggflor
laggflor 09.04.2009 um 15:21:46 Uhr
Goto Top
Hab jetzt mit einer SQL Lösung angefangen.

Gute Entscheidung Petra - kommst du voran?
Ich helf dir gern soweit das geht, hab aber schon lange in PHP nix mehr gemacht. Ich verwende TurboGears, ein Python Framework dass für die Datenbankaufgaben SqlAlchemy benutzt. Damit schlag ich mich auch nicht mehr mit joins in SQL-Abfragen herum, sondern greife nur noch auf Objekte zu. Leider mit dem Nachteil, dass die Anforderungen für den Server steigen.

Lange Rede - kurzer Sinn:
Wenn du fragen hast bei der SQL-Lösung: You're welcome. Gibt mir die Chance einer Auffrischung der PHP-Kenntnisse.

LG Florian http://www.lagg.at/
ppmk22
ppmk22 12.04.2009 um 11:39:50 Uhr
Goto Top
Da ich ja jetzt mit einer SQL Lösung angefangen bin, und in dieser Richtung nicht weitermachen werde, markiere ich diesen Beitrag als gelöst.

Liebe Grüsse noch mal.
Petra
masterG
masterG 14.04.2009 um 11:51:20 Uhr
Goto Top
Zitat von @ppmk22:
Da ich ja jetzt mit einer SQL Lösung angefangen bin, und in
dieser Richtung nicht weitermachen werde, markiere ich diesen Beitrag
als gelöst.

Liebe Grüsse noch mal.
Petra

Daher closed

masterG(Moderator).