2011-01-24 13 views
5

Ho bisogno di aiuto su un metodo di inserimento di valori in una singola colonna su righe diverse.SQL - Inserimento di più valori di riga in una singola colonna

In questo momento, ho una matrice implosa che mi dà un valore come questo:

('12', '13', '14')

Questi numeri sono il nuovi ID di cui desidero inserire nel DB.
Il codice che ho usato per implodere l'array è questo:

$ combi = "('" .implode (" ''"., $ Box) "')"; // Dove $ scatola è la matrice iniziale

La domanda di cui ho intenzione di usare viene bloccato qui:

mysql_query (" INSERT INTO studentcoursedetails (studentID) VALORI

Un'opzione sarebbe quella di ripetere questo, ma non posso, perché l'array verrà ripetuta, potrebbero esserci 3 ID, ci potrebbero essere 20.
Un ciclo non sembra giusto. Qualsiasi aiuto sarebbe apprezzato.

+1

È necessario utilizzare un loop e un database _normalized_. Una colonna che contiene più valori non è normalizzata. – Oded

+0

Un loop è esattamente come dovresti risolvere questo, vedi http://php.net/manual/en/control-structures.foreach.php – Andomar

risposta

3

Per inserire più di un valore in una tabella è necessario utilizzare (valore1), (value2) sintassi:

$combi = "('".implode("'), ('",$box)."')"; 

PS: Questa funzione è chiamata valore fila costruttori ed è disponibile dal SQL-92

+2

Oracle ha terminato l'implementazione di SQL-92? SQL Server supporta i valori (..), (..) solo dal 2008 in poi – RichardTheKiwi

+0

Non pensare che aggiungerebbero una nuova sintassi per quello. Ci sono già due modi per farlo in oracle, che ho trovato qui: http://stackoverflow.com/questions/883706/inserting-multiple-rows-into-oracle – meze

2

si può non fare qualcosa di simile:

for($x = 0; $x < count($box); $x++) 
{ 
    mysql_query("INSERT INTO studentcoursedetails (studentID) VALUES ($box[$x]); 
} 

Questo funziona direttamente sul vostro array, inserire una nuova riga per ogni valore di $ scatola e anche prevenire la necessità di implodere l'array a un delimitato da virgole stringa

La memorizzazione degli ID come una stringa delimitata da virgole potrebbe inizialmente sembrare un modello semplice, ma a lungo termine ciò non causerà alcun problema quando si tenta di utilizzare un database non normalizzato.

+0

In realtà il suggerimento da cyberkiwi è migliore in quanto ciò richiede solo 1 chiamata DB mentre il mio richiederebbe tuttavia molti valori ci sono nell'array. Entrambi ottengono esattamente la stessa cosa, ma la soluzione cyberkiwis creerebbe meno carico sia in PHP che in MySQL. – MrEyes

1

È ancora possibile creare l'istruzione tramite implode. Basta non usare VALORI; Utilizzare l'opzione Seleziona invece

$combi = " ".implode(" UNION ALL SELECT ",$box)." "; // Where $box is the initial array 
mysql_query("INSERT INTO studentcoursedetails (studentID) SELECT " . $combi) 

Il SELECT .. union è portabile su molti DBMS.

Nota sugli ID: se si tratta di numeri, non citarli.

0

Verificare se esiste una variante della funzione mysql_query che opererà su un parametro dell'array.

2

Alcuni sapori di SQL consentono inserti composti:

insert into studentcoursedetails (studentid) values 
    (1), 
    (2), 
    (3), 
2

Se si sta utilizzando MySQL, è possibile inserire più valori in una sola frase:

sql> insert into studentcoursedetails (studentID) 
    > values (('12'), ('13'), ('14')); 

Quindi, non vi resta che accumulo quella stringa in PHP e il gioco è fatto.

Problemi correlati