Autor Zpráva
Icka
Profil *
Ahojte, zkouším vytvořit mysql transakci, ale do mysql se mi zapíše vždy jen jedna položka z toho cyklu foreach. Mohl by mi někdo poradit co dělám špatně?

mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$q = mysql_query("INSERT INTO productions (nazev,txt_kratky,txt_dlouhy,pozice,aktivni) VALUES ('".$_POST["nazev"]."','".$_POST["txt_short"]."','".$_POST["txt_long"]."',".($pos+1).",1)");
                            
if ($q && isset($_POST["photos"]))
{
     foreach ($_POST["photos"] as $photo)
     {
          mysql_query("INSERT INTO productions_photo (productions_id,soubor,aktivni) VALUES (LAST_INSERT_ID(),'".$photo."',1)"); 
     }                                    
} 
mysql_query("COMMIT");
mysql_query("SET AUTOCOMMIT=1");
juriad
Profil
Icka:
Vypiš si chybu pomocí mysql_error.
Mám dojem, že id productions by sis měl zjistit funkcí mysql_insert_id po provedení $q. A jeho hodnotu doplnit do 9. řádku místo volání funkce LAST_INSERT_ID, protože ta se vztahuje k poslednímu INSERTu, což mohl být i INSERT do tabulky productions_photo. A to způsobí chybu cizího klíče.

Mimochodem, tvůj skript je náchylný na SQL Injection. Stačí v názvu, krátkém či dlouhém popisu nebo názvu souboru použít apostrof a dotaz ti selže.
Transakce ti nepomůže, protože nikde neodchytáváš chyby a nerollbackuješ.
Funkce z rodiny mysql_* jsou zastaralé a PHP 7 již nebudou existovat, zvaž použití modernější knihovny, nejbližší je mysqli_*.
Icka
Profil *
Ano je to tak, mysql_insert_id() pomohlo.
Také jsem přepsal mysql() na mysqli()

Transakci jsem odebral a ještě doplním zřejmě o mysqli_real_escape_string()

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: