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á?

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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 269x, už mi to tam leze. Jen se mi ale vloží dva řádky s datumem 0000-00-00, když zůstanou ve f… nový
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.… nový
Kráťa 16.10.2013 02:11
Kráťa
Aha, *. poslední
Kráťa 17.10.2013 02:21
Kráťa

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