Autor Zpráva
verča
Profil *
Ahoj, uvádím kousek kódu, který používám pro vkládání údajů do db.
Kód mi funguje ale pouze za předpokladu že uživatel zadal foto. Jakmile je políčko pro fotky nevyplňené tak se mi nic neuloží.
Můžete mi prosím poradit jak to mám ošetřit aby se mi údaje ukládali i když nebude vyplňena žádná fotka?
Děkuji

     $last_id=mysql_insert_id();           
                              $vzkaz = addslashes($_POST["vzkaz"]);
                              $index = addslashes($_POST["index"]);
                                                            
                              for($i = 0; $i < count($_FILES['foto']['tmp_name']); $i++)
                                 {
                                  if (is_uploaded_file($_FILES['foto']['tmp_name'][$i]))
                                    {
                                      
                                     echo $_FILES['foto']['tmp_name'][$i], " ", $_FILES['foto']['name']$i], "<br>";
                                       $uploaddir = '../foto/predstaveni/';
                                       $uploadfile = $uploaddir . $_FILES['foto']['name'][$i];  
                                       $name = $_FILES['foto']['name'][$i]; 
                                       $pripona = explode(".", $name);
                                       $pripona = $pripona[count($pripona)-1];
                                       if (!in_array($pripona, array("jpg", "jpeg", "gif", "png", "bmp")))
                                          {
                                           exit ("nepovolena pripona, lze nahrat jen jpg, jpeg, gif, png, bmp<br>");
                                           continue;
                                          }
                                       if (move_uploaded_file($_FILES['foto']['tmp_name'][$i], $uploadfile)) 
                                          { 
                                           $vysledek=mysql_query("insert into tabulka (id, cas, vzkaz, index, foto) values (".$last_id.",".time().",'".$vzkaz."','".$index."','".$name."')");
                                          } 
                                       else 
                                          { 
                                          }
                                     }
                                   }
                               $path= 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['SCRIPT_NAME']) . '/predstaveni.php';
                               Header("Location:".$path);   
Medvídek
Profil
verča:
Protože vkládáš údaje do DB až po úspěšném nahrání fotky. Udělej to uplně mimo a jen si ověřuj, jestli někdo fotku poslal, nebo ne.
verča
Profil *
No ale když tich fotek bude několik, tak to přeci musím mít v tom cyklu aby se mi nahráli všechny řádky, nebo ne?

Kde jinde by ten dotaz měl být?
verča
Profil *
Tak na to ne a ne přijít jak zjistím zda byla nějaka fotka odeslána, abych podle toho udělala asi dva dotazy do db. Aspoň si teda myslím že tak by to mělo být. Když zjistím že nebyla vyplněna uložím to bez fotky, jinak s fotkou. Ale bohužel neumím zjistit zda byla či nebyla fotka odeslána, aniž bych to neměla v tom mém cyklu
for($i = 0; $i < count($_FILES['foto']['tmp_name']); $i++)
. Nějaký nápad?
lordfrikk
Profil
Trošku nechápu. Vkládaš třeba 3 fotky, takže v databázi pak máš 3 identické záznamy, které se liší pouze sloupcem foto?
Fergi
Profil
máš to kapku takový zmatenější ale když skus před to for na začátek přidat
if($_FILES["foto"]["name"]!=""){ Tvůj kód }else{echo"vyberte soubory!"}

tak by to snad mělo jet ;)
verča
Profil *
lordfrikk:
Přesně tak mám pak tři zaznámy které se liší pouze fotem. Chtěla jsem docílit toho aby prostě k jednomu záznamu někdo mohl přiřadit x fotek. Myslíš že bych to měla řešit jinak?
verča
Profil *
Fergi:
Tak to to asi pojede akorat kdyz nezadam zadnou fotku tak mi to hlasi hlasku v tom tvem kousku kodu ze nezna index foto
Notice: Undefined index: foto in ... on line
if($_FILES["foto"]["name"]!="") {
lordfrikk
Profil
verča:
Samozřejmě, toto řešení je špatné. Data budou např. v tabulce ZAZNAMY a fotky v tabulce FOTO. Tabulka ZAZNAMY bude mít tyto sloupce:

ID, CAS, VZKAZ, INDEX

Tabulka FOTO bude mít tyto sloupce:

ID, ZAZNAM_ID, FOTO

Záznamy uložíš hned a pokud budou nějaké fotky, tak je uložíš až poté. Tím vyřešíš všechny svoje problémy a navíc: 1) nebudeš mít zbytečný sloupec FOTO pro záznamy, které foto neobsahují 2) nebudeš mít duplicitní záznamy, které se budou lišit pouze fotem.

Pokud budeš potřebovat dále pomoc, stačí se zeptat :)
verča
Profil *
lordfrikk:
Jasně to bude asi fakt lepší řeěení, akorát abych to celé pochopila:
1. Dvě tabulky to je jasné.
2. Musí být spolu nějak propojeny, napadá mě že ID z první tabulky by mělo být stejné jako ZAZNAM_ID je to tak?
3. Jak toto id jednoduše zjistit?
lordfrikk
Profil
verča:
2. Přesně tak.
3. Nerozumím (které id?)
verča
Profil *
lordfrikk:
No tu bunku Zaznam ID, ta by mela byt pro ty obrazky, ktere patri k danemu clanku stejna ne? a měla by mít hodnotu ID vzkazu abych vedela ke komu co patri ne?
verča
Profil *
lordfrikk:
Tak jsem to vyřešila takto, myslíš si že je to ok?

   $last_id=mysql_insert_id();           
                              $vzkaz = addslashes($_POST["editor2"]);
                              $poradi = addslashes($_POST["poradi"]); 
                              $vysledek=mysql_query("insert into predstaveni (id, cas, vzkaz, poradi) values (".$last_id.",".time().",'".$vzkaz."','".$poradi."')");

                              $vysledek=mysql_query("select id from predstaveni where poradi = $poradi", $link) or die('Error: '.mysql_error ());
                              while ($zaznam=MySQL_Fetch_Array($vysledek)) 
                              $zaznam_id = $zaznam['id'];
                                                                        
                              for($i = 0; $i < count($_FILES['foto']['tmp_name']); $i++)
                                 {  
                                 $druh = addslashes($_POST["druh"]);
                                       
                                 echo $_FILES['foto']['tmp_name'][$i], " ", $_FILES['foto']['name'][$i], "<br>"; // vsechna potrebna pole
                                  if (is_uploaded_file($_FILES['foto']['tmp_name'][$i]))
                                    {
                                      
                                     echo $_FILES['foto']['tmp_name'][$i], " ", $_FILES['foto']['name'][$i], "<br>"; // vsechna potrebna pole
                                       $uploaddir = '../foto/predstaveni/'; // Relative path under webroot 
                                       $uploadfile = $uploaddir . $_FILES['foto']['name'][$i];  //funkce basename je zbytečná, při uploadu se nepředává cesta
                                       $name = $_FILES['foto']['name'][$i]; 
                                       $pripona = explode(".", $name);
                                       $pripona = $pripona[count($pripona)-1];
                                       if (!in_array($pripona, array("jpg", "jpeg", "gif", "png", "bmp")))
                                          {
                                           exit ("nepovolena pripona, lze nahrat jen jpg, jpeg, gif, png, bmp<br>");
                                           continue;
                                          }
                                       if (move_uploaded_file($_FILES['foto']['tmp_name'][$i], $uploadfile)) 
                                          { 
                                           $vysledek=mysql_query("insert into foto (id, zaznam_id, foto, druh) values (".$last_id.",'".$zaznam_id."','".$name."','".$druh."')");
                                          } 
                                       else 
                                          { 
                                           
                                            
                                          }   
                                     }
                                         
                                       
                                    } 
                               $path= 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['SCRIPT_NAME']) . '/predstaveni.php';
                               Header("Location:".$path);   
lordfrikk
Profil
Ano, takhle jsem to myslel, až na několik detailů.¨

while ($zaznam=MySQL_Fetch_Array($vysledek)) 
$zaznam_id = $zaznam['id'];


Naprosto zbytečné, ID záznamu máš uloženo v $last_id, tudíž stačí:

$zaznam_id = $last_id;


U ukládání fotek používáš stále $last_id. Pokud budeš mít více než jednu fotku, tak ti to vyhodí chybu (každé ID musí být unikátní). Nechápu, proč to ID vkládáš ručně přes mysql_insert_id(); Stačí pouze, abys tabulku upravila tak, aby měla AUTO_INCREMENT, pak se bude ID automaticky vyplňovat +1 větší než to předchozí, takže ho ze svých dotazů můžeš ůplně odstranit. Takhle to pak bude vypadat:

$vysledek=mysql_query("insert into foto (zaznam_id, foto, druh) values ('".$zaznam_id."','".$name."','".$druh."')");


Navíc mysql_insert_id(); ti vrací hodnotu ID z posledního dotazu, to znamená že buď při vkládání nebude pouze $last_id ale $last_id+1, nebo si uprav i tabulku predstaveni tak, aby měla AUTO_INCREMENT a nemusíš se o to vůbec starat.

Nejsem si jistý, jestli to vůbec s tím, jak máš to $last_id teď, může fungovat.
verča
Profil *
lordfrikk:
Tak jak jsem to měla mi to fungovala, ted kdyz to zmenim jak jsi psal tak v tabulce foto mám zaznam_id roven 0
lordfrikk
Profil
Takhle by to mělo fungovat, ale MUSÍŠ mít ty tabulky s AUTO_INCREMENT.


$vzkaz = addslashes($_POST["editor2"]);
$poradi = addslashes($_POST["poradi"]); 
$vysledek=mysql_query("insert into predstaveni (cas, vzkaz, poradi) values (".time().",'".$vzkaz."','".$poradi."')");

$zaznam_id = mysql_insert_id();
										
for($i = 0; $i < count($_FILES['foto']['tmp_name']); $i++)
 {  
 $druh = addslashes($_POST["druh"]);
	   
 echo $_FILES['foto']['tmp_name'][$i], " ", $_FILES['foto']['name'][$i], "<br>"; // vsechna potrebna pole
  if (is_uploaded_file($_FILES['foto']['tmp_name'][$i]))
	{
	  
	 echo $_FILES['foto']['tmp_name'][$i], " ", $_FILES['foto']['name'][$i], "<br>"; // vsechna potrebna pole
	   $uploaddir = '../foto/predstaveni/'; // Relative path under webroot 
	   $uploadfile = $uploaddir . $_FILES['foto']['name'][$i];  //funkce basename je zbytečná, při uploadu se nepředává cesta
	   $name = $_FILES['foto']['name'][$i]; 
	   $pripona = explode(".", $name);
	   $pripona = $pripona[count($pripona)-1];
	   if (!in_array($pripona, array("jpg", "jpeg", "gif", "png", "bmp")))
		  {
		   exit ("nepovolena pripona, lze nahrat jen jpg, jpeg, gif, png, bmp<br>");
		   continue;
		  }
	   if (move_uploaded_file($_FILES['foto']['tmp_name'][$i], $uploadfile)) 
		  { 
		   $vysledek=mysql_query("insert into foto (zaznam_id, foto, druh) values ('".$zaznam_id."','".$name."','".$druh."')");
		  } 
	   else 
		  { 
		   
			
		  }   
	 }	   
	} 
$path= 'http://' . $_SERVER['SERVER_NAME'] . dirname($_SERVER['SCRIPT_NAME']) . '/predstaveni.php';
Header("Location:".$path);   

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