PHP/SQL Inserire più valori in una colonna di tipo integer - Checkbox -

Monte95

Nuovo Utente
27 Mar 2017
12
0
1
25
Salve a tutti, ho bisogno del Vs aiuto... sicuramente sarà più banale la soluzione del formularvi il quesito (vi chiedo scusa in anticipo, cercherò di essere il più chiaro possibile):

Premetto che possiedo un server MANAGED con CloudLinux e cPanel/WHM e sto utilizzando come dbms PostgreSql (fermo alla versione 8.4.20).

-Ho una tabella "temi" che elenca tutti i temi inseriti, dove la PRIMARY KEY e di tipo SERIAL (INTEGER) ed è l' "id":

------------------------
Codice:
CREATE TABLE temi (
id serial UNIQUE,
tema varchar (100) NOT NULL UNIQUE,
ecc ...
PRIMARY KEY(id,tema)
);
------------------------

-Ho una tabella "domini" che elenca tutti i domini inseriti, dove la PRIMARY KEY è di tipo SERIAL (INTEGER) ed è l' "id", poi c'è una FOREIGN KEY di tipo INTEGER che fa riferimento alla tabella "temi" al campo "id" ("id_temi"):

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

Codice:
CREATE TABLE domini (
id serial UNIQUE,
ecc ...
id_tema integer       NULL,
... ,
PRIMARY KEY(id),
FOREIGN KEY (id_tema)  REFERENCES temi (id) ON UPDATE cascade ON DELETE RESTRICT
);
------------------------

Ho la necessità di inserire nel form di inserimento domini, una checkbox che mi elenchi ogni record della tabella "temi", dove ovviamente possa dare la spunta a più record.
Fino a quì nessun problema; ho risolto così:

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

Codice:
$query= "SELECT * FROM temi;";
$result= pg_query($query) or die('Query failed: ' . pg_last_error());

echo "<label>Tema associato: <br> <br> <label class='check'>";

while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {

$elenco_temi= array($line[id]);
foreach($elenco_temi as $p) {

echo "<input type='checkbox' name='id_tema[]' ";
if ($p == $id_tema) {
echo " selected ";
                                       }
 if ($p != 0) {
echo "value=$p>$line[tema] : (ID = $p) <br>";           } else {
echo "value=$p>Nessun tema <br>";
                                    }
}                                                            
}
echo "</label><br>";
------------------------

Il problema si verifica quando seleziono più temi dalla checkbox ed invio i dati al db.
Non so come fare ad inserire più valori (che di natura sono di tipo INTEGER) in una colonna della mia tabella "domini" che anch'essa è di tipo INTEGER in quanto è una chiave esterna che fa riferimento alla chiave primaria (di tipo INTEGER) della tabella "temi".

Al momento ho optato per questa soluzione (errata):

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

Codice:
$id_tema        = $_POST[id_tema];

$string="";
for($i=0;$i<sizeof($id_tema);$i++){
$string .= $id_tema[$i]." "; }

$query = "INSERT INTO domini(id_tema) VALUES ('$string');";

$result = pg_query($query) or die('Query failed: ' . pg_last_error());

pg_free_result($result);
pg_close($dbconn);
------------------------

Così facendo, creo una stringa contenente tutti gli id dei temi selezionati in precedenza separati dal carattere -spazio-.
L'errore infatti è il seguente:

Query failed: ERROR: invalid input syntax for integer: "9 11 " LINE 1: id_tema) VALUES ('''9 11 '... ^

Come posso risolvere??

spero di essere stato chiaro. Grazie mille a tutti in anticipo.

Manuel
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.041
146
63
PR
www.borgo-italia.it
ciao
forse dico una bestialità non potresti settare id_tema a varchar e poi trasformare dove ti serve quei valori in intero?
scusa dimenticavo:
da quello che capisco si tratta di una relazione "molti a molti" quindi forse ti converrebbe fare una terza tabella che leghi alcune riche della prima con alcune righe della seconda
 
Ultima modifica:
  • Like
Reactions: Monte95

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
Ho una tabella "temi" che elenca tutti i temi inseriti, dove la PRIMARY KEY e di tipo SERIAL (INTEGER) ed è l' "id":
PRIMARY KEY(id,tema)
scusa ma io leggo che la primary key è una chiave composta dalla colonna id e tema
ed è già "fuori luogo", per fare una ricerca che usi quella chiave devi conoscere entrambi i valori associati, cosa che di solito non è

FOREIGN KEY (id_tema) REFERENCES temi (id)
qui fai riferimento ad una colonna non ad un indice

non guardo altro,

seguendo il tuo ragionamento, puoi risolvere il problema con un' array che contiene l'id dei temi scelti e che serializzi per la scrittura nel db
ma è una soluzione "debole", se cancelli un tema ed il relativo id, ti rimangono nel db informzioni errate
vedi post di Borgo
 
  • Like
Reactions: Monte95

Monte95

Nuovo Utente
27 Mar 2017
12
0
1
25
ciao
forse dico una bestialità non potresti settare id_tema a varchar e poi trasformare dove ti serve quei valori in intero?
scusa dimenticavo:
da quello che capisco si tratta di una relazione "molti a molti" quindi forse ti converrebbe fare una terza tabella che leghi alcune riche della prima con alcune righe della seconda

Ti ringrazio per la tua risposta. Al momento ho dovuto, per questioni di tempo, mettere da parte tutto e andare avanti in altre cose. Non appena ci rimetto la testa, ti farò sapere come ho proceduto.
Mi sembra comunque un ottima idea quella di creare una terza tabella.
Grazie mille per il momento.