Notice: Undefined index: select in - walidacja select PHP

0

Witam, mam problem z walidacją pola select. Pole domyślnie posiada zablokowaną wartość "Select..." aby nie przesyłać pustej wartości. Normalnie w takim przypadku użyłbym funkcji isset() i sprawdził czy istnieje taka zmienna. I to zawsze działało jak pisałem kod strukturalny. Natomiast nie wiem jak użyć tego pisząc obiektowo. Przeglądając Internet natrafiłem na coś takiego jak: "Null Coalesce Operator". Niestety po zastosowaniu go nadal jest tak samo, tzn. interpreter rzuca mi notatką w stylu:

Notice: Undefined index: select in

Ma ktoś jak poprawić poniższy kod gdy nie wybiorę nic z pola select wyświetlił się komunikat o błędzie?
Załączam cały przykładowy kod:
Plik widoku:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title>Test3</title>
</head>
<body>
	<form action="test3.php" method="post">
		<input type="text" name="input">
		<select name="select">
			<option selected="selected" disabled="disabled">Select...</option>
			<option>Apple</option>
			<option>Raspberry</option>
			<option>Banana</option>
			<option>Pineaple</option>
		</select>
		<button type="submit" name="button">Send</button>
	</form>
</body>
</html>

Plik modelu(klasa):

<?php
	class Test {
	private $input, $select;

	public function setInput($input) {
		return $this->input = $input;
	}
	public  function setSelect($select) {
		return $this->select = $select;
	}
	public function getInput() {
		return $this->input;
	}
	public function getSelect() {
		return $this->select;
	}
	public function doFilter() {
		$this->input = trim($this->input);
		$this->select = trim($this->select);
	}

	public function doValid() {
		$this->doFilter();
		$errors = array();
		if (strlen($this->input) == 0) {
			$errors[] = 'Empty input';
		}
		$select = $this->select ?? $errors[] = 'Empty select';
		var_dump($select);
		if (count($errors)) {
			foreach ($errors as $showErrors) {
				echo '<div class="error">'.$showErrors.'</div>';
				//return false;
			}
		}
	}
}

Wywołanie(kontroller):

<?php
       $test = new Test;
	if ($_SERVER["REQUEST_METHOD"] == "POST") {
		$test->setInput($_POST['input']);
		$test->setSelect($_POST['select']);
		if ($test->doValid()) {
			//if ($test->addCode()) {
				# If valid is true - send query and information
				//echo '<p class="success">Correctyl added new code.</p>';
			//}
		}
		echo '
			<p>Input value: '.$test->getInput().'</p>
			<p>List value: '.$test->getSelect().'</p>
		';
	}
?>
0

A czy w żądaniu przesyłasz taką zmienną? ($_POST['select'])? Bo jeśli nie to notice jest jak najbardziej w porządku.
Popatrz jak pewne rzeczy są zrobione we frameworkach, a do obecnego kodu polecam dopisać metodę getParam($paramName, $default = null), za pomocą której będzie pobierany paramter.

Jeśli już chcesz używasz tego operatora musisz go używać bezpośrednio na elemencie z tablicy post -> $_POST['input'] ?? null (przyznam się że nie korzystałem jeszcze z tego operatora - wersja php mnie blokuje, ale powinno być git)

Podałeś nam ucięty notice, ale zakładam że występuje on w Twoim kontrolerze.

0

A czy w żądaniu przesyłasz taką zmienną? ($_POST['select'])? Bo jeśli nie to notice jest jak najbardziej w porządku.

Tak w kontrollerze:

$test->setSelect($_POST['select']);

Co do całego notice to podaję:

Notice: Undefined index: select in /opt/lampp/htdocs/mvc3/controller/admin/test3.php on line 71

Odnosi się on do kontrollera, czyli do tego:

$test->setSelect($_POST['select']);

Mógłbyś powiedzieć coś więcej na temat podanego przez Ciebie rozwiązania(wykorzystania metody getParam)? Przyznam się szczerze, ze nie dawno zacząłem próbować coś pisać obiektowo, zresztą to pewnie widać po moim kodzie.

0

No to tak - próbujesz się odwołać do elementu tablicy $_POST o nazwie select - element ten o ile nie został przesłany w żądaniu (a nie jest, bo w widoku jest disabled). Odwołanie do nieistniejącego elementu powoduje rzucenie notice'm.

Metoda getParam - może znajdować się w kontrolerze (normalnie znajduje się zazwyczaj w obiektach klasy Request lub pochodnych) - i jako pierwszy parametr niech przyjmuje string, a drugi to wartość domyślna
Metoda ta użyta np tak getParam('isAdultUser', false) - powinna sprawdzać parametr isAdultUser z tablicy $_POST, tam może np trim'a machnąć o ile nie koliduje to z założeniami projektu i wewnątrz tej metody operując na tablicy post uzywasz operatora isset (nie wiem czy ?? chwyta nieistniejące elementy tablicy) i zwracasz wynik, jeśli wartosc z posta nie istnieje, zwracasz drugi podany parametr, który domyślnie powinien być nullem.

To że od niedawna zacząłeś - to nie jest problem, ważne żebyś ucząc się robił to dobrze :)

0

Coś napisałem. Trochę mi to zajęło zanim to wszystko przekminiłem. Stworzyłem sobie to na nowym formularzu. Ogólnie działa tylko mam kilka pytań:
-czy o takie coś Ci chodziło i czy jest dobrze napisane?
-dlaczego metoda getParam() ma przyjmować jako drugi parametr false i co on w zasadzie zmienia?


<form action="test4.php" method="post">
	<select name="select">
		<option selected="selected" disabled="disabled">Select...</option>
		<option>Apple</option>
		<option>Raspberry</option>
		<option>Banana</option>
		<option>Pineaple</option>
	</select>
	<button type="submit" name="button">Send</button>
</form>
<?php
	class Test4 {
		public $paramName, $default;
		public function getParam($paramName, $default = null) {
			$this->paramName = $paramName;
			$this->default = $default;
			if (isset($_POST[$this->paramName])) {
				$this->paramName = trim($this->paramName);
				var_dump($_POST[$this->paramName]);
			}
			return $this;
		}
	}
?>
<?php $test4 = new Test4; if ($_SERVER["REQUEST_METHOD"] == "POST") { $test4->getParam('select', false); var_dump($test4); } ?>
0

--------------------------------------------------------Edit-------------------------------------------------------------------
Niby to co powyżej działa, natomiast próbuję wartość ze zmiennej $_POST przenieść do gettera aby późnej użyć jej za pomocą $this. Ogólnie kod trochę pozmieniałem. Obecnie po wybraniu owocu metoda getProperty() pobiera mi odpowiednia wartość z listy, natomiast interpreter "pluje" mi notatką, że niezdefiniowałem właściwości.

You must select fruit.
Notice: Undefined property: Test4::$getParamName in /opt/lampp/htdocs/mvc3/controller/admin/test4.php on line 30
NULL

Błąd wskazuje na linijkę z metody getProperty():

return $this->getParamName;
<?php
class Test4 {
		public $paramName, $default;
		public function getParamList($paramName, $default = null) {
			$this->paramName = $paramName;
			$this->default = $default;
			if (isset($_POST[$this->paramName])) {
				$this->paramName = trim($this->paramName);
				//var_dump($_POST[$this->paramName]);
				//echo $_POST[$this->paramName];
				$this->getParamName = $_POST[$this->paramName];
			}
			if (isset($_POST[$this->paramName]) == 0) {
				echo 'You must select fruit.';
			}
			var_dump($this);
			return $this;
		}
		public function getProperty() {
			return $this->getParamName;
		}
	}
	
	$test4 = new Test4;
	if ($_SERVER["REQUEST_METHOD"] == "POST") {
		$test4->getParamList('select', false);
		var_dump($test4->getProperty());
	}
?>

Nie bardzo rozumem, bo to jest tylko wymiana informacji między getterem a setterem. Mogę w ogóle w taki sposób przekazać tą wartość?

0

No masz źly kod :) o co chodziło mi z drugim parametrem? Funkcja getParam zwraca Ci to co siedzi w tablicy Post, załóżmy że chcesz od użytkownika pobrać płeć i masz 3 statusy. Mężczyzna, Kobieta, Nie Podano. M to 1, K to 2, NP to 3. Użytkownik który nie poda płci załóżmy że nie wybrał nic z selekta (domyślna wartość pusta z tekstem “wybierz plec"). Używając funkcji getParam ('gender', 3) z automatu ustawiasz nie podano, jeśli użytkownik sam to wybierze to też będzie poprawnie. Domyślnie jest null, bo i jak nie ma indeksu w tablicy to i wartości będą nullami

W metodzie getParam nie ustawiaj nic w klasie, ta metoda ma tylko zwracac wartość ew lekko ja filtrować (np trim jeszcze ujdzie). Błąd masz dlatego że odwołujesz się do niejstniejacego składnika klasy. Nie masz tam przecież public getParamName

Metoda getParam w tym przypadku to nie jest typowy getter

1 użytkowników online, w tym zalogowanych: 0, gości: 1