Chiavi primarie e chiavi esterne

Ciao a tutti,

avrei una domanda da fare......

Ho creato un db con 2 tabelle con phpadmin, inserendo come motore innodb,

ed ho provato a legare le due tabelle riportando la chiave primaria della prima,

nella seconda tabella. Vi faccio uno schema dei campi presenti per spiegarmi meglio:

Tabella iscritti

id  ( chiave primaria autoincrement )

Nome

Tabella abbonamento

id_tessera ( Chiave primaria autoincrement )

id ( chiave esterna INDEX )

Costo

Ho quindi creato un form per l'inserimento del nome e del costo,

ed inviandoli al database noto che la chiave esterna id della tabella abbonamento ha sempre come

valore 0 mentre le altre primarie chiaramente si autoincrementano.

La domanda è questa, non dovrebbe incrementarsi anche il valore della chiave esterna?

inviato 7 anni fa
bruce1964
X 0 X

Solo i campi autoincrement si autoincrementano da soli, le chiavi esterne vanno specificate altrimenti MySQL come fa a intuire a quale record far riferimento? All'ultimo inserito della tabella "padre"? Sarebbe un comportamento troppo arbitrario...

Devi prima inserire un record nella tabella iscritti, recuperare con PHP (con la funzione mysql_insert_id()) l'id appena generato da MySQL per questo nuovo record, ed infine eseguire la seconda INSERT, questa volta specificando l'id che funge da chiave esterna.

 :bye:

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Grazie per la tua risposta,

e dato che sono un pò confuso, potresti dare un occhio al mio script di inserimento dati,

perchè a me sembra di averle fatte queste operazioni.

Scusa se ti disturbo ma sono agli inizi e con tanta confusione in testa........

<html>

<head>

<title>Area protetta</title></head>

<body>

<center><table><img src="Immaginetestata.jpg" width="1034" height="168"></table></center><br>

<?php

    if ($_COOKIE["loginadmin"] == "OK")

    {

?>

<center><table><h2>Inserimento nuovi iscritti</h2></table></center><br />

<?php

    }

    else

    {

?>

<p>Accesso negato!</p><br />

<p>Effettua il <a href="loginadmin.php">Login</a></p>

<?php

    }

?>

<?php   

if($_POST) {   

    inserisci_record();   

}   

else {   

    mostra_form();   

}   

function inserisci_record()   

{   

    // richiamo il file di configurazione   

    require 'config.php';   

    // richiamo lo script responsabile della connessione a MySQL   

    require 'connect.php';   

    // recupero i campi di tipo "stringa"   

    $nome      = trim($_POST['nome']);   

   $costo     = trim($_POST['costo']);

    // verifico se devo eliminare gli slash inseriti automaticamente da PHP   

    if(get_magic_quotes_gpc())   

    {   

        $nome      = stripslashes($nome);   

      $costo     = stripslashes($costo);

    }   

        $nome      = mysql_real_escape_string($nome);   

        $costo      = mysql_real_escape_string($costo);

    // verifico la presenza dei campi obbligatori   

    if(!$nome)   

    {   

        $messaggio = urlencode("Non hai inserito il nome");   

        header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);   

        exit;   

    }   

    // preparo la query   

   $query = "INSERT INTO abbonamento (costo)   

              VALUES ('$costo')";

   // invio la query   

    $result = mysql_query($query); 

    // controllo l'esito   

    if (!$result) {   

        die("Errore nella query $query: " . mysql_error());   

    }   

    // preparo la query 2 

   $query2 = "INSERT INTO iscritti (nome)   

              VALUES ('$nome')";

     // invio la query2   

    $result2 = mysql_query($query2); 

    // controllo l'esito   

    if (!$result2) {   

        die("Errore nella query $query2: " . mysql_error());   

    }   

    // recupero l'id autoincrement generato da MySQL per il nuovorecord inserito   

    $id_inserito = mysql_insert_id();   

    // chiudo la connessione a MySQL   

    mysql_close();   

    $messaggio = urlencode("Inserimento effettuato con successo (ID=$id_inserito)");   

    header('location: '.$_SERVER['PHP_SELF'].'?msg='.$messaggio);   

}   

function mostra_form()   

{   

    // mostro un eventuale messaggio   

    if(isset($_GET['msg']))   

        echo '<b>'.htmlentities($_GET['msg']).'</b><br /><br />';   

    ?>   

    <center><table><form name="form_registrazione" method="post" action="">

    <table width="412">

  <tr>

    <th width="122" scope="col">Nome:</th>

    <th width="144" scope="col"><input name="nome" type="text" /></th>

    <th width="130" scope="col">&nbsp;</th>

  </tr>

  <tr>

    <th scope="row">Costo</th>

    <td><input name="costo" type="text" /></td>

    <td>&nbsp;</td>

  </tr>

</table>

 </p>

<table width="383">

  <tr>

    <th width="11" scope="col">&nbsp;</th>

    <th width="337" scope="col"><input name="invia" type="submit" value="Invia" />&nbsp;</th>

    <th width="19" scope="col">&nbsp;</th>

  </tr>

  <tr>

    <th scope="row">&nbsp;</th>

    <td><h2>Visualizza gli Iscritti,<a href="cancelladati.php">clicca qui</a></h2>&nbsp;</td>

    <td>&nbsp;</td>

  </tr>

  <tr>

    <th scope="row">&nbsp;</th>

    <td><p>Effettua il <a href="logoutadmin.php">Logout</a></p>&nbsp;</td>

    <td>&nbsp;</td>

  </tr>

</table>

    <?php   

}   

?> 

</body>

</html>

risposto 7 anni fa
bruce1964
X 0 X

Nel tuo script esegui le INSERT in ordine inverso, inoltre prelevi $id_inserito ma non lo usi

 :bye:

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Ti posso chiedere un esempio, non capisco..... query dovrebbe essere relativa alla tabella iscritti e query2 a quella abbonamento? e in che modo dovrei usare $id.....

risposto 7 anni fa
bruce1964
X 0 X

Ti ho scritto tutto nel mio primo messaggio

Devi prima inserire un record nella tabella iscritti, recuperare con PHP (con la funzione mysql_insert_id()) l'id appena generato da MySQL per questo nuovo record, ed infine eseguire la seconda INSERT, questa volta specificando l'id che funge da chiave esterna.

L'id recuperato dopo la prima INSERT sulla tabella "iscritti" va messo nella seconda query di inserimento, come se fosse un dato proveniente dall'utente.

 :bye:

risposto 7 anni fa
Gianni Tomasicchio
modificato 7 anni fa
X 0 X

ok grazie ci studio sopra, anche se ammetto qualche difficoltà........

ciao e grazie ancora

risposto 7 anni fa
bruce1964
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda