• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Php zapis i odczyt z pliku

VPS Starter Arubacloud
0 głosów
2,250 wizyt
pytanie zadane 12 października 2016 w PHP przez Ditrix Mądrala (5,650 p.)
zmienione kategorie 12 października 2016 przez Ditrix

Witam

Odrazu mówię, że pytanie jest długie ^^ Mam 2 programy, które muszę zrobić na lekcję, a z PHP jestem całkowicie ciemny.

1. Ogólnie coś w formie komentarzy. Wpisuje w pole tekstowe komentarz i ma się on wyświetlić poniżej.

Oto mój kod

html

<!DOCTYPE HTML>
<html lang="pl">
<head>
	<meta charset="utf-8" />
	<title> Tytuł </title>
	<meta charset="UTF-8">
	<meta name="description" content="Projekty">
	<meta name="keywords" content="Projekty">
	<meta name="author" content="Damian Kurkiew">	
</head>
<body >
	<form action="zapisywanie.php" method="post">
	
	Komentarz <br>
	<textarea name="komentarz" cols="x" rows="y" placeholder="Tu wpisz tekst który pojawi się domyślnie"></textarea>
	
	<input type="submit" value="Wyślij">
	<input type="reset" value="Wyczyść">
	</form>
	<?php
	echo "Komentarz <br>";
	if(file_exists("test.txt")==false)
		touch("test.txt");
	else
	{
		$plik = fopen('test.txt', 'r');
		$rozmiar = filesize('test.txt');
		if(empty($rozmiar)) echo " ";
		else
		{
			$linia = " ";
			while(!feof($plik))
			{
				$linia = fgets($plik, 2048); 
				echo $linia;
			}				
		}
	}
	?>
</body>
</html>

Php

<?php
	if(isSet($_POST['komentarz']))
	{
		$plik = fopen('test.txt', 'a');
		$komentarz = $_POST['komentarz']."\r\n";
		fwrite($plik,$komentarz);
	}
	
	else 
		echo "Komentarz nie wpisany";
	include('index.php');
?>

Po każdym odświeżeniu strony dodawany jest do pliku tekstowego ten sam komentarz, który wpisałem wcześniej. Ponadto wczytuje mi wszystko w jednej linii zamiast tak jak w pliku tekstowym.

2. Drugi program to system logowania z pliku. Wprowadzamy login hasło, a moduł php sprawdza czy dane zgadzają się z zawartością w pliku.

html

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8"/>
<meta name="author" content=""/>
<meta name="keywords" content=""/>
<meta name="description" content=""/>
</head>
<body>
<form action="przekazywanie.php" method="post"/>
	<div style="margin-left:40%">
	<table style="border: 1px solid">
		<tr>
			<td  style="border: 1px solid"> <input type="text" name="name" placeholder="login">
		</tr>
		<tr>
			<td  style="border: 1px solid"> <input type="password" name="pass" placeholder="password">
		</tr>
	</table>
	<input type="submit" value="Wyślij" >
   </div>
 
 </form>
    
    </body>
</html>
<?php
	$user = $_POST['name'];
	$pass = $_POST['pass'];
	
	if(!($plik = fopen("test.txt", "r")))
		echo 'Błąd logowania <a href="index.php"> Powrót do logowania </a>';
	else
	{
		function checkPass($pass,$user)
		{
			$plik = fopen("test.txt", "r");
		echo "Plik otworzony <br>";
		while(!feof($plik))
		{
			$line = trim(fgets($plik));
			echo $line;
			if($pos=strpos($line, ":")===false) 
				continue;
			
			$tempUser = substr($line , $pos);
			if($tempUser != $user) continue;
			
			$tempUser = substr($line, $pos + 1, strlen($line) - $pos);
			echo $tempUser;
			if($tempUser != $pass) continue;
			else return false;
		}
		}
		
			if(checkPass($pass, $user)==false) echo "Niepoprawne logowanie";
			else echo "Użytkownik " .$user." zostal zalogowany";
	}	
?>

Plik tekstowy

Admin:Admin
Marek:Marek1
Adam:Adam1
User:User1

Najpierw login, a po dwukropku hasło. Zmienna $tempUser jest czysta, nic nie jest do niej przypisywane. Nie wiem czemu. Kod dla mnie wgl jest jakiś dziwny. Jeżeli funkcja fgets() wczytuje nam po linijce ( czy każdą literę osobno? ) to wyświetlając zmienną $line wyświetla ona nam cały ciąg znaków z pliku. Czyli funkcja strpos() nie ma w tym przypadku sensu.

I tu proszę o objaśnienia jak działa dokładnie ta funkcja fgets() i jak najlepiej w tym przypadku wczytywać z pliku ta dane, aby logowanie działało poprawnie.

komentarz 12 października 2016 przez Munvik Dyskutant (9,350 p.)
Zła kategoria.
komentarz 12 października 2016 przez Ditrix Mądrala (5,650 p.)
Poprawione. Dzięki
komentarz 12 października 2016 przez Boshi VIP (100,240 p.)
musisz korzystać z fopen? nie lepiej skorzystać  http://php.net/manual/en/function.file-get-contents.php ? albo file i potem sobie dane obrabiać ?

1 odpowiedź

0 głosów
odpowiedź 13 października 2016 przez PiotrBajer Mądrala (5,300 p.)
wybrane 17 października 2016 przez Ditrix
 
Najlepsza

Cześć!

W pierwszym zadaniu dopisuje kolejny komentarz przy odświeżeniu ponieważ nie przekierowujesz użytkownika do strony z komentarzami po zapisaniu do pliku, dlatego formularz jest za każdym razem przetwarzany gdy odświeżasz stronę. Aby tego uniknąć musisz przekierować użytkownika do tej samej strony za pomocą
<?php header('Location: adres strony'); exit; ?>
po zapisaniu do pliku, w ten sposób w przeglądarce nie będzie już danych z formularza do zapisu.

Drugi problem, czyli brak nowych linii wynika z tego, że w HTML aby zachować nowe linie musisz zamienić znaki \n lub \r na znacznik nowej linii <br> lub umieścić wszystkie komentarze między znacznikami <pre></pre>. 

Funkcja fgets działa tak jak napisałeś - pobiera jedną linijkę. Kod PHP masz dobry
Prościej jednak byłoby użyć funkcji "file", która od razu tworzy tablicę z danego pliku, zobacz tutaj: http://php.net/manual/en/function.file.php

Funkcji fgets używa się do dużych plików, ponieważ pozwala wczytywać plik po kawałku.

W drugim przykładzie prawdopodobnie PHP nie wykrywa dokładnie nowych linii (w windowsie jest to "\r\n", unix ma "\n", macos ma jeszcze inaczej). Spróbuj włączyć wykrywanie znaku nowej linii ini_set("auto_detect_line_endings", true);
Dodatkowo możesz spróbować stosować zamiast kombinacji "\r\n" stałą PHP_EOL

Osobiście to przerobiłbym ten kod na:

<?php
    $user = $_POST['name'];
    $pass = $_POST['pass'];
     
	$file_name = 'test.txt';
	$is_logged_in = false;
	
	 if(file_exists($file_name)) {
		 $file_content = file($file_name);
		 
		 foreach($file_content as $line) {
			 list($user_login, $user_pass) = explode(':', trim($line));
			 if($user == $user_login && $pass = $user_pass) {
				 $is_logged_in = true;
				 break;
			 }
		 }
	 }
	 
	 if($is_logged_in) {
		 echo 'Niepoprawne logowanie';
	 } else {
		 echo "Użytkownik " .$user." zostal zalogowany";
	 }
?>


 

komentarz 17 października 2016 przez Ditrix Mądrala (5,650 p.)

Sory za takie opóźnienie, jednak jestem zobowiązany Ci odpisać.

Dzięki wielkie! Dzięki Tobie mniej więcej ogarnąłem gdzie tkwi problem i jak go rozwiązać. Ponadto funkcja odczytu file miażdży fopen :) Zrobiłem cały skrypt na nowo. Trochę skorzystałem z Twojego i trochę z tego mojego poprzedniego.

<?php
	$user = $_POST['name'];
	$pass = $_POST['pass'];
	
	$file_name = "test.txt";
	
	if(file_exists($file_name))
	{
	$plik = file("test.txt");
	$is_logged_in = false;
	$help = ":";
	
	foreach($plik as $line)
	{
		$pos = strpos($line,":");
		$tempHaslo = substr($line,$pos);
		$tempUser = str_replace($tempHaslo, '', $line);
		
		if($tempUser == $user)
		{
			if(trim(substr($tempHaslo,1)) == $pass)
				$is_logged_in = true;
			
			break;	
		}
	}
	
	if($is_logged_in==true)
			echo "Użytkownik $user zalogowany pomyślnie";
	else
		echo "Niepoprawne logowanie";
	}
	
	else 
		echo "Niepoprawne otwarcie pliku";
?>

Jeszcze raz wielkie dzieki! :)

Podobne pytania

0 głosów
2 odpowiedzi 550 wizyt
pytanie zadane 28 lipca 2016 w PHP przez rucin96 Użytkownik (500 p.)
0 głosów
2 odpowiedzi 225 wizyt
pytanie zadane 24 maja 2016 w C i C++ przez Kacperos_89 Początkujący (400 p.)
0 głosów
2 odpowiedzi 1,451 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...