Inserimento più righe con una sola query

di il
20 risposte

Inserimento più righe con una sola query

Salve a tutti , avrei necessità di fare un inserimento multiplo in una tabella a partire da una sola query.

In pratica ho degli associati che è possibile selezionare e quindi inviare i relativi id attraverso una variabile a un form. 

es:  ho un elenco di id… 1,2,3,4 , ne seleziono 2 e passo gli id alla pagina successiva.

A questo punto ho un form con tante righe quanti gli id selezionati.

Devo inserire  in una tabella questi id cliccando su un pulsante e attraverso una sola query  che è questa 

$ids = $_POST['id_ass1'];

// il campo testo id_ass1 stampa 2 righe con valori 1 nella prima e 2 nella seconda 
 $ids= "1,2";

$query = "INSERT  INTO pagamenti( id_transaz , id_ass ) VALUES ('', '$ids')";
							//print($query);
					
					
						$risultato = mysql_query($query,$connessione);
					 
						//}
					
	if (	$risultato = mysql_query($query,$connessione)) {
	echo "[b]Dati inseriti.[/b]";}
else {
    echo "Errore durante l'inserimento: " . mysql_error() . "
con la query:}
$query"; 

funziona ma la variabile $ids ha più valori… solo che vengono inserite nella tabella più righe ma tutte con gli stessi valori (il primo di quelli presenti) … potete aiutarmi per favore! Come potrei ottenere quanto mi serve? Grazie mille

20 Risposte

  • Re: Inserimento più righe con una sola query

    Mi fai un esempio di dati inseriti e un esempio di cosa ti aspetti?

    I dati o li prelevi da una lista o quella sql inserisce sempre lo.stesso record.

  • Re: Inserimento più righe con una sola query

    devo far in modo che queste righe vengano inserite in una tabellla  quando si  clicca su registra pagamenti… ora sono 2 ma potrebbero essere anche di più se vengono selezionati più id….

  • Re: Inserimento più righe con una sola query

    devo far in modo che queste righe vengano inserite in una tabellla  quando si  clicca su registra pagamenti… ora sono 2 ma potrebbero essere anche di più se vengono selezionati più id….

  • Re: Inserimento più righe con una sola query

    30/07/2024 - lory22 ha scritto:


    Devo inserire  in una tabella questi id cliccando su un pulsante e attraverso una sola query  che è questa 

    Qual è il problema di eseguire più volte la query di inserimento per ogni record da inserire, cambiando ogni volta il valore dell'ID di riferimento?

  • Re: Inserimento più righe con una sola query

    Cerca 

    INSERT INTO SELECT

    nella documentazione del tuo DBMS. 

    Comunque, così come lo hai descritto, NON LO PUOI FARE : 

    devi fare un insert alla volta. 

  • Re: Inserimento più righe con una sola query

    Come ti ha confermato migliorabile e come ti ha suggerito alka, non puoi creare una query ad inserimento multiplo (nel tuo caso).

    Anche usando insert into select bla bla… devi considerare:

    L'id che potresti anche crearlo autoincrementante

    I valori di dettaglio che puoi prelevare dalla tabella professionisti (suppongo).

    Se oltre a questi dati hai altri dati variabili con quale criterio li valorizzi?

    Se il risultato atteso è 

    Idrecord; idprofessionista.

    Va bene autoincrement e professionisti prelevato da sql.

    Tuttavia, vedo un form pagamenti. Se le quote sono tutte uguali, se il metodo di pagamento (bonifico, contanti, assegno, ecc…) è uguale per tutti, siamo nella condizione suggerita da migliorabile (sorvolando sulla data di pagamento o eventuali valute).

    In questi casi, si usano dei parametri per inserire in automatico gruppi omogenei di dati, ma nella realtà sarebbe meglio un controllo da codice.

    La sql inserisce i valori parametrici e i parametri li setti da codice, poi lanci l'esecuzione della sql previa conferma. Magari un messaggio che ti indica quanti record va ad aggiungere prima di confermare tutto.

  • Re: Inserimento più righe con una sola query

    Vedo che stai inserendo il campo n° piuttosto che l'id del professionista….

    Non ha senso. Se ordini per id decrescente 1 diventa 2 e viceversa…

    I valori del parametro dovrebbero essere 1779 e 31 non 1 e 2.

    Mi sa che non hai capito l'uso degli id che non sono dati ma indici che servono per legare le varie tabelle o identificare un solo record. In teoria l'utente non dovrebbe mai inserire un cliente o fornitore da codice id. Se osservi la rubrica del cellulare non vedrai mai un id, anche quando cerchi un nominativo scrivi il nome non l'id. Dli id dovrebbero essere nascosti all'utente.

  • Re: Inserimento più righe con una sola query

    Sto tentanto in questo modo:

    nella pagina con il form:

    print("<tr bgcolor='$sfondo_pensione'><td>$selezione</td><td><input id= \"id_ass[]\" name=\"id_ass1\"  type=\"text\" size=\"26\"  value=\"$id_ass\" ><a href=\"singolo.php?id_ass=$row[id_ass]&tipo=$tipo\">$row[id_ass]</a></td><td width=\"15\" align=\"center\">".$i."</td><td align=\"left\">".scegli('mor')."</td><td width=\"100\" align=\"left\">$titololista</td><td width=\"260\" align=\"left\">$row[cognome_nome] </td><td width=\"260\" align=\"left\">$row[indirizzo_res]</td><td width=\"250\" align=\"left\">$row[indirizzoresidenza]</td><td width=\"250\" align=\"center\"></b> </br>"); format_date($row[data_diritto_voto]);print("</td>
    <td width=\"450\" align=\"left\"><td><input name=\"dataiscr\" name=\"dataiscr\" type=\"text\" size=\"26\"  value=\"$dataiscrizione\" >  
                </td>".$retval1."  ". $retval2."  ". $retval3."  ". $retval4."  ". $retval5." ". $note." </td> 
    </tr> ");

    nella pagina che contiene la query per l'inserimento:

    if($ids = isset($_POST['id_ass']) ? $_POST['id_ass'] : array()); 
    elseif (isset($_GET['id_ass'])) 
        $ids = array_map('intval',$ids); 
    
        // creo una lista di ID per la query 
        $ids = implode(',',$ids); 
        echo $ids; 
    					
    						$query = "INSERT  INTO pagamenti(id_ass) SELECT id_ass FROM anagrafica WHERE id_ass = '$ids'";
    							
    						
    							
    							print($query);
    					
    					
    						$risultato = mysql_query($query,$connessione);

    adesso funziona se non metto la condizione WHERE… in pratica mi inserisce tutti gli id_ass… ma a me serve che inserisca solo quelli selezionati…

    poi pensavo, una volta che ho gli id_ass nella tabella di poter fare un update per inserire quelli mancanti… come si potrebbe fare con la condizione where? O non è fattibile in nessun modo… questa cosa… mi sta facendo impazzire…

  • Re: Inserimento più righe con una sola query

    01/08/2024 - lory22 ha scritto:


    Sto tentanto in questo modo […]

    Perché porre domande e, a fronte di suggerimenti, fare comunque di testa propria?
    Non è una lamentela, ma una curiosità reale.

    01/08/2024 - lory22 ha scritto:


    adesso funziona se non metto la condizione WHERE… in pratica mi inserisce tutti gli id_ass…

    Hai scritto una query che prende tutti i valori di un campo da una tabella e li inserisce in un'altra: sfido che non possa funzionare.

    La clausola WHERE poi è sbagliata: seleziona tutti i record dove il campo ID è uguale a un singolo valore, e come valore singolo usi la variabile dove hai messo tutti gli ID. Volendo poteva magari starci una clausola “IN”, ma l'elenco deve essere limitato pena problemi di performance o query chilometriche.

    01/08/2024 - lory22 ha scritto:


    poi pensavo, una volta che ho gli id_ass nella tabella di poter fare un update per inserire quelli mancanti… come si potrebbe fare con la condizione where? O non è fattibile in nessun modo… questa cosa… mi sta facendo impazzire…

    Per forza che impazzisci: hai un problema e continui a chiedere come fare deviando dalla soluzione corretta che ti è stata data da più persone. E allora mi viene da pensare che tu voglia impazzire volutamente.

    Come è già stato detto, fai più INSERT, una per ogni ID da inserire, con un ciclo che prenda ogni ID selezionato; ci andrebbe anche una transazione magari, ma un passo alla volta.

    Se continui a voler mettere più ID dove ce ne sta uno solo o andando completamente a tentoni, le combinazioni da provare saranno infinite.

    Se poi l'interesse è ottenere il risultato senza necessariamente capire qual è il codice che si scrive, o ciò che si sta cercando di spiegare, solo per il fine ultimo di far funzionare la cosa (ammesso che ci si riesca), basta dirlo che si evita di perdere tempo a rispondere. Non mi sembra un comportamento rispettoso.

  • Re: Inserimento più righe con una sola query

    Mi scuso… hai perfettamente ragione, ma non sono irrispettosa… solo evidentemente poco capace. E siccome parto da un qualcosa di realizzato tanti anni fa e stiamo cercando di modificare questo aspetto … non sono evidentemente in grado.

    Ora cerco come fare sto ciclo e questi più insert. Speravo solo in un esempio. Grazie a tutti lo stesso e scusate ancora.

  • Re: Inserimento più righe con una sola query

    Nessuno ti sta rimproverando.

    Vai di codice.

    Usare una sql di insert per come hai strutturato le tabelle porta a risultati imprevedibili.

    Usa un ciclo e lanci una insert dando i valori presi dal puntatore alla tabella spostando ad ogni ciclo il puntatore (next) fino alla fine dei dati che devi inserire (ultimo record della tabella da cui attingi i valori).

    Suggerirti una sql che preleva da una select implica conoscere bene la struttura dei dati e, almeno io, non riesco a capirla.

    Se lo scopo è automatizzare l'inserimento, il modo più controllato è una sql di insert da eseguire dentro un ciclo di codice settando i parametri della query.

    Filtri i dati delle tabelle e inserisci i record spostandoti dal primo all'ultimo record della tabella filtrata.

  • Re: Inserimento più righe con una sola query

    02/08/2024 - lory22 ha scritto:


    Mi scuso… hai perfettamente ragione, ma non sono irrispettosa… solo evidentemente poco capace.

    Nessuno ne sta facendo una questione di capacità: se ci sono cose non chiare, si possono sempre fare domande e non ci sono problemi a fornire risposte. L'importante è andare verso una direzione. Se invece si cerca di dare un aiuto ma dall'altra parte si intraprende una strada differente, pur essendo una cosa del tutto lecita (nessuno può né vuole obbligare nessuno), allora la discussione perde di senso in quanto non si sta seguendo il suo filo logico verso la risoluzione del problema, a beneficio di chi lo ha posto e di chiunque dovesse trovarsi in futuro nella medesima condizione. Questo è il punto centrale. “Irrispettoso” (magari è un termine eccessivo) si riferisce al voler proseguire in autonomia, ma senza dirlo prima. :)

    02/08/2024 - lory22 ha scritto:


    Ora cerco come fare sto ciclo e questi più insert. Speravo solo in un esempio.

    Purtroppo non ho il tempo di scriverlo, personalmente. Magari qualcun altro sì. In ogni caso, non potrà essere preciso al 100% in quanto nessuno ha in mano il tuo sorgente, da cui l'invito ad approfondire proprio perché la capacità di leggere e analizzare le risposte d'aiuto è responsabilità di chi chiede. In caso contrario, si tratterebbe di “pappa pronta”: anche qui, nulla di male nel chiederla, ma il forum non è il luogo adatto e molti non vedono di buon occhio lo “sfruttamento” (uso una iperbole) in questo senso (oltre a non essere ammesso dal regolamento che vedi sotto al messaggio quando scrivi).

    Rileggi tutto il thread e magari ripartiamo da una base comune ma sensata. In caso contrario, almeno io perdo interesse nella questione. :|

  • Re: Inserimento più righe con una sola query

    Ok, provo a mettere in pratica quanto suggerito:

    $ids1 = count ($ids); //Utilizzo count per contare il numero di valori contenuti nell'array
    	for($i=0; $i<$ids; $i++){
    	
    
    						//$query = "INSERT  INTO pagamenti(id_ass) SELECT id_ass FROM anagrafica WHERE id_ass = '$ids'";
    							
    						$query = "INSERT INTO `pagamenti`(`id_ass`) VALUES ('$ids[$i]')";
    
    
    if($result = mysql_query($query) or die (mysql_error())){
    }
    
    } //Chiudo il for
    
    }
    
    } //Chiudo l'if
    
    mysql_close();
    

    la strada ora è quella giusta? 

    Per recuperare l'  array faccio così

    if($ids = isset($_POST['id_ass']) ? $_POST['id_ass'] : array()); 
    elseif (isset($_GET['id_ass'])) 
        $ids = array_map('intval',$ids); 
    
        // creo una lista di ID per la query 
        $ids = implode(',',$ids); 

    e tutto parte da 

    print("<tr bgcolor='$sfondo_pensione'><td>$selezione</td><td><input id= \"id_ass[]\" name=\"id_ass[]\" type=\"text\" size=\"26\"  value=\"$id_ass\" ><a href=\"singolo.php?id_ass=$row[id_ass]&tipo=$tipo\">$row[id_ass]</a></td><td width=\"15\" align=\"center\">".$i."</td><td align=\"left\">".scegli('mor')."</td><td width=\"100\" align=\"left\">$titololista</td><td width=\"260\" align=\"left\">$row[cognome_nome] </td><td width=\"260\" align=\"left\">$row[indirizzo_dom]</td><td width=\"250\" align=\"left\">$row[indirizzodomicilio]</td><td width=\"250\" align=\"center\"></b> </br>"); format_date($row[data_diritto_voto]);print("</td>
    <td width=\"150\" align=\"left\"><td><input id=\"dataiscr\" name=\"dataiscr\" type=\"text\" size=\"26\"  value=\"$dataiscrizione\" >
                </td>".$retval1."  ". $retval2."  ". $retval3."  ". $retval4."  ". $retval5." ". $note." </td> 
    </tr> ");

    Ora quando eseguo non mi da errori ma nemmeno inserisce… 

  • Re: Inserimento più righe con una sola query

    Create table professionisti (
       Prof_id integer primary key,
       Nominativo text not null,
       Condizione text not null);
    Create table pagamenti (
       Idpag integer primary key auto_incrrment,
       Prid integer not null,
       Professionista text not null);
    
    Insert into professionisti values (1, 'pippo', 'ok');
    Insert into professionisti values (2, 'pluto', 'ko');
    Insert into professionisti values (3, 'topolino', 'ok');
    
    Insert into pagamenti (prid, professionista) 
       select (prof_id, nominativo)
       From professionisti
       Where condizione='ok';

    Fino qui non mostra nulla ma appena fai

    Select * from pagamenti

    Vedi i dati inseriti.

    Cosa ne deduci?

Devi accedere o registrarti per scrivere nel forum
20 risposte