[PHP] Inserimento dati su tabelle collegate 1-m

  • Creatore Discussione Creatore Discussione solari77
  • Data di inizio Data di inizio

solari77

Utente Attivo
6 Ott 2016
119
1
18
Ciao a tutti,sono nuovo del forum e spero di non fare domande troppo banali.
Non sono molto esperto e avrei bisogno del vostro aiuto per una cosa semplicissima.
Ho provato a cercare ma non credo di aver trovato qualcosa di specifico che faccia a caso mio.
Vengo al dunque
Ho un Db con 2 tabelle e tramite php devo realizzare il codice che mi aggiorni i dati di 2 tabelle collegate.
In allegato le 2 tabelle come sono fatte e la relazione che avevo pensato.

Nella prima tabella inserisco tramite il comando:
INSERT INTO anagrafica VALUES (null,'$nome','$cognome','$sesso','$luogo_nascita','$data_nascita','$codice_fiscale','$indirizzo','$tel','$note')";

ma come faccio ad inserire automaticamente anche nella seconda tabella che è collegata tramite il campo ID?
Cioè il mio dubbio è questo.Nel momento in cui stò inserendo ,l'ID della tabella anagrafica non è stato ancora creato, quindi come faccio a passarlo per la seconda tabella?Oppure qual'è il modo migliore per fare una cosa del genere?

Sperando di non aver creato più confusione di quella che già c'è,attendo i vostri consigli.
Saluti
 

Allegati

  • Cattura.PNG
    Cattura.PNG
    20,3 KB · Visite: 482
ciao
intanto vedo che la tabella immagini si lega alla tabella anagrafica (almeno così capisco)
se la tabella anagrafica è

id int(11) primary key autoncrement
....
note varchar(455)


la tabella immagini deve avere un campo che risulti unico che la lega a anagrafica
tu l'hai legata per il campo nome, attento puoi avere sempronio rossi e sempronio bianchi
ti convine legarle all'id che (esempio) sempronio rossi ha in anagrafica

id int(11) primary key autoncrement
id_utente int(11) //l'id di sempronio rossi
size
type
immagine


per prelevare poi appena fatto l'insert in anagrafica
PHP:
<?php
//.....
$ris=mysqli_query($connessione,"INSERT INTO anagrafica VALUES (null,'$nome','$cognome','$sesso','$luogo_nascita','$data_nascita','$codice_fiscale','$indirizzo','$tel','$note')");
$id_utente=mysqli_insert_id($connessione);//prelevi l'ultimo id inserito
//....
$ris=mysqli_query($connessione, "INSERT INTO anagrafica(id_utente, size, type,immagine) values($id_utente, $size, '$type','$immagine')";
//...
?>
una curiosità: inserisci le immagini come file nel db (campo blob)? guara che poi è una rogna (a parte lo spazio), considera ti conviene mettere il nome del file immagini e fare una cartella con le immagini
 
Ciao stasera provo e ti faccio sapere.
Riguardo ai collegamenti io ho collegato le 2 tabelle tramite il campo ID,non tramite il campo nome.
Riguardo al fatto delle immagini,supponi bene.Io devo caricare delle immagini.Posso fare in altro modo più semplice e meno dispendioso in termini di memoria? Ogni consiglio è ben accetto.
Grazie
 
ciao
secondo me è piu facile e meno dispendioso mettere nel campo immagine il nome ( es pinco.jpg) del file e le immagini in una cartella
poi quando devi tirarle fuori estrai il vome dal db e usi il classico <img src='percoso/".riga['immagine']."'...>
questo perche col metodo blob poi devi operare con gli header con la difficile convivenza immagine/testo
l'unica cosa poi importante (soprattutto se non sei tu a caricarele immagini) al caricamento opportuni controlli
 
Allora abbandono la strada con il campo blob. Pero non mi è chiaro come procedere. Io utilizzo una form dove inserisco tutti i dati della tabella anagrafica.
Seguendo la nuova strada come posso caricare le immagini?Prima io cercavo di utilizzare enctype="multipart/form-data e poi $nome = $_FILES['file']['name']; .Dovrei utilizzare lo stesso per prelevare il nome?
Eventualmente posso caricare più di un'immagine alla volta nella stessa form?
Poi io utilizzavo un riassunto che tramite il comando sql SELECT mi restituiva tutti i dati.Ora otterrò una stringa con il nome dell'immagine cliccabile sull'immagine stessa?
Spero di non chiedere troppo.
Grazie e saluti
 
ciao
si devi usare ancora enctype="multipart/form-data e il campo di input file e $_FILES['file'] dove
PHP:
$nome_file=$_FILES['file']['name'];//per omogeneità ti converrebbe metterlo tutto minuscolo
$nome_file_temporaneo=$_FILES['file']['tmp_name'];
$grandezza_file=$_FILES['file']['tmp_name'];
quindi
PHP:
<?php
//...
$nome_file=$_FILES['file']['name'];//per omogeneità ti converrebbe metterlo tutto minuscolo
$nome_file_temporaneo=$_FILES['file']['tmp_name'];
$grandezza_file=$_FILES['file']['tmp_name'];
//...
/*a questo punto hai i dati che ti servono, prima verifichi che il file sia un file ammesso cioè che non ti inviino un file es .exe
ipotizzioamo che tu ammetta i .jpg .png. .gif grandezza e carichi(io faccio così) ti schematizzo*/
//controlli il il tipo di file
$ammessi= array('jpg','png','gif');//o altri es .doc (attento meglio non i .zip e i .rar
$estensione=strtolower(pathinfo($file, PATHINFO_EXTENSION));// ricavo l'estenzione del file, strtolower perche può essere .JPG
if(!in_array($estensione,$ammessi)){
    //il file NON è consentito e rimandi al form o dove vuoi
}
//controlli la grendezza
$max_grand=1000;//metto a caso
if($grandezza_file > $max_grand){
    //troppo grande e rimandi al form o dove vuoi
}
//sesei arrivato qui il file è giusto
//determini la cartella dove caricare
$path="immagini/";
$da_caricare=$path.$nome_file;
if(move_uploaded_file($nome_file_temporaneo, $da_caricare)){
    echo "file caricato con successo";
}else{
    //c'è stao un errore e rimandi al form o dove vuoi
}
//........
//salvi il nome del file nella tua tabella (con o senza il percorso, come preferisci), ricorda che devi aver preso l'id dell'utente
$query= "INSERT INTO immagini(id_utente, size, type, immagine) values($id_utente, $size, '$type','$nome_file')";
//qui scusa nello script precedente errore di copy/paste avevo lascato il nome anagrafica
//p.s. a questo punto non ti servono i campi size e type
//.....
?>
poi quando vorrai visualizzare l'immagine
PHP:
<?php
//......
//avrai sotto forma probabilmete tipo $_GET l'id dell'utente quindi es.
$utente_id=$_GET['id_utente'];
$query= mysqli_query($connessione"SELECT immagine FROM immagini WHERE id_utente=$utente_id");
$riga=mysqli_fetch_assoc($query);
$immagine=$riga['immagine'];
//queste due righe non servono se hai messo il nome col percorso
$path="immagini/";
$da_visualizzare=$path.$immagine;
echo "<img src=\"$da_visualizzare\">";
//.......
?>
si puoi caricare più immagini, ripetendo per ciascuna immagine la stessa cosa

dimenticavo
volendo puoi mettere tu in move_upload il nome $nome_file che preferisci es. id_utente_xyz.jpg dove xyz è il numero +1 delle foto che l'utente ha caricato
 
id int(11) primary key autoncrement
....
note varchar(455)



id int(11) primary key autoncrement
id_utente int(11) //l'id di sempronio rossi
size
type
immagine
Ciao come mi dicevi i campi size e type li ho eliminati.

Ora la insert che cerca di caricare gli allegati è questa:

INSERT INTO immagini (id_utente, nome_file ,immagine) VALUES ('$id_utente','$nome_file','$immagine')

Però non và.Ho provato ad eseguire il comando manualmente su PhpMyAdmin e ottengo il seguente messaggio:

Cannot add or update a child row: a foreign key constraint fails (`clienti`.`immagini`, CONSTRAINT `immagini_ibfk_1` FOREIGN KEY (`id`) REFERENCES `anagrafica` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE)

Giustamente dice che non è possibile modificare una FK, però come devo fare per popolare la tabella?

Io ho legato le 2 tabelle cosi :anagrafica.id con immagini.id (anche se a me sembrava più logico con id_utente)

Dov'è che sbaglio ?

Ciao e grazie
 
Ciao innanzitutto grazie sempre per le risposte.Non sono molto pratico.
Va bene cosi?


anagrafica:
Anagrafica.PNG



immagini
immagini.PNG


relazione
relazione.PNG
 
No,i primary key sono soltanto su anagrafica.id e immagini.id come mi avevi detto anche tu nei post precedenti

tabella anagrafica

id int(11) primary key autoncrement

la tabella immagini

id int(11) primary key autoncrement
 
Facendo delle prove ho visto che rendendo il campo immagini.id_utente UNIQUE e facendo la relazione tra tabelle tra anagrafica.id e immagini id_utente, tutto funziona correttamente però in questo modo mi fà caricare solo un file per ogni cliente essendo il campo UNIQUE
 
ciao
non devi mettere id_utente in immagini unique,
gurda come dovrebbero essere

tabella anagrafica
id int(11) autoincrement primary key
nome varchar(25) not null
cognome varchar(25) not null
sesso set('M', 'F') not null default 'M' // o 'F'
luogo_nascita varchar(100) not null
data_nascita date not null
codice_fiscale varchar(16) //questo potresti metterlo unique
indirizzo varchar(50)
email varchar(50) not nul //questo potresti metterlo unique
telefono varchar(25)
note text

tabella immagini
id int(11) autonicrement primary key
id_utente int(11) not nul
nome_file varchar(50) not null
immagine vercha(50) not null //cosa è?

poi ti conviene via script:
in tabella angrafica prima di fare l'inserimento verificare i due campi unique e se essitono avvisare che esistono di gia
in tabelle immagini prima di inserire verificare se il nome file esiste di gia (gia caricato)
 
  • Like
Reactions: solari77
Perfetto sembra essere tutto ok.
Grazie mille. Posso dare il mio feedback in qualche modo ?
Ciao
 
Ah poi scusa,un'ultima domanda.
Io ho necessità di caricare file di 4-5 mega.
$max_grand=1000;
E' questo il valore da cambiare? A quanto lo dovrei mettere?

Invece sulla form:
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="5000">
<input name="userfile" type="file" id="userfile">
<input name="upload" type="submit" class="box" id="upload" value=" Upload ">
</form>

MAX_FILE_SIZE cosa rappresenta?

Ringrazio nuovamente e saluto
 
ciao
4-5 mega? mi sembra una esagerazione mega un milione
se parli dell'input hidden è il nome dell'input che in quel caso tresmette il valore 5000 probabilmente usato lato php per verificare la grandezza del file in byte usandola con $_FILES['userfile']['size'] che riporta la grandezza del file in byte
 
parlo di foto quindi 4-5 mega non mi sembra un'esagerazione. Come mi hai consigliato ho eliminato il campo Blob ed adottato la strada del move_uploaded_file quindi sul db è presente solo il nome del file.
Ora vorrei caricare immagini,pdf,eventualmente anche altri file le cui estensioni aggiungerò nella parte di codice che mi hai indicato precedentemente.
Però il problema è che funziona solo con file di piccole dimensioni(50-60 kb ad esempio). Invece con questo sistema che mi hai consigliato,che è di gran lunga migliore,però file di grandi dimensioni non li prende.
Consigli?
Grazie sempre per la tua disponibilità
 
ciao
prova a nodificare la capacità
PHP:
ini_set('memory_limit', '5M');//ma questo dipende anche dal server quindi non serve a niente
//....
$grandezza_massima = 5 * 1024 * 1024;//5 MB
if($_FILES['file']['size']>$grandezza_massima){
    echo "file troppo grande";
    //....
}
poi per caricare altri tipi di file basta che tu modifichi la
PHP:
//esempio
$ammessi= array('jpg','png','gif','doc','pdf');

non so che uso fai delle immagini caricate, ma se le usi per visualizzarle su un sito valuta bene i tempi di caricamento, se poi devono essere visibile anche su dispositivi mobili è un suicidio
 

Discussioni simili