Странна работа със селект меню, не взима стойност

ludasam

Registered
Не ми взима стойността на $day от селект меню-то, на какво може да се дължи това? Тоест връща ми празен резултат. :)

PHP:
			if(isSet($_POST['submit'])) {
				$steamid = (empty($_POST['steamid'])) ? '' : clean($_POST['steamid']);
				$access  = (empty($_POST['access'])) ? '' : clean($_POST['access']);
				$flags = (empty($_POST['flags'])) ? '' : clean($_POST['flags']);
				$day   = (empty($_POST['day'])) ? '' : (int)$_POST['day'];
				$sms   = (empty($_POST['sms'])) ? '' : (int)$_POST['sms'];
				if(!$steamid || !$access || !$flags || !$day) {
					echo "Не си попълнил задължителните полета. $day";
				} else {
					echo "ОК";
				}
			} else {
			echo "
			<form method=\"POST\">
				<table>
				<tr>
					<td><label for=\"steamid\">Прякор/Steam/IP *:</label></td>
					<td><input type=\"text\" name=\"steamid\" id=\"steamid\" size=\"40\" /></td>
				</tr>
				<tr>
					<td><label for=\"access\">Достъп *:</label></td>
					<td><input type=\"text\" name=\"access\" id=\"access\" value=\"cdefhijkmou\" size=\"40\" /> (подразбиране \"cdefhijkmou\")</td>
				</tr>
				<tr>
					<td><label for=\"flags\">Флаг *:</label></td>
					<td><input type=\"text\" name=\"flags\" id=\"flags\" value=\"a\" size=\"40\" />  (подразбиране \"a\", за IP админ - \"de\")</td>
				</tr>
				<tr>
					<td><label for=\"day\">Дни *:</label></td>
					<td>
					<select name=\"day\" id=\"day\">
						<option value=\"0\">Завинаги</option>
						<option value=\"15\">15</option>
						<option value=\"30\">30</option>
					</select></td>
				</tr>
				<tr>
					<td><label for=\"sms\">SMS админ?:</label></td>
					<td><select name=\"sms\" id=\"sms\">
						<option value=\"1\">Не</option>
						<option value=\"0\">Да</option>
					</select></td>
				</tr>
				<tr>
					<td><input type=\"submit\" name=\"submit\" value=\"Добави\" /></td>
				</tr>
				</table>
			</form>";
			}
 
Не ми взима стойността на $day от селект меню-то,
А, недей така, взима я! Ама ти я променяш на празна стойност.

Сигурно и за sms ти връща празна стойност, но понеже не правиш проверка, не си забелязал. Грешката опира до типовете данни и колкото и РНР да е "умно" в това отношение, все пак трябва да внимаваш какво му подаваш и какво очакваш в резултат.

Ще ти обясня само за day, но същото се отнася и за sms.

От формуляра се вижда, че какъвто и да е избора на потребителя, винаги очакваш число, включително нула е приемлив резултат, което не е проблем, нека да е така.
HTML:
<select name="day" id="day">
<option value="0">Завинаги</option>
<option value="15">15</option>
<option value="30">30</option>
</select>

После обаче, след като се събмитне формуляра, правиш филтриране и проверка - похвално, много добра практика, но като си стигнал до day, просто си копирал кода от предишните полета, които са за валидиране на текст, с една малка промяна - кастваш до int. Отново много добре, но е трябвало да махнеш всичкия друг код. Ето това е напълно достатъчно:
PHP:
$day   = (int) $_POST['day'];

Защо обаче получаваш празна стойност?
PHP:
$day   = (empty($_POST['day'])) ? '' : (int)$_POST['day'];
Истината е, че този каст до int въобще не се изпълнява! РНР първо ще провери дали $_POST['day'] е празно. Според теб day е число, обаче за проверка използваш empty (дали е празно) което се използва за масиви и за променливи, съдържащи текст. $_POST['day'] съдържа нула и ти питаш empty "празно ли е $_POST['day'] ?", отговора е - да, празно е!

Когато използваш нула в контекста на текст, това е "празно".
Когато използваш нула в контекста на boolean, това е "false".

И да се върнем на проверката - ако е празно $_POST['day'], нека си остане празно, иначе каствай до int. Никога не се стига до кастването до int, $_POST['day'] удоволетворява условието и си стова празно, като дори заменяш нулата с празен текстов низ.

Първо каствай до int, така от самото начало си сигурен, че имаш цяло число. След това имаш един вариант да валидираш стойността. Стойността на $day ще бъде валидна ако е 0, 15 или 30

PHP:
$day = (int) $_POST['day'];
if(in_array($day, array(0, 15, 30))){
    //ok
}else{
    //невалидно
}
 
Хубаво, но когато нямам isset(); ще ми върне грешка и точно поради тази причина пиша кода така.

Вместо само: $day = (int) $_POST['day'];
 
Няма да ти върне грешка, защото след събмит на формуляра, $_POST['day'] винаги ще бъде "сетнато", винаги ще има стойност, виж си HTML кода.
 

Back
Горе