Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Vložení více řádků do tabulky v databázi z formuláře

Dělám administraci na vkládání a zobrazování živých televizních pořadů, jenž budou titulkovány (skryté titulky - teletext 888). Některé pořady jsou jednorázové, tak je to jasné (např. fotbal Malta<>ČR v říjnu 2013). Některé pořady se však již titulkují pravidelně (třeba Otázky Václava Moravce).
Aby nemusel ten, kdo bude pořady vkládat, odesílat (jasně, jde se vrátit, změnit datum vysílání a odeslat znovu) 4x formulář, líbilo by se mi, kdyby mohl zadat všechna vysílání pořadu v měsíci, jen by měl ve formuláři "další vysílání - datum".
Jak to ale zpracovat, aby se uložily 4 řádky do databáze - to si ještě představit umím. Ale vůbec netuším, jak udělat, aby nevznikaly prázdné řádky, když bude pořad "jednorázový".
Jak se tohle dělá?

Předmět Autor Datum
Postupně vygeneruješ 4 inserty. Posilat do DB budes jen v pripade, ze radek nebude prazdny.
Jan Fiala 14.10.2013 07:41
Jan Fiala
Aha, chápu. Něco takového if (!empty($_POST['nazev']) && ($_POST['kategorie']) && ($_POST['kanal'])…
Kráťa 14.10.2013 09:51
Kráťa
Co tam mám blbě? $sql = "INSERT INTO st_aaa_tabulka VALUES( '$id', '$nazev', '$kategorie', '$kanal'…
Kráťa 15.10.2013 03:37
Kráťa
Opravil jsem domnělé chyby od oka. Jestli kód dál nebude chodit, napiš sem i hlášení. $sql = "INSER…
hynajs 15.10.2013 08:57
hynajs
Dík. Kde byly chyby? Syntaxe co? Uloží se mi však pouze jeden řádek. Mělo by to být tak, že zadá poř…
Kráťa 15.10.2013 09:13
Kráťa
Každý príkaz, ktorý si pripravíš, musíš aj vykonať. Keď vykonáš len prvý, tak sa do databázy uloží l…
los 15.10.2013 10:18
los
Díky, musím odběhnout, pokračovat budu odpoledne, nebo večer. Vyzkouším array a dám vědět.
Kráťa 15.10.2013 10:22
Kráťa
Díky 269x, už mi to tam leze. Jen se mi ale vloží dva řádky s datumem 0000-00-00, když zůstanou ve f…
Kráťa 16.10.2013 00:31
Kráťa
Aha, tam chybí ta podmínka "empty". To první se mi zase po odeslání zobrazuje pouze prázdná stránka.…
Kráťa 16.10.2013 02:11
Kráťa
Aha, *. poslední
Kráťa 17.10.2013 02:21
Kráťa

Aha, chápu. Něco takového

if (!empty($_POST['nazev']) && ($_POST['kategorie']) && ($_POST['kanal']) && ($_POST['den'])  && ($_POST['datum1']) && ($_POST['cas']) && ($_POST['recnik']) && ($_POST['sub']) && ($_POST['status']))

else {
$sql1 = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum1',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";
}
else {
if (!empty($_POST['nazev']) && ($_POST['kategorie']) && ($_POST['kanal']) && ($_POST['den'])  && ($_POST['datum2']) && ($_POST['cas']) && ($_POST['recnik']) && ($_POST['sub']) && ($_POST['status']))
}
$sql2 = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum2',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";

Ale se správnou syntaxí. Jo? Prostě vždy podmínku, jestli je prázdná datum2, datum3, datum4 a když není, udělat insert a původními posty a tím jiným dnem.

Co tam mám blbě?

$sql = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";

if (!empty($_POST['datum2']))
$datum = $datum2
{
$sq2 = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";

if (!empty($_POST['datum3']))
$datum = $datum3
{
$sq3 = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";

if (!empty($_POST['datum4']))
$datum = $datum4
{
$sq4 = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";

}

$vysledek = mysql_query($sql,$id_spojeni);

if (!$vysledek) die(mysql_error());
/* Konec přímé práce s databází. */

Opravil jsem domnělé chyby od oka. Jestli kód dál nebude chodit, napiš sem i hlášení.

$sql = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";

if (!empty($_POST['datum2'])) {
$datum = $_POST['datum2'];

$sq2 = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";
}
if (!empty($_POST['datum3'])) {
$datum = $_POST['datum3'];
$sq3 = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";
}
if (!empty($_POST['datum4']))
{
$datum =$_POST['datum4'];
$sq4 = "INSERT INTO st_aaa_tabulka 
VALUES(
'$id',
'$nazev',
'$kategorie',
'$kanal',
'$den',
'$datum',
'$cas',
'$recnik',
'$sub',
'$status',
'$poznamka'
)";

}

$vysledek = mysql_query($sql,$id_spojeni);

if (!$vysledek) die(mysql_error());
/* Konec přímé práce s databází. */

Dík. Kde byly chyby? Syntaxe co? Uloží se mi však pouze jeden řádek. Mělo by to být tak, že zadá pořad - ty údaje se u opakovaných nemění, pouze přidá datumy, takže ty podmínky by měly být něco jako:
když není prázdná proměnná datum2, vlož další řádek - stejné hodnoty, ale s jiným datem. Když není prázdná damum3...

Každý príkaz, ktorý si pripravíš, musíš aj vykonať. Keď vykonáš len prvý, tak sa do databázy uloží len jeden riadok:

mysql_query("INSERT INTO st_aaa_tabulka VALUES('$id','$nazev','$kategorie','$kanal','$den','$datum','$cas','$recnik','$sub','$status','$poznamka')", $id_spojeni) or die(mysql_error());
if (isset($_POST['datum2'])) {
	$datum = $_POST['datum2'];
	mysql_query("INSERT INTO st_aaa_tabulka VALUES('$id','$nazev','$kategorie','$kanal','$den','$datum','$cas','$recnik','$sub','$status','$poznamka')", $id_spojeni) or die(mysql_error());
}
if (isset($_POST['datum3'])) {
	$datum = $_POST['datum3'];
	mysql_query("INSERT INTO st_aaa_tabulka VALUES('$id','$nazev','$kategorie','$kanal','$den','$datum','$cas','$recnik','$sub','$status','$poznamka')", $id_spojeni) or die(mysql_error());
}
if (isset($_POST['datum4'])) {
	$datum = $_POST['datum4'];
	mysql_query("INSERT INTO st_aaa_tabulka VALUES('$id','$nazev','$kategorie','$kanal','$den','$datum','$cas','$recnik','$sub','$status','$poznamka')", $id_spojeni) or die(mysql_error());
}

V prípade MySQL môžeš jedným príkazom vložiť viacero riadkov a keď si tie dátumové polia nazveš datum1..datum4, tak to môže vyzerať napríklad takto:

$sql_values = array();
for ($i = 1; $i <= 4; ++$i)
	if (isset($_POST["datum$i"])) {
		$datum = $_POST["datum$i"];
		$sql_values[] = "'$id','$nazev','$kategorie','$kanal','$den','$datum','$cas','$recnik','$sub','$status','$poznamka'";
	}
if ($sql_values)
	mysql_query('INSERT INTO st_aaa_tabulka VALUES (' . implode('), (', $sql_values) . ')', $id_spojeni) or die(mysql_error());

Nemáš tam vôbec ošetrené SQL injection, ale na to si už asi zvyknutý. A písal som to z hlavy, takže tam môžu byť chyby.

Aha, tam chybí ta podmínka "empty". To první se mi zase po odeslání zobrazuje pouze prázdná stránka. :-(

Jsem myslel, jak to udělám lstivě a po vložení smažu řádky s datum 0000-00-00 a v phpMyAdmin

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from st_aaa_tabulka where datum = 0000-00-00' at line 1

Zpět do poradny Odpovědět na původní otázku Nahoru