Autor Zpráva
kokolino
Profil *
čawte
pri mojom jednoduchom formuláry som narazil na problém, ktorý spočiva v tomto :
ak vyplním všetky položky okrem poslednej a dám odoslať formulár vypíše sa mi chyba, že posledná položka nebola vyplnená čo samozrejme očakávam.
Avšak tieź som očakával, že ostatné položky, ktoré som vyplnil ostatnú vyplnené.
Vyplnený ostal len názov , farba zo selektu a obrazok ostali prázdne tak sa chcem spýtať ako zabezpečit aby aj tieto dve položky ostali vyplnené. Hlavne ten obrázok aby som stále nemusel prehladávať adresáre skade vyberám daný obrázok.


<?php
$nazov=$_POST['nazov'];
$farba=$_POST['farba'];
$obrazok=$_POST['obrazok'];
$obrazok_alt=$_POST['obrazok_alt'];

$nazov= htmlspecialchars($nazov);
$farba= htmlspecialchars($farba);
$obrazok_alt= htmlspecialchars($obrazok_alt);


$obrazok_name = ($_FILES["obrazok"]["name"]); 
$obrazok_type = ($_FILES["obrazok"]["type"]); 
$obrazok_tmp = ($_FILES["obrazok"]["tmp_name"]); 


if ($_POST["poslane"]){
if($nazov=="" or $farba=="---------------" or $obrazok_alt=="" )
	{$a=1;} //hlaska 5
else {
	echo"$nazov,$farba,$obrazok_name,$obrazok_alt";}
  
$chyba = array();
	if ($nazov=="")
		$chyba[1] = "Nezadali ste nazov";
	if ($farba=="---------------")
		$chyba[2] = "Nevybrali ste farbu";
	if ($obrazok=="")
		$chyba[3] = "Nezadali ste ziadny obrazok";
	if($obrazok_alt=="")
		$chyba[4]= "Nezadali ste popis obrazka";
	if ($a==1)
		$chyba[5]="Opravte prosím chyby a odošlite formulár znovu";		
}
   if (!$odeslano || $chyba)
{

?>
<h3>Pridavanie noveho tovaru</h3>
<center>
<?php
if ($chyba){	
	if(!empty($chyba[5])) echo '<h4>'.$chyba[5].'</h4><br>'; }
?>
</center>
<form action="index.php?id=pridaj_tovar" method="post" enctype="multipart/form-data">
<table id="tovar">
<tr><td><label for="nazov">*nazov:</label></td><td><input type="text" name="nazov" id="nazov" value="<?php echo $nazov ?>"></td><td>&nbsp;&nbsp;<?php if(!empty($chyba[1])) echo '<strong>'.$chyba[1].'</strong>'; ?></td></tr>
<tr><td><label for="farba">*farba:</label></td>
<td><?php
	require "db.php"; 
	$vyber_farbu=mysql_query($q1="select id_farby,farba  from farba  order by id_farby ") or print ("chyba <br />".$q1."<br />".mysql_error());
		echo"<select name='farba'>";
		echo"<option selected value='---------------'>---------------</option>";
	while($row1=mysql_fetch_array($vyber_farbu)){	
		echo "<option value=".htmlspecialchars($row1[id_farby]).">".htmlspecialchars($row1[farba])."</option>";}	
	echo"</select>";
	?>
</td><td>&nbsp;&nbsp;<?php if(!empty($chyba[2])) echo '<strong>'.$chyba[2].'</strong>'; ?></td></tr>
<tr><td><label for="obrazok">*obrazok:</label></td><td><input type="file" name="obrazok" id="obrazok" value="<?php echo $obrazok ?>"></td><td>&nbsp;&nbsp;<?php if(!empty($chyba[3])) echo '<strong>'.$chyba[3].'</strong>'; ?></td></tr>
<tr><td><label for="obrazok_alt">*popis obrazka:</label></td><td><input type="text" name="obrazok_alt"  id="obrazok_alt" value="<?php echo $obrazok_alt ?>"></td><td>&nbsp;&nbsp;<?php if(!empty($chyba[4])) echo '<strong>'.$chyba[4].'</strong>'; ?></td></tr>
<tr><td>&nbsp;</td><td><input type ="submit" name="poslano" value="pridat tovar"></td><td><input type ="hidden" name="poslane" value="Odeslat"></td></tr>
</table>
<h3>Políčka  oznacene<strong> *</strong> je nutné vyplnit</h3>
</form>

<?php 
}
?>
Keeehi
Profil
<input type="file" name="obrazok" id="obrazok" value="<?php echo $obrazok; ?>">
1) Chybí Vám tam středník.
2) Z bezpečnostního hlediska to fungovat nebude. Představte si, že bych vytvořil stránku, dal tam input file a value mu vyplnil třeba takto: "C:\Program Files\….". Jelikož je většinou u programů předvybraný adresář pro instalaci, dá se poměrně slušně odhadnout třeba cesta k souboru s uloženými hesly. Nakonec není nic jednoduššího, celý formulář skrýt a po načtení stránky automaticky javascriptem odeslat. Pokud by tedy šlo přednastavit value u input file, mohl by si prakticky kdokoliv stáhnout cokoliv od vás z počítače.

K tomu selectu:
Pokud option má být předvybraný, musít mít atribut selected="selected" (nebo zkráceně jen selected). To však v víte, neboť ho v scriptu používáte. Teď akorát stačí tento řetězec přidat správnému optionu.
"<option value=".htmlspecialchars($row1["id_farby"]).($farba==$row1["id_farby"]?" selected=\"selected\"":"").">"

jinak ještě máte chyby:
$row1["id_farby"];
$row1["farba"];
Tori
Profil
K tomu inputu:
Můžete to udělat tak, že při špatně vyplněném formuláři se soubor uloží do nějaké dočasné složky a bude mít timestamp jako název. Ve formuláři se buď zobrazí input file, anebo skryté pole s názvem uloženého souboru. Dtto při ukládání se buď přesune již uložený soubor, nebo se zpracuje ten z $_FILES. Na začátku celého skriptu by ještě mohlo být promazávání příliš starých souborů.
Alphard
Profil
Tori:
a bude mít timestamp jako název
Příliš velká pravděpodobnost, že nastanou problémy při paralelním přístupu. Když už toto řešení, název by musel být poskládán ještě alespoň z nějakého identifikátoru uživatele.

Jednodušším řešením by mohlo být doplnit javascriptotou validaci. Většině lidí to bude fungovat a ti ostatní prostě najdou obrázek 2x.
Tori
Profil
Alphard:
Myslela jsem microtime(), ale máte pravdu, že při větším počtu uživatelů je to nespolehlivé.
kokolino
Profil *
ďakujem za všetky postrehy
ten input pre file nechám radšej takto nech si užívateľ vybere obrázok 2 krát a nebudem tam nastavovať value
Alphard:
Vaše riešenie je pre mňa "nemožne" pretože javascript bohužial neovládam a chystám sa ho učiť až, keď zvládnem základy php.
Keeehi:
čo sa týka toho stredníka a tých úvodzoviek vôbec som si to nevšimol, fungovalo to a nehlásilo mi to ani žiadny error,
takže ďakujem za upozornenie už som si to opravil.

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