Autor Zpráva
Rellik
Profil
Potřebuju poradit:
Pro manželku jakožto učitelku vytvářím generátor matematických příkladů. Momentálně to funguje, ale potřebuju aby se zkontrolovaly odesílané data aby bylo možné vložit pouze čísla. Zkoušel sem to pomocí if_numeric() , ale asi dělám něco špatně. Nechci každou hodnotu kontrolovat zvlášť tak sem to dal do jedné podmínky ale tak to bohužel nefunguje.
$prvni_od = $_POST['prvni_od'];
$prvni_do = $_POST['prvni_do'];
$druhe_od = $_POST['druhe_od'];
$druhe_do = $_POST['druhe_do'];
$operace = $_POST['operace'];
if(is_numeric($prvni_od && $prvni_do && $druhe_od && $druhe_do))
	{....

Jde to udělat abych to nemusel kontrolovat každé zvlášť?

Pak bych měl složitější dotaz a to jak vyřešit to aby se náhodou nevygenerovaly naráz třeba dva stejné příklady. určitě to bude chtít asi uložit do array a pak to cyklem zkontrolovat a ke stejné čísla nějak změnit, ale momentálně mě nenapadá jak to provést. :-/
Celý kód:
<form method="post" title="priklady" action="?post=ok">
<table id="vstup">
	<tr>
		<td class="zadani">Počet příkladů:</td>
		<td><input name="pocet" size="10" value="20" /></td>
		<td></td>
		<td></td>
	</tr>
	<tr>
		<td></td>
		<td class="zadani">Min</td>
		<td class="zadani">Max</td>
		<td class="zadani">Počet <br /> desetiných<br /> míst</td>
	</tr>
	<tr>
		<td class="zadani">První číslo:</td>
		<td><input name="prvni_od" size="10" /></td>
		<td><input name="prvni_do" size="10" /></td>
		<td><select size="1" name="pocet_desetin">
			 <option selected="selected" value="0">0&nbsp;&nbsp;</option>
 			<option value="1">1&nbsp;&nbsp;</option>
			<option value="2">2&nbsp;&nbsp;</option>
			<option value="3">3&nbsp;&nbsp;</option>
			</select></td>
	</tr>
	<tr>
		<td class="zadani">Operace:</td>
		<td><input name="operace" type="radio" value="+" /> + 
			<input name="operace" type="radio" value="-" /> - 
			<input name="operace" type="radio" value="/" /> : 
			<input name="operace" type="radio" value="*" /> x 
		</td>
		<td></td>
		<td></td>
	</tr>
	<tr>
		<td class="zadani">Druhé číslo:</td>
		<td><input name="druhe_od" size="10" /></td>
		<td><input name="druhe_do" size="10" /></td>
		<td><select size="1" name="pocet_desetin_x">
			 <option selected="selected" value="0">0&nbsp;&nbsp;</option>
 			<option value="1">1&nbsp;&nbsp;</option>
			<option value="2">2&nbsp;&nbsp;</option>
			<option value="3">3&nbsp;&nbsp;</option>
			</select></td>
	</tr>
	<tr>
		<td></td>
		<td></td>
		<td></td>
		<td><input name="send" type="submit" value="Vygenerovat" /></td>
	</tr>
</table>
</form>
		</div> <!-- menu konec -->

			<div id="text"> <!-- text -->
<table id="vypis">
	<tr>
<?php
$pocet = $_POST['pocet'];
$pocet_desetin = $_POST['pocet_desetin'];
$pocet_desetin_x = $_POST['pocet_desetin_x'];
$prvni_od = $_POST['prvni_od'];
$prvni_do = $_POST['prvni_do'];
$druhe_od = $_POST['druhe_od'];
$druhe_do = $_POST['druhe_do'];
$operace = $_POST['operace'];
$send = $_GET['post'];
$refer = $_GET['refer'];

if($send == "ok") 
{
if($prvni_od && $prvni_do && $druhe_od && $druhe_do)
	{
		if($operace)
	{
		for($i=1;$i<=$pocet;$i++)
				{
						if($pocet_desetin)
							{
								if($pocet_desetin == "1")
								{
								$desetiny = ".".rand(1,9);
								}
								if($pocet_desetin == "2")
								{
								$desetiny = ".".rand(11,99);
								}
								if($pocet_desetin == "3")
								{
								$desetiny = ".".rand(111,999);
								}
							}
							else $desetiny = "";
							
						if($pocet_desetin_x)
							{	
							if($pocet_desetin_x == "1")
								{
								$desetiny_x = ".".rand(1,9);
								}
								if($pocet_desetin_x == "2")
								{
								$desetiny_x = ".".rand(11,99);
								}
								if($pocet_desetin_x == "3")
								{
								$desetiny_x = ".".rand(111,999);
								}
							}
							else $desetiny_x = "";
							
					$first = rand($prvni_od,$prvni_do).$desetiny;
					$last = rand($druhe_od,$druhe_do).$desetiny_x;
					
				$val=$i;
				if($i<10)
					$val='0'.$i;
					
				$vypis = "\t\t<td>".$first.$operace.$last." =___";
				$vypis = str_replace("/",":",$vypis);
				$vypis = str_replace("*","x",$vypis);
				$vypis = str_replace(".",",",$vypis);
					echo $vypis;
					
				
					if($operace == "-")
						{
					 		echo "<span class=\"help\">".($first-$last)."</span></td>\n";
					 	}
					if($operace == "/")
						{
					 		echo "<span class=\"help\">".($first/$last)."</span></td>\n";
					 	}
					if($operace == "*")
						{
					 		echo "<span class=\"help\">".($first*$last)."</span></td>\n";
					 	}
					if($operace == "+")
						{
							echo "<span class=\"help\">".($first+$last)."</span></td>\n";
						}
						
					if(($val%4)<"1")
						{
						echo "\t</tr><tr>\n";
					}
				}echo "<span class=\"help\">Stránku můžete vytisknout přes místní nabídku. Vytisknou se pouze příklady. (bez výsledků)</span>";
		} else { echo "Nebyla zvolena operace!"; }				
	}
	else { echo "Nebyly vyplněny všechny údaje nebo byly zadány ve špatném tvaru - musí to být jen čísla! <br />Zadejte je prosím znovu.";}
}
else echo "\t\t\t Do políček vyplňte kolik požadujete vygenerovat příkladů, v jakém rozmezí 
					se mají pohybovat první a druhé číslo, kolik má mít které číslo desetinných 
					míst a jaká operace má být provedena.<br />
				\t\t <b>Může se stát že se některé vygenerované příklady opakují. V tomto případě 
			zmáčkněte klávesu F5 a potvrďte odeslání dat, tím se vygenerují nové příklady</b>";

?>
	</tr>
</table>

Toto řešení mám hotové už asi dva roky, ale až teď mě napadlo to trochu vylepšit...
Díky za každou pomoc. Možná bude stačit jen pomoct s prvním dotazem, to druhé je složitější a nechci nikoho moc zatěžovat. :)

EDIT: hotová ukázka: http://veletiny.cz/mat/
Darker
Profil
Ad 1.
Nemůžeš použít tu konstrukci, cos předvedl, skus si do ní za proměnné dosadit:
if(is_numeric("ble"&&21&&30)) //sotva bude true.

Funkce dostane false (popř. true) a to není numerická proměnná.
Musíš použít foreach pro superglobální $_POST. S tím že do cyklu foreach zařadíš výjimky.

Ad 2.
Ukládal bych příklady do pole a pak aplikoval funkci in_array.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0