Relazione uno a molti

  • Creatore Discussione Creatore Discussione Max61
  • Data di inizio Data di inizio
Ciao Max61,
credo di aver capito dov'è l'errore.
I campi 'autoincrementanti' sono campi particolari, che vengono assegnati in modo automatico dalla macchina e, come dice il nome, si autoincrementano (x cui non puoi assegnargli un valore) ma il campo c'è e glielo devi indicare.
Nella tua query di inserimento gli dici che ANAGRAFICA è composta da un campo ID (autoincrementante) al primo posto, dal NOMINATIVO al secondo, da RESIDENZA al terzo e così via, però poi, nella clausola VALUES gli dici che al primo posto c'è il nominativo; ma al primo posto di ANAGRAFICA c'è l'ID, quindi lui non capisce e va in confusione; per cui anche nella clausola VALUES gli dovrai dire che al primo posto c'è un campo (delimitandolo da apici) ma all'interno non indicherai nessun valore in quanto è un campo 'autoincrementante'


PHP:
[PHP]
[/PHP]
Codice:
 VALUES ('','secondocampo','terzocampo',...........)



Zorro:byebye::byebye:


Ciao, ho fatto questa prova ma niente, ancora non va

Allego codice
PHP:
//Selezione del database
	$db=mysql_select_db("gestionesinistri", $myconn) or die ("Database inesistente!");
	//Selezione dei record di una tabella
	$query="SELECT COUNT(*) as tot FROM tblanagrafica WHERE Nominativo = '".$Nominativo."'";
	$tabella=mysql_query($query, $myconn) or die ("Attenzione: errore nella query 1");
	ECHO $tabella;
	//Esecuzione della query
	$row=mysql_fetch_assoc($tabella);
	//$count=$row[' count'];
	$righetot=$row['tot'];

if ($righetot == 0) {
    $query="INSERT INTO tblanagrafica('Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail')
                 VALUES ('$Nominativo', '$Residenza', '$Indirizzo', '$Cellulare', '$TelefonoFisso', '$Mail')";
    mysql_query($query, $myconn) or die ("Attenzione: errore nella query 2");
}
$query="SELECT * FROM tblanagrafica WHERE Nominativo =  '".$Nominativo."'";    
$tabella=mysql_query($query, $myconn) or die ("Attenzione: errore nella query 3");
$riga=mysql_fetch_array($tabella);
$id_cli=$riga['tblanagrafica_id'];

$query="INSERT INTO tblsinistri ('id','tblanagrafica_id', 'Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail')
              VALUES ('$id_cli','$Nominativo', '$Residenza', '$Indirizzo', '$Cellulare', '$TelefonoFisso', '$Mail')";
mysql_query($query, $myconn) or die ("Attenzione: errore nella query 4");

Ho 2 domane da farti, questo campo $id_cli viene valorizzato così $id_cli=$riga['tblanagrafica_id'];, è corretto?

Questa query
PHP:
 $query="INSERT INTO tblsinistri ('id','tblanagrafica_id', 'Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail')
              VALUES ('$id_cli','$Nominativo', '$Residenza', '$Indirizzo', '$Cellulare', '$TelefonoFisso', '$Mail')";

va bene così come è mscritta, perchè i campi all'inizio sono di VALUES sono diversi dal rigo precedente.
PHP:
$id_cli=$riga['tblanagrafica_id'];

$query="INSERT INTO tblsinistri ('id','tblanagrafica_id', 'Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail')
              VALUES ('$id_cli','$Nominativo', '$Residenza', '$Indirizzo', '$Cellulare', '$TelefonoFisso', '$Mail')";
mysql_query($query, $myconn) or die ("Attenzione: errore nella query 4");

Ciao e grazie
Max61
 
ciao
oppure è inutile indicare l'id primarykey autoincrement sia nei nomi che nel value ci pensa mysql a generarlo
comunque guardado una query presa a caso
PHP:
<?php
$query="INSERT INTO tblsinistri ('id','tblanagrafica_id','Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail')
              VALUES ('$id_cli','$Nominativo', '$Residenza', '$Indirizzo', '$Cellulare', '$TelefonoFisso', '$Mail')";
?>
non so proprio come funzioni, se non ho contato male
nei nomi dei campi indichi 8 campi
nel values dai 7 valori

Ciao borgo italia, hai ragione ma non funziona comunque, allego codice provato adesso:
PHP:
$riga=mysql_fetch_array($tabella);
$id_cli=$riga['tblanagrafica_id'];
echo "<br>", "id_cli=riga[tblanagrafica_id]   ", $id_cli=$riga['tblanagrafica_id'],"<br>" ;

$query="INSERT INTO tblsinistri ('id_cli', 'Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail')
              VALUES ('$id_cli', '$Nominativo', '$Residenza', '$Indirizzo', '$Cellulare', '$TelefonoFisso', '$Mail')";
mysql_query($query, $myconn) or die ("Attenzione: errore nella query 4");
Restituisce questo errore: Attenzione: errore nella query 4
Ciao
Max61
 
ciao
commenta provvisoriamente la mysql_query e aggiungi un var_dump
PHP:
<?php
//.......
$query="INSERT INTO tblsinistri ('id_cli', 'Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail')
              VALUES ('$id_cli', '$Nominativo', '$Residenza', '$Indirizzo', '$Cellulare', '$TelefonoFisso', '$Mail')";
var_dump($query);
//mysql_query($query, $myconn) or die ("Attenzione: errore nella query 4"); 
//..........
?>
e verifica che la stringa venga costruita come dovrebbe essere
piccolo consiglio: conviene sempre scrivere i nomi campi e variabili tutto in minuscolo, si evitano errori
ti ricordo esempio che se da qualche parte hai scritto $Cellulare e in altre $cellulare per php sono due variabili diverse
 
ciao
commenta provvisoriamente la mysql_query e aggiungi un var_dump
PHP:
<?php
//.......
$query="INSERT INTO tblsinistri ('id_cli', 'Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail')
              VALUES ('$id_cli', '$Nominativo', '$Residenza', '$Indirizzo', '$Cellulare', '$TelefonoFisso', '$Mail')";
var_dump($query);
//mysql_query($query, $myconn) or die ("Attenzione: errore nella query 4"); 
//..........
?>
e verifica che la stringa venga costruita come dovrebbe essere
piccolo consiglio: conviene sempre scrivere i nomi campi e variabili tutto in minuscolo, si evitano errori
ti ricordo esempio che se da qualche parte hai scritto $Cellulare e in altre $cellulare per php sono due variabili diverse

Provato, mi restituisce questa stringa:
string(213) "INSERT INTO tblanagrafica('Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail') VALUES ('Nominativo ', 'ABANO TERME', 'Via', 'Cellulare ', 'TelefonoFisso ', 'Mail ')"
Una cosa ti voglio chiedere, ho messo un ECHO $tabella; dopo la connessione, e mi restituisce questo: Resource id #5

var_dump restituisce questo: string(213) "INSERT INTO tblanagrafica('Nominativo', 'Residenza', 'Indirizzo', 'Cellulare', 'TelefonoFisso', 'Mail') VALUES ('Nominativo ', 'ABANO TERME', 'Via', 'Cellulare ', 'TelefonoFisso ', 'Mail ')"
Ciao
 
Ultima modifica:
Prova con questo; io l'ho provato e funziona.
Ho creato due tabelle: una (agenda) con 3 campi: un ID autoincrementante, COGNOME e NOME, entrambi varchar(30)
e una (INDIRIZZI) con ID autoincrent, ID_CLIENTE, INDIRIZZO, COGNOME, NOME.


PHP:
<?php
$cognome = 'paolino';
$nome = 'TOPOLINO';
$indirizzo = 'via verdi';

 // legge ANGRAFICA per controllare che il pz non sia già presente

    //connessione al server DB
	$link_connessione=mysql_connect("localhost","..ò......fl","") or die ("Connessione impossibile");
	//Selezione del database
	$db=mysql_select_db(".......l", $link_connessione) or die ("Database inesistente!");
	//Visualizzazione dei record di una tabella
	$query="SELECT COUNT(*) as tot FROM agenda WHERE COGNOME = '".$cognome."'and NOME = '".$nome."'";
	$tabella=mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query");
	//Esecuzione della query
	$row=mysql_fetch_assoc($tabella);
	//$count=$row[' count'];
	$righetot=$row['tot'];
    
    echo $righetot;

   if ($righetot == 0) {
	   $query="INSERT INTO `my_provasitofl`.`agenda` (`ID`,`COGNOME`,`NOME`) VALUES ('','$cognome','$nome')";
       mysql_query($query, $link_connessione) or die ("Attjjjjjenzione: errore nella query");
  }
  
   $query="SELECT * FROM agenda WHERE COGNOME = '".$cognome."' and NOME = '".$nome."'";
   $tabella=mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query");
   //Esecuzione della query
   $riga=mysql_fetch_array($tabella);
        
  $idut=$riga['ID'];
  
  $query="INSERT INTO `my_provasitofl`.`INDIRIZZI` (`ID`,`ID_CLIENTE`,`INDIRIZZO`,`COGNOME`,`NOME`)
          VALUES ('','$idut','$indirizzo','$cognome','$nome')";
  mysql_query($query, $link_connessione) or die ("Attjjjjjenzione: errore nella query");


?>


La prima volta che l'ho lanciato, essendo vuote tutte e due le tanbelle, ha correttamente scritto nome e cognome nella prima e l'indirizzo nella seconda (inserendo nel campo ID_CLIENTE il contenuto del campo ID della prima tabella).
Poi ho cambiato solo l'indirizzo nello script e l'ho rilanciato. Dal momento che nella prima tabella era già presente un cliente
con quel nominativo, ha semplicememte letto l'ID e lo ha scritto nell'altra tabella, nel campo ID_CLIENTE, assieme all'indirizzo

A me funziona perfettamemnte
 
Prova con questo; io l'ho provato e funziona.
Ho creato due tabelle: una (agenda) con 3 campi: un ID autoincrementante, COGNOME e NOME, entrambi varchar(30)
e una (INDIRIZZI) con ID autoincrent, ID_CLIENTE, INDIRIZZO, COGNOME, NOME.


PHP:
<?php
$cognome = 'paolino';
$nome = 'TOPOLINO';
$indirizzo = 'via verdi';

 // legge ANGRAFICA per controllare che il pz non sia già presente

    //connessione al server DB
	$link_connessione=mysql_connect("localhost","..ò......fl","") or die ("Connessione impossibile");
	//Selezione del database
	$db=mysql_select_db(".......l", $link_connessione) or die ("Database inesistente!");
	//Visualizzazione dei record di una tabella
	$query="SELECT COUNT(*) as tot FROM agenda WHERE COGNOME = '".$cognome."'and NOME = '".$nome."'";
	$tabella=mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query");
	//Esecuzione della query
	$row=mysql_fetch_assoc($tabella);
	//$count=$row[' count'];
	$righetot=$row['tot'];
    
    echo $righetot;

   if ($righetot == 0) {
	   $query="INSERT INTO `my_provasitofl`.`agenda` (`ID`,`COGNOME`,`NOME`) VALUES ('','$cognome','$nome')";
       mysql_query($query, $link_connessione) or die ("Attjjjjjenzione: errore nella query");
  }
  
   $query="SELECT * FROM agenda WHERE COGNOME = '".$cognome."' and NOME = '".$nome."'";
   $tabella=mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query");
   //Esecuzione della query
   $riga=mysql_fetch_array($tabella);
        
  $idut=$riga['ID'];
  
  $query="INSERT INTO `my_provasitofl`.`INDIRIZZI` (`ID`,`ID_CLIENTE`,`INDIRIZZO`,`COGNOME`,`NOME`)
          VALUES ('','$idut','$indirizzo','$cognome','$nome')";
  mysql_query($query, $link_connessione) or die ("Attjjjjjenzione: errore nella query");


?>


La prima volta che l'ho lanciato, essendo vuote tutte e due le tanbelle, ha correttamente scritto nome e cognome nella prima e l'indirizzo nella seconda (inserendo nel campo ID_CLIENTE il contenuto del campo ID della prima tabella).
Poi ho cambiato solo l'indirizzo nello script e l'ho rilanciato. Dal momento che nella prima tabella era già presente un cliente
con quel nominativo, ha semplicememte letto l'ID e lo ha scritto nell'altra tabella, nel campo ID_CLIENTE, assieme all'indirizzo

A me funziona perfettamemnte

Grazie...FUNZIONA!!!

Max61
 
Ciao seguendo il ragionamento fatto per le tabelle tblanagrafica e tblsinistri ho aggiunto questo codice per popolare la tabella tblverbali:
PHP:
$query="INSERT INTO `gestionesinistri`.`tblverbali` (`id`,`tblanagrafica_id`,`Nominativo`,`indirizzo`) 
          VALUES ('','$idut','$Nominativo','$indirizzo')"; 
  mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query 4");

cioè all'inserimento di un nominativo inserisco anche il record del verbale con l'ID della tabella tblanagrafica.
Ma ho la necessità di inserire il secondo, il terzo, a volte anche il quinto verbale di un nominativo già presente nella tabella tblanagrafica e relativo allo stesso utente e sinistro, come faccio?

Non so se mi sono spiegato quindi ti faccio un esempio:
Nominativo = Pippo
Sinistro n. 1
Verbali n. 1, 2, 3, 4, 5 ecc.

Grazie ancora
Max61
 
ciao
non ho seguito la discussione dall'inizio, quindi può essere che abbia perso qualcosa e che quanto dirò sia gia stato fatto.
da quello che capisco tu puoi avere una situazione come da figura
uno_a_molti.jpg
se è così mi sa che devi ripensare alle tabelle, io farei
1) tabella anagrafica
id int(9) primarykey autoncrement
cognome varchar(250)
nome varchar (252)
// eccetera tutti i dati del cliente


2) tabella sinistri
id int(9) primarykey autoncrement
id_utente int(9)// lega il sinistro al cliente
//eccetera tutti i dati che ti servono


3) tabella verbali
id int(9) primarykey autoncrement
id_sinistro int(9)//lega il verbale al sinistro
id_utente int(9)//è in più perche gia il sinistro lo lega all'utente, ma potrebbe essere una sicurezza
//eccetera tutti i dati che ti servono


attento poi a non fare le tabelle ridondanti, da quello che vedo (se non sbaglio) nella tabella sinistri ha messo es il campo Nominativo, se è il campo del cognome o nome dell'utente è un campo ridondante che ha solo l'effetto di ingrandire il db, analogamente per cellulare o altri dati che sono anche in anagrafica
 
ciao
non ho seguito la discussione dall'inizio, quindi può essere che abbia perso qualcosa e che quanto dirò sia gia stato fatto.
da quello che capisco tu puoi avere una situazione come da figura
Vedi l'allegato 2811
se è così mi sa che devi ripensare alle tabelle, io farei
1) tabella anagrafica
id int(9) primarykey autoncrement
cognome varchar(250)
nome varchar (252)
// eccetera tutti i dati del cliente


2) tabella sinistri
id int(9) primarykey autoncrement
id_utente int(9)// lega il sinistro al cliente
//eccetera tutti i dati che ti servono


3) tabella verbali
id int(9) primarykey autoncrement
id_sinistro int(9)//lega il verbale al sinistro
id_utente int(9)//è in più perche gia il sinistro lo lega all'utente, ma potrebbe essere una sicurezza
//eccetera tutti i dati che ti servono


attento poi a non fare le tabelle ridondanti, da quello che vedo (se non sbaglio) nella tabella sinistri ha messo es il campo Nominativo, se è il campo del cognome o nome dell'utente è un campo ridondante che ha solo l'effetto di ingrandire il db, analogamente per cellulare o altri dati che sono anche in anagrafica

Si esatto.
Provo a fare le modifiche...
Ciao
Max61
 
ciao
voglio darti un consiglio: quando uno script si appoggia ad un database consistente è importante lo studio/progetto dello stesso (carta+matita+gomma) cercando di limitare al massimo la ridondanza delle tabelle
 
Mi trovo d'accordo pienamente con borgo italia, la tua è una gestione by cliente, quindi legare il tutto alla tabella utenti potrebbe essere la soluzione.

Come dicevo prima ti invito a ricontrollare le tabelle che hai a db e togliere le informazioni ridondanti per non confonderti e ottimizzare le query.

Puoi gestirti il tutto con post e hidden input.


PS. ho letto dopo l'ultimo messaggio....

Mi stavo chiedendo, se poi hai un sistema di autenticazione in modo che puoi sapere chi ha inserito o modificato cosa!?!
Ti consiglio di pensarci subito in modo da poter aggiungere i campi a DB!
 
Ultima modifica:
Mi trovo d'accordo pienamente con borgo italia, la tua è una gestione by cliente, quindi legare il tutto alla tabella utenti potrebbe essere la soluzione.

Come dicevo prima ti invito a ricontrollare le tabelle che hai a db e togliere le informazioni ridondanti per non confonderti e ottimizzare le query.

Puoi gestirti il tutto con post e hidden input.


PS. ho letto dopo l'ultimo messaggio....

Mi stavo chiedendo, se poi hai un sistema di autenticazione in modo che puoi sapere chi ha inserito o modificato cosa!?!
Ti consiglio di pensarci subito in modo da poter aggiungere i campi a DB!


Ciao, no, non ho un sistema di autenticazione in modo dai sapere chi ha inserito o modificato cosa anche se mi piacerebbe, (lo vorrei mettere su un altro programma dove in fase di inserimento mi trovo degli errori, ma non so chi li abbia fatti perchè sono in 6 persone ad utilizzare la procedura) anche perchè non saprei come farlo...
Si Borgo Italia ha centrato quello che vorrei fare, quindi il codice di Zorro andrebbe modificato? E come?
Allego codice
PHP:
<?php
include('Connessione.php');

	$Nominativo = $_POST['Nominativo'];
	$Residenza = $_POST['Residenza'];
	$Indirizzo = $_POST['Indirizzo'];
	$Cellulare = $_POST['Cellulare'];
	$TelefonoFisso = $_POST['TelefonoFisso'];
	$Mail = $_POST['Mail'];

 // legge ANGRAFICA per controllare che il pz non sia già presente 
    //connessione al server DB 
    $link_connessione=mysql_connect("localhost", "marzio", "max123") or die ("Connessione impossibile"); 
    //Selezione del database 
    $db=mysql_select_db("gestionesinistri", $link_connessione) or die ("Database inesistente!"); 
    //Visualizzazione dei record di una tabella 
    $query="SELECT COUNT(*) as tot FROM tblanagrafica WHERE Nominativo = '".$Nominativo."'"; 
    $tabella=mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query 1"); 
    //Esecuzione della query 
    $row=mysql_fetch_assoc($tabella); 
    //$count=$row[' count']; 
    $righetot=$row['tot']; 
     
    echo $righetot; 

   if ($righetot == 0) { 
       $query="INSERT INTO `gestionesinistri`.`tblanagrafica` (`id`,`Nominativo`,`indirizzo`) VALUES ('','$Nominativo','$indirizzo')"; 
       mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query 2"); 
  } 
   
   $query="SELECT * FROM tblanagrafica WHERE Nominativo = '".$Nominativo."'"; 
   $tabella=mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query 3"); 
   //Esecuzione della query 
   $riga=mysql_fetch_array($tabella); 
         
  $idut=$riga['id']; 
   
  $query="INSERT INTO `gestionesinistri`.`tblsinistri` (`ID`,`tblanagrafica_id`,`Nominativo`,`indirizzo`) 
          VALUES ('','$idut','$Nominativo','$indirizzo')"; 
  mysql_query($query, $link_connessione) or die ("Attenzione: errore nella query 4"); 

?>

Grazie per la pazienza
Max61
 
Ultima modifica:
ciao
dimenticavo una cosa uimportante che forse ti sconvolgerà: devi passare alle nuove funzioni php mysqli (o alla classe pdo), le vecchie funzioni mysql sono obsolete e con le nuove versioni di php non saranno più supportate.
corri il rischio che se il tuo provider aggiorna php devi riscriverle tutte non è, lo so per esperienza, una cosa divertente
 
ciao
dimenticavo un'altra cosa importante in riferimento a quello che ha detto alankanz
...se poi hai un sistema di autenticazione in modo...
da quello che capisco il db conterrà dei dati sensibili (privacy), quindi è molto importante che sia protetto da accesi non autorizzati e non solo esterni, ma anche interni all'azienda, esempio
se è l'impegato bianchi gestisce per il cliente pippo il "sinistro 2" solo lui dovrebbe essere autorizzato a vedre/inserire/modificare i dati del sinistro 2 e relativi verbali di pippo
 
Ciao, no la cosa non è così ristretta, nel senso che anche il responsabile e il direttore possano almeno consultare i dati. Mentre la fase dell'inserimento/modifica dati di solito è una sola persona incaricata della gestione.

Ciao
Max61
 
Da quello che vedo lui utilizza XAMPP!

Basta sapere che versione di XAMPP ha e al massimo è un settaggio da php.ini
 
ciao
si si setta php.ini, ma es: l'istruzione
PHP:
$tabella=mysql_query($query, $link_connessione);
va corretta, se usi il procedurale, in
PHP:
$tabella=mysqli_query($link_connessione, $query);
o se usi il metodo a oggetti
PHP:
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$mysqli->query($query);

poi per i permessi è come qui sul forum
l'amministratore può fare tutto
i supermod un po' meno ma possono operare in tutte le sezioni
i mod possono operare solo nelle sezioni in cui sono moderatori
 

Discussioni simili