problema con inserimento dati nel DB e array

ciao,

si era cominciato a discuterne qui http://www.phpnews.it/forum/programmazione-php/problema-con-foreach-e-query-mysql/ e sembrava risolto, ma poi si è ripresentato più o meno lo stesso problema.

Quindi ho preferito aprire un altra discussione per evitare confusione.

Dunque...

Ho 3 tabelle:

- tbl_ambiti --> id_ambito

- tbl_comuni --> id_comune

- tbl_servizi --> id_servizio

quindi ho un form che va a popolare la tabella "tbl_servizi" in cui, tra i vari campi html da compilare, ho 2 form multiselect in cui l'utente seleziona 1 o più opzioni ciascuna.

al submit, invio i dati al DB in cui avrò un id_servizio univoco creato  + tutti gli ID (id_comune e id_ambito) passati come array dalle multiselect.

Gli id passati dalle multiselect  (id_comune e id_ambito) vanno a popolare un altra tabella che crea le relazioni tra ambiti,comuni e servizi o meglio: ambiti e comuni devono essere legati a servizi

gli array comune[] e ambito[] possono non avere la stessa dimensione.

quindi le domande sono 2:

come faccio a inserire l'id_servizio nella tabella "tbl_relazioni" (in cui ho id_servizio", id_ambito" e "id_comune") e come faccio a fare un ciclo for avendo 2 array di dimensione diversa? 

Spero di essere stato sufficientemente chiaro

Grazie

inviato 6 anni fa
iTek
iTek
1
X 0 X

Tu in input hai tutti i dati a disposizione mi pare. Non ti basta un semplice "insert"?

Per i due array che sono di dimensioni differenti potresti utilizzare due cicli for annidati.

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Tu in input hai tutti i dati a disposizione mi pare. Non ti basta un semplice "insert"?

non ho capito...

per quanto riguarda l'insert nella tabella "tbl_servizi", ok nessun problema, ma come faccio a recuperare l'id_servizio della tabella "tbl_servizi" nella tabella "tbl_relazioni" finchè faccio il ciclo for?

cioè, ad ogni ciclo for in cui estraggo i dati dall' array devo inserire anche l'id_servizio che dovrebbe essere recuperato dalla tabella "tbl_servizi" al momento dell'inserimento e creazione dell'id univoco mi spiego?

risposto 6 anni fa
iTek
iTek
1
modificato 6 anni fa
X 0 X
cioè, ad ogni ciclo for in cui estraggo i dati dall' array devo inserire anche l'id_servizio che dovrebbe essere recuperato dalla tabella "tbl_servizi" al momento dell'inserimento e creazione dell'id univoco mi spiego?

Il recupero dell'id lo puoi solo fare tramite una query di select in cui ci metti delle clausole di discriminazione.

Scusami, forse è la stanchezza e non ho ben chiaro il tuo schema di database e ciò che vuoi ottenere.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

ok. allora vediamo di chiarire la situazione... :)

ho 4 tabelle:

1 - comuni

2 - ambiti

3 - servizi

4 - relazioni

la tebella "servizi" dev'essere relazionata alle tabelle "comuni" e "ambiti", cioè per ogni servizio ci possono essere più comuni e più ambiti. Per fare questo, ho la tabella "relazioni" in cui ho 3 campi:

- id_servizio (id della tabella servizi)

- id_ambito (id della tabella ambiti)

- id_comune (id della tabella comuni)

Per creare un servizio, ho una pagina html in cui ci sono vari campi form ( nome, indirizzo, tel, etc).

Tra questi campi, ho 2 combo multiselect, popolate dinamicamente ( tramite query)  in cui do la possibilità di selezionare i comuni e gli ambiti da associare a quel servizio.

Al submit, vado a popolare i campi DB della tabella "servizi", mentre per quanto riguarda gli id_ambito e id_comune ricevuti sempre via POST dalle combo multiselect, devo inserirli nella tabella "relazioni" per fare appunto le associazioni.

Quindi ci sono 2 query: 1 per inserire i dati nella tabella "servizi" e una per inserire gli ID nella tabella "relazioni".

Il problema è nella seconda query.

Dato che dal form ricevo gli ID in un array:

<select name="ambito[]"  multiple="multiple">

<select name="comune[]" multiple="multiple">

devo fare in modo che attraverso uno o più  cicli, mi vengano estratti i dati ( gli ID comune e ambiti)

e inseriti nella tabella "relazioni".

E questo è il primo problema.

Il secondo problema riguarda l'id_servizio, che dev'essere recuperato ed inserito anche lui nella tabella "relazioni".

Per questo ho pensato di utilizzare la funzione mysql_insert_id() subito dopo la prima query. in questo modo ho l' id_servizo a disposizione.

Ma come faccio a ciclarlo insieme agli altri ID?

In pratica, se per esempio devo inserire 3 comuni e 2 ambiti per quel servizio, nella tabella "relazioni" se non sbaglio dovrei trovarmi una cosa cosi:

id_servizio | id_ambito | id_comune

--------------------------------------------

1                |     1          |    1

--------------------------------------------

1                |     1          |    2

--------------------------------------------

1                |     1          |    3 

--------------------------------------------

1                |     2          |    1

--------------------------------------------

1                |     2          |    2

--------------------------------------------

1                |     2          |    3

Spero di essere stato chiaro e speriamo di risolvere la cosa...

Grazie per la pazienza. :)

risposto 6 anni fa
iTek
iTek
1
X 0 X

Ok, l'id del servizio lo ottieni come hai detto. Il problema per ritrovare l'id non sussiste.

Poi devi recuperare gli id di comune e di ambiti. Dal form ti arrivano i criteri di ricerca. Basta dunque un semplice select del tipo:

SELECT id_di_interesse FROM tabella_di_interesse WHERE colonna_di_interesse IN (valore1, valore2, ecc...).

Ovviamente devi costruire la tua query in relazione ai dati che ti arrivano.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

ehh??  :o

ma io devo fare una query di INSERT non SELECT.

mi serve solo capire come funziona un ciclo for ricevendo 2 array di dimensioni diverse...

attualmente ho questo

if (isset($_POST['comune']) && isset($_POST['ambito'])) {                

$ambito  = $_POST['ambito'];        

$comune  = $_POST['comune'];

for ($i = 0; $i< sizeof($ambito); $i++) {

  $query = "INSERT INTO tbl_relazioni(id_ambito, id_comune) VALUES ('$ambito[$i]','$comune[$i]') ";

$result = dbQuery($query);

}

Questo codice funziona, ma solo se i 2 array $ambito e $comune hanno la stessa dimensione.

A me ovviamente serve che funzioni anche per array di dimensioni diverse.

risposto 6 anni fa
iTek
iTek
1
X 0 X

Mi sembra che i dati in ingresso non siano corretti.

Tu hai bisogno di mettere in relazione comuni e ambiti, ma passi solo un array di comuni e una di ambiti: come fai a sapere quale comune deve essere in relazione con quale ambito? C'è un'informazione mancante!

A meno che tu non voglia mettere in relazione tutti i comuni passati con tutti gli ambiti passati: in questo caso ti basta annidare due cicli (a scelta, o prima i comuni o prima gli ambiti).

risposto 6 anni fa
Massimiliano Arione
X 0 X

Il select da me suggerito era per ricavare gli id dei record da mettere in relazione. E' per ritrovare l'informazione mancante che garak ha nominato.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Mi sembra che i dati in ingresso non siano corretti.

Tu hai bisogno di mettere in relazione comuni e ambiti, ma passi solo un array di comuni e una di ambiti: come fai a sapere quale comune deve essere in relazione con quale ambito? C'è un'informazione mancante!

A meno che tu non voglia mettere in relazione tutti i comuni passati con tutti gli ambiti passati: in questo caso ti basta annidare due cicli (a scelta, o prima i comuni o prima gli ambiti).

allora, la relazione dev'essere fatta fra: "servizi", "ambiti" e "comuni".

ogni servizio (e solo uno) può avere X comuni e X ambiti ( quelli che seleziono dalle 2 select)

In pratica io creo il servizio, associo per quel servizio X comuni e X ambiti e invio i dati al DB.

il servizio, con tutta la descrizione va nella tabella "servizi", mentre gli ID dei comuni e ambiti, assieme all' ID del servizio che in qualche modo devo recuperarlo ( pensavo di usare mysql_insert_id()), dovrebbero finire in un altra tabella "associazioni" (campi di questa tabella: id_servizio, id_comune, id_ambito).

Per quello che dovrei fare un ciclo for che funzioni per i 2 array che possono essere di dimensione differenti e in più mi inserisca l'id_servizio relativo.

Inoltre, se dovessi fare una ricerca per sapere quali ambiti sono associati a un comune e/o viceversa, i dati dovrebbero essere inseriti per poterlo poi fare...

come si fa ad annidare due cicli??

è da una settimana che ci sbatto la testa! :buck: non ne posso più

risposto 6 anni fa
iTek
iTek
1
X 0 X

Una specie di cicli annidati:

ciclo{
    ciclo2{
    }
}
risposto 6 anni fa
Mario Santagiuliana
X 0 X

ok, il problema è che non riesco a trovare materiale in rete che parli di come gestire i cicli annidati relativi a query. l'unica cosa che ho trovato è come costruire tabelline e come funziona un ciclo for... :buck:

possibile che tutti fanno le stesse cose o nessuno ha mai avuto questo genere di problema a parte me?

 ::)

risposto 6 anni fa
iTek
iTek
1
X 0 X

Qui si parla di costruire un algoritmo. Può essere che qualcuno lo abbia fatto. Non è detto che lo abbia reso pubblico. Sta nella tua intelligenza e studio creare l'algoritmo corretto.

Prendi un foglio di carta e inizia a ragionarci sopra su cosa dovrebbe fare la macchina, come se fosse un servitore obbediente ma al quale devi indicargli ogni passaggio. Fa la cosa prima in modo logico e poi traducila in linguaggio php.

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda