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

Kod działa, a wg mnie powinien wyrzucić błąd o nieistniejącej zmiennej. Czy ktoś może mi to wyjaśnić?

Object Storage Arubacloud
0 głosów
270 wizyt
pytanie zadane 16 marca 2017 w PHP przez mia Nowicjusz (140 p.)

Witam,

ostatnio przerabiam sobie książkę PHP 5 Ćwiczenia praktyczne wyd.III Kierzkowski. Trochę stara, ale konkretna. 

No wiec tak, doszłam do ćwiczenia z ankietą no i próbuję zrozumieć ten kod, ale coś mi się tu nie zgadza. Kod działa i nie wyrzuca błędów, a według moich obliczeń powinien wyrzucić błąd o nieistniejącej zmiennej.  

INDEX.PHP :

<?php
	
	$glosowanie = array ('6' => 'rewelacyjna', '5' => 'bardzo dobra', '4' => 'dobra', '3' => 'przeciętna', '2' => 'zła', '1' => 'beznadziejna');
	
	function wyswietlanie ($glosowanie, $glosowano) {
		if ($glosowano){
			if (file_exists('dane/glosowanie.txt')) {
				$plik = fopen ('dane/glosowanie.txt', 'r');
				$wiersz = fgets ($plik, 255);
				fclose ($plik);
				
				$wyniki = split ("\|", $wiersz);
				$liczbaglosow = 0;
				
				for ($i=0; $i<count($wyniki); $i++) {
					$liczbaglosow += $wyniki [$i];
				}
			}
			
			print "<p> <b> Ankieta </b> </p>\n";
			print "<p> Oceń moją stronę</p> <table> \n";
			
			for (reset($glosowanie); $klucz=key($glosowanie); next($glosowanie)) {
				print "<tr> <td>".pos($glosowanie).":&nbsp;</td><td>";
				
				if ($liczbaglosow == 0) {
					$procent = 0;
				}
				else{
					$procent = (int)(($wyniki[$klucz-1]/$liczbaglosow)*100);
				}
				
				print "<img src=\"img/1.gif\" width='$procent' alt='Wyniki ankiety' height=\"10\" >";
				print "</td> <td align='right'> &nbsp;";
				printf ("%0.0f", $procent);
				print "%</td> </tr>";
			}
			print "</table>";
		} // koniec if (glosowano)
		else{
			print '<form action="cookie.php">';
			print "<p> <b> Ankieta </b> </p> \n";
			print "<p> Oceń moją stronę: </p> <table>";
			
			for (reset($glosowanie); $klucz=key($glosowanie); next($glosowanie)){
				print '<tr> <td> <input type = "radio" name = "quiz" value="'.$klucz.'"/>'.pos($glosowanie)."</td> </tr> \n";
			}
			
			print '</table> <input type="submit" value="Głosuj">';
			print '</form>';
		}
	} // koniec funkcji wyswietlanie
	
	
	if (isset($_COOKIE['glosowano'])) $glosowano = true;
	else $glosowano = false;
	
	if (!isset($_GET['quiz'])){
		wyswietlanie ($glosowanie, $glosowano);
	}

?>

COOKIE.PHP:

<?php

	$glosowanie = array ('6' => 'rewelacyjna', '5' => 'bardzo dobra', '4' => 'dobra', '3' => 'przeciętna', '2' => 'zła', '1' => 'beznadziejna');
	
	function glosowanie ($glosowanie, $quiz) {
		setcookie ('glosowano', '1');
		
		if (file_exists('dane/glosowanie.txt')){
			$plik = fopen ('dane/glosowanie.txt', 'r+');
			flock ($plik, 2);
			$wiersz = fgets ($plik, 255);
			$wyniki = split ("\|", $wiersz);
			fseek ($plik, 0);
		}
		else{
			$plik = fopen ('dane/glosowanie.txt', 'w+');
			flock ($plik,2);
		}
		
		for ($i=0; $i<count($glosowanie); $i++){
			if ($quiz == $i+1) $wyniki[$i]++;
			fputs ($plik, $wyniki [$i]);
			if ($i < count ($glosowanie)-1) fputs ($plik, '|');
		}
		flock ($plik, 3);
		fclose ($plik);
	} //koniec funkcji glosowanie.
	
	if (isset($_GET['quiz'])){
		glosowanie ($glosowanie, $_GET['quiz']);
	}
	
	header ("Location: index.php");


?>

To załóżmy taką serię zdarzeń: nikt jeszcze nie głosował i nie utworzyłam pliku glosowanie.txt w katalogu dane. 

Według mnie w tej sytuacji kod powinien zadziałać tak:

(wchodzę na index.php) Uruchamia się funkcja wyswietlanie - pierwszy if (if($glosowano)) się nie sprawdza, toteż przechodzimy do elsa i zostaje wyświetlony formularz z ankietą, która po wysłaniu przekierowuje nas do cookie.php.

I tu właśnie leży pies pogrzebany :D uruchamia się funkcja glosowanie i przy założeniu, że nie mamy utworzone pliku glosowanie.txt spełnia się else, który takowy tworzy a potem następuje pętla for, w której jak byk wykorzystana jest zmienna $WYNIKI, która została utworzona w if, który się nie spełnił (więc nie została stworzona?)

Czemu ten kod nie wyrzuca błędu o nieistniejącej zmiennej?

komentarz 16 marca 2017 przez efiku Szeryf (75,160 p.)
Ja polecam pisać kod nie patrząc jakie rozwiązania oferuje autor. ;) Może da się przerobić i zapisywać dane zserializowane?  Swoją drogą... W czym piszesz? Może nie będzie to problem pobrać NetBeans dla PHP i poczytać jak skonfigurować xdebug ? Komfort pracy i nauki wraz z normalnym debugowaniem √ !
komentarz 17 marca 2017 przez mia Nowicjusz (140 p.)
NetBeansa mam, ale na razie używałam tylko do html i css, a tak to na notepadzie++ jadę. Php ćwiczę od 3 miesięcy i nie za bardzo wiem po co by mi były te dane zserializowane, a nad tym debugem pewnie pomyślę.
komentarz 17 marca 2017 przez efiku Szeryf (75,160 p.)

To podepnij czym prędzej PHP'a pod NetBeansa ;) 
 

Php ćwiczę od 3 miesięcy i nie za bardzo wiem po co by mi były te dane zserializowane

Bierzesz sobie tablicę z odpowiedziami czy co Ty tam masz, serializujesz funkcja serialize() i zapisujesz do pliku,  odczyt pdobnie unserialize() + file_get_contents. 

 

a nad tym debugem pewnie pomyślę.

Pewnie, im prędzej tym lepiej.

1 odpowiedź

0 głosów
odpowiedź 16 marca 2017 przez Comandeer Guru (602,330 p.)

Przypisanie do $array[ $index ] automatycznie tworzy tablicę. Stąd nie ma błędu.

komentarz 16 marca 2017 przez mia Nowicjusz (140 p.)

Dziękuje za odpowiedź. 

Ale kiedy to przypisanie nastąpiło?

Co to w ogóle jest to $array[ $index ] ?

Czy mógł byś trochę bardziej wytłumaczyć ten mechanizm?

 

 

Podobne pytania

0 głosów
1 odpowiedź 492 wizyt
pytanie zadane 11 stycznia 2021 w PHP przez Głupia546 Nowicjusz (180 p.)
0 głosów
1 odpowiedź 135 wizyt
0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 2 listopada 2018 w PHP przez Krzysio4224 Obywatel (1,690 p.)

92,620 zapytań

141,474 odpowiedzi

319,815 komentarzy

62,005 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...