PDA

View Full Version : [PHP - MYSQL] Garantire integrità referenziale tra tabelle innodb


Ginos
23-04-2009, 20:07
Salve a tutti, avrei un piccolo problema con due tabelle con engine innodb.
Mi è capitato un paio di volte che le due tabelle (principal_table e elements_eventi) perdano l'integrità referenziale. In questo momento la prima tabella ha 75 record mentre la seconda ne ha 74. Quando succede questo l'applicativo non mi permette più l'inserimento dei dati fino a quando non azzerro entrambe le tabelle con Truncate.
Questo è il codice che utilizzo per inserire "contemporaneamente" i dati. E' corretto usare solo questo sistema o mi conviene utilizzare anche commit e rollback?
$query = "INSERT INTO principal_table (nome,cognome,codicefiscale,indirizzo,citta,provincia,cap,nazione,telefono,fax,email,fattura,categoria_a,cod_iva,int_fattura,indirizzo_fattura,indirizzo_int,citta_int,provincia_int,cap_int,nazione_int,mod_pagamento,prezzo,stato_pagamento,data,conferma,movimenta,iva)
VALUES (\"$resul_nome\",\"$resul_cognome\",\"$resul_codicefiscale\",\"$resul_indirizzo\",\"$resul_citta\",\"$resul_provincia\",\"$resul_cap\",\"$resul_nazione\",\"$resul_telefono\",\"$resul_fax\",\"$resul_email\",\"$resul_fattura\",\"$resul_categoria_a\",\"$resul_cod_iva\",\"$resul_int_fattura\",\"$resul_indirizzo_fattura\",\"$resul_indirizzo_int\",\"$resul_citta_int\",\"$resul_provincia_int\",\"$resul_cap_int\",\"$resul_nazione_int\",\"$resul_mod_pagamento\",\"$costi\",\"$stato_error\",now(),\"$conferma\",\"$movimenta\",\"$iva\")";

$insert = mysql_query($query, $conn);
$id = mysql_insert_id();

$query_events = "INSERT INTO elements_eventi (evento_id, email, cena_gala, costo_gala, evento_sociale, costo_evento, serv_navetta, costo_navetta, totale, visti)
VALUES (\"$id\",\"$resul_email\",\"{$_SESSION['cena_gala']}\",\"{$_SESSION['costo_gala']}\",\"{$_SESSION['evento_sociale']}\",\"{$_SESSION['costo_evento']}\",\"{$_SESSION['serv_navetta']}\",\"{$_SESSION['costo_navetta']}\",\"$totale_eventi\",\"$visti\")";

grazie mille!

Ginos
23-04-2009, 23:05
In questo modo potrebbe andare o è preferibile impostare l'autocommit a 0?
I dati vengono inseriti correttamente nelle due tabelle ma mi servirebbe sapere se con questo metodo posso essere sicuro.

@mysql_query("BEGIN");

$query = "INSERT INTO principal_table (nome,cognome,codicefiscale,indirizzo,citta,provincia,cap,nazione,telefono,fax,email,fattura,categoria_a,cod_iva,int_fattura,indirizzo_fattura,indirizzo_int,citta_int,provincia_int,cap_int,nazione_int,mod_pagamento,prezzo,stato_pagamento,data,conferma,movimenta,iva)
VALUES (\"$resul_nome\",\"$resul_cognome\",\"$resul_codicefiscale\",\"$resul_indirizzo\",\"$resul_citta\",\"$resul_provincia\",\"$resul_cap\",\"$resul_nazione\",\"$resul_telefono\",\"$resul_fax\",\"$resul_email\",\"$resul_fattura\",\"$resul_categoria_a\",\"$resul_cod_iva\",\"$resul_int_fattura\",\"$resul_indirizzo_fattura\",\"$resul_indirizzo_int\",\"$resul_citta_int\",\"$resul_provincia_int\",\"$resul_cap_int\",\"$resul_nazione_int\",\"$resul_mod_pagamento\",\"$costi\",\"$stato_error\",now(),\"$conferma\",\"$movimenta\",\"$iva\")";

$insert = mysql_query($query, $conn);
$id = mysql_insert_id($conn);

$query_events = "INSERT INTO elements_eventi (evento_id, email, cena_gala, costo_gala, evento_sociale, costo_evento, serv_navetta, costo_navetta, totale, visti)
VALUES (\"$id\",\"$resul_email\",\"{$_SESSION['cena_gala']}\",\"{$_SESSION['costo_gala']}\",\"{$_SESSION['evento_sociale']}\",\"{$_SESSION['costo_evento']}\",\"{$_SESSION['serv_navetta']}\",\"{$_SESSION['costo_navetta']}\",\"$totale_eventi\",\"$visti\")";

$insert_events = mysql_query($query_events, $conn);

if($insert && $insert_events)
{
@mysql_query("COMMIT");
}
else
{
@mysql_query("ROLLBACK");
}

misterx
24-04-2009, 12:03
scusa ma usi le chiavi esterne ?

Ginos
27-04-2009, 11:13
Si utilizzo le chiavi esterne.
Le tabelle sono configurate in Innodb e i campi che utilizzo per unirle con il Join sono "evento_id int 11 primary key auto-increment" della tab principal_table e "evento_id int 11" della tab. elements_eventi.(Update e Delete ON CASCADE)

Ginos
29-04-2009, 21:22
nessun suggerimento?