Dejme tomu, že dělám výpis faktur (tabulka třeba s 20ti řádky a 5ti sloupci) a v každém řádku je tedy 5 inputů type=text (celkem 100 inputů).
Každý input ve stejném sloupci má stejný atrubut NAME, s tím rozdílem, že za něj připíšu vždy 1, 2, 3 ... aby měl každý svou unikátnost. Je to moc zdlouhavý, takž jsem z toho udělal pole:
<input type=text name=polozka[]>
Když to insertuju do databáze, tak to odděluju hvezdičkou:
for($x = 1; $x < count($polozka); $x++) { $polozka[$x]; }
mysql_query("insert into ...
... ... ...
'polozka[0]*polozka[1]*polozka[2]*polozka[3]* ... atd. až polozka[20]*'
... ... ...
Když to pak tahám z db, tak dám:
explode("*" , $polozka);
________
Tohle všechno funguje, ale v čem mám problém?
Že to vypisování ...
'polozka[0]*polozka[1]*polozka[2]*polozka[3]* ... atd. až polozka[20]*'
... mi přijde moc zdlouhavý a chtěl jsem do toho dát cyklus for nějak takhle:
'for($x = 1; $x < count($polozka); $x++) { $polozka[$x]; }',
ale to hlásí hned error
Doufám, že mě někdo pochopil, jak jsem to myslel
Díky moc, Petr
Sorry za nepřesnosti:
Ne:
for($x = 1; $x < count($polozka); $x++) { $polozka[$x]; }
ale:
for($x = 0; $x < count($polozka); $x++) { $polozka[$x]; }
a místo:
'polozka[0]*polozka[1]*polozka[2]*polozka[3]* ... atd. až polozka[20]*'
tohle:
'$polozka[0]*$polozka[1]*$polozka[2]*$polozka[3]* ... atd. až $polozka[20]*'
Trochu tomu nerozumim.. Nemohl bys to popsat presneji? A hlavne s presnymi vypisy skriptu?
Čekal jsem, že se ozveš a díky Ti moc.
Můžu ti poslat celej script, ale zkusím to ještě víc upřesnit:
Zkrátka tabulka faktury, kde se pod sebou opakujou stejný inputy při vkládání:
... hele víš co, pošlu ti na email celej ten skript a taky odkaz, aby si viděl jak to vypadá
Díky, Petr
A co ti na tom vlastne nejde?
Tobe jde o to ulehcit si cyklem skladani toho SQL dotazu na vkladani hodnot?
Jo, správně, místo toho:
'$polozka[0]*$polozka[1]*$polozka[2]*$polozka[3]* ... atd. až $polozka[20]*'
tam šoupnout ten for, protože jestli si koukal na ten skript, nezdá se ti to zbytečně zdlouhavý ?
Petr
Tak takhle?
$query_begin = "insert into faktura values(
'$id_fakt',
'$pocet_polozek',
'$ico',
'$dic',
'$den_vyst',
'$mesic_vyst',
'$rok_vyst',
'$den_pln',
'$mesic_pln',
'$rok_pln',
'$den_splat',
'$mesic_splat',
'$rok_splat',
'$c_faktury',
'$banka',
'$c_batch',
'$c_uctu',
'$forma',";
for($x = 0; $x < count($polozka); $x++)
{
if ($x==0) $query_middle .= "'";
if ($x==19) $query_middle .= "$"."c_zbozi[".$x."]',";
$query_middle .= "$"."c_zbozi[".$x."]*";
$query_middle .= "$"."kusy[".$x."]*";
$query_middle .= "$"."zbozi[".$x."]*";
atd.
}
Videl bych to takto, ale je to jen napad..
No a na zaver samozrejme vse slozit.. akorat z te druhe podminky odstranit c_zbozi[".$x."] a dat ji az na konec, aby se dotaz spravne delil.. I kdyz netusim, jestli tohle pujde..
No jo, ale jak to šoupneš do toho insertu, aby to vlastně bylo uvnitř toho dotazu (uvnitř fce mysql_query(), aby byl ten for) ?
... a aby to nenahlásilo erorr ?
Vis tady je problem v tom, ze chces nejenze skladat sql dotaz (to neni nic neobvyklyho), ale i php kod (nazev promenne) a to je imho kamen urazu a asi to jen tak nepujde...
Je to vlastně jedno v mým případě (když půjde o 20 řádků), viděl si to sám. Vše mi funguje. Dělám to pro přítelkyni. Ale jen by mě zajímalo, až si vymyslí příště něco většího (třeba 100 řádků), tak jestli by to šlo zjednodušit, tak aby se člověk z toho psaní nepo*ral.
Stejně díky za snahu, Petr
Zrejme asi budes muset.. Nu co, ucel sveti prostredky..
když jste u toho..... Jde jedním INSERTem vložit do databaze více řádků?
Možná taky přes cyklus for, ale nevím:
<?
for($x = 1; $x <=5; $x++):
mysql_query("insert into tabulka values('$x','$blabla','$blabla','$blabla')");
endfor;
?>
Petr
tento dotaz by mě taky zajímal. Pokud vytvářím relační databázi a v jedné tabulce uchovávám např. data o knize a ve druhé zařazení knihy do kategorií (např. naučná, román), přičemž jedna kniha může mít více kategorií - tedy jedna kniha má více řádků v tabulkce tb_kategorie. Vůbec nevím, jak elegantně vložit nový záznam.
Vložím insertem informace o knize do tabulky např. tb_knihy. nyní však potřebuji jedním dotazem do tabulky tb_kategorie vložit dva řádky s hodnotami:
id knihy | naučná
id knihy | román
přičemž id_knihy je generovaná jako automatické číslo z prvního mysql příkazu insert.
- jde to udělat jedním dotazem, nebo musím vytviřt cyklus a za sebou vložit dva řádky?
- jak zjistím id právě zadané knihy, když id (tj auto číslo) určuje databáze a vložení probíhá v jednom scriptu?
možná je to chaotický, ale odpověď jsem tady ani nikde nenašel (stačil by odkaz na příklady práce s relačními databázemi mysql + php. díky za cokoliv k tématu.
zkoušel jsem něco v tomto smyslu:
$sql_data = "insert into db_knihy (nazev, autor) values('$nazev', '$autor')";
$res = mysql_query($sql_data);
if ($res) {
$sqll = "select id from db_knihy where nazev = '$nazev'";
$res = mysql_query($sqll);
$id_knihy = mysql_result($res,0,0); //id nově zadané knihy
// zadá nějakým hromadným dotazem kategorie (jsou v checkboxech)
if ($naucna==1) $sql = $sql . "insert into db_kategorie (id_knihy, id_kategorie) values('$id_knihy', '$naucna')\n"; //pokus odřádkovat
if ($roman==2) $sql = $sql . "insert into db_kategorie (id_knihy, id_kategorie) values('$id_knihy', '$roman')\n";
$res = mysql_query($sql);
//nezjistí mi id_knihy
//zadá jenom řádek naucna, ostatní ignoruje (podmínky if jsou správně.
K předchozímu o rok a pul zpatky:
Co treba toto?:
for($i=0; $i<count($aa); $i++) {
$text .= '\''.$promenna[$i].'\'';
}
$query = "INSERT INTO tabulka VALUES(".$text.")";
$result = mysql_query($query) or die(mysql_error());
Snad to je dost logicky pro ostatni, tohleto byl muj prvni napad:)
<HTML>Moment...
Je treba si ujasnit jak se s databazi pracuje driv nez se budou vymyslet nejake slozite algoritmy.
polozka1,polozka2,polozka3,... je co?
Pokud to neco znamena a da se to nejak pojmenovat+je jich vzdy 20 doporucoval bych vytvorit v databazi 20sloupcu a kazdou polozku ukladat do jednoho...</HTML>
Richard: to je na koho? estli na me, tak to by melo do promenny $text ulozit
'text1' 'text2' atd-ted mi dochazi, ze mi tam chybi carka:-[
$text .= '\''.$promenna[$i].'\','; takze ted
'text1','text2','text3', atd..
<HTML>To bylo na Petra Bláhu</HTML>
Richarde díky, je to dlouho co jsem to dělal a t.č. to již není aktuální, ale samozřejmě beru v podtaz tvůj nápad, kdyby se v budoucnu něco opakovalo.
Hele obecne:
timhle se tusim zaobiraji teorie o normalizaci db. A tam je jednoznacne napsane, ze tohle se dela tak, ze mas jednu tabulku na fakturu (udaje) a druhou tabulku na ty radky s tim, ze tam bude jednoznacna vazba radku na fakturu (n:1).
Takze v konecnem dusledku to bude znamenat vytvoreni jednoho radku v tabulce faktury a n radku v tabulce radku ve faktue. To uz by melo byt mysim celkem jasne. Pokud ne, zkusim to rozvinout...
Mit v tabulce sloupecek pro n radku je imho krok zpet, i kdyz v nekterych pripadech se to da oduvodnit. Toto je ale typicky pripad, kdy by to tak byt nemelo...