[PHP] Checkbox e valori multipli in una colonna

  • Creatore Discussione Creatore Discussione Monte95
  • Data di inizio Data di inizio

Monte95

Nuovo Utente
27 Mar 2017
12
0
1
30
Salve a tutti, sono un nuovo utente del forum.
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 sto utilizzando come dbms PostgreSql.

-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,
ecc ...
PRIMARY KEY(id)
);

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

-Ho una tabella "domini" che elenca tutti i domini inseriti, dove la PRIMARY KEY e 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
 
Ultima modifica:
Ciao F107 grazie per la tua risposta.
Ho provato a fare come dici tu ma mi restituisce il seguente errore:

Codice:
ERROR:  foreign key constraint "domini_id_tema_fkey" cannot be implemented
DETAIL:  Key columns "id_tema" and "id" are of incompatible types: integer[] and integer.
In statement:

CREATE TABLE domini (
    id                        serial UNIQUE,
        dominio                varchar (100) NOT NULL,       
        prezzo                      numeric (7,2),
        data_registrazione     varchar (10),
        periodo_registrazione  varchar (50),
        scadenza               varchar (10),
        id_cliente           integer       NOT NULL,
        id_tema                integer       ARRAY,
        id_plugin              integer       NULL,
        note                   varchar (500),           

        PRIMARY KEY(id,dominio),
        FOREIGN KEY (id_cliente)  REFERENCES clienti (id) ON UPDATE cascade ON DELETE RESTRICT,
        FOREIGN KEY (id_tema)  REFERENCES temi (id) ON UPDATE cascade ON DELETE RESTRICT,
        FOREIGN KEY (id_plugin)  REFERENCES plugin (id) ON UPDATE cascade ON DELETE RESTRICT

);

Hai una soluzione? Grazie
 
Sono fermo alla versione 8.4.20
Ho fatto richiesta al nostro sistemista per l'aggiornamento alla versione 9.3
Dopodiché come procedo più nello specifico? Grazie mille
 
con la 8.4 non so cosa sia possibile fare, forse puoi togliere la foreign key per l'id_tema e gestirlo con la logica
 
Intendevo se puoi gentilmente dirmi cosa dovrò fare dopo l'aggiornamento alla versione 9.3
 
Teoricamente basta togliere questo:
Codice:
FOREIGN KEY (id_tema)  REFERENCES temi (id) ON UPDATE cascade ON DELETE RESTRICT,

e cambiare questo:
Codice:
id_tema integer       NULL,

in:
Codice:
id_tema integer[] ELEMENT REFERENCES temi(id),

Prova e fammi sapere quando puoi
 
  • Like
Reactions: Monte95
Purtroppo mi è stato detto dal mio sistemista che non posso procedere all'aggiornamento di PSQL in quanto possiedo un server MANAGED con CloudLinux e cPanel/WHM .
Al momento utilizzo, quindi, la versione stabile di PostgreSQL:
Codice:
# psql --version
psql (PostgreSQL) 8.4.20
contains support for command-line editing

F107 come posso procedere secondo te per risolvere il mio problema?
 
togliere la foreign key per l'id_tema e gestirlo con la logica.
altrimenti devi fare una tab di connessione, ma non mi piacciono molto con postgresql
 
E se provassi a lavorare non più sul "id" ma su "tema" ?? che è pur sempre una PK di "temi", però è di tipo varchar e non integer.... ovvero:
Codice:
CREATE TABLE temi (

        id                           serial UNIQUE,
        tema                      varchar (100) ARRAY NOT NULL UNIQUE,       
        nome_file            varchar (100)  NOT NULL,             
        prezzo                   numeric (7,2),
        data_acquisto     varchar (10),
        licenza_tema       varchar (500),
        note                       varchar (500),
        multisito              varchar (50),
          
        PRIMARY KEY(id,tema)

);

Codice:
CREATE TABLE domini (
        id                                        serial                     UNIQUE,
        dominio                            varchar (100)       NOT NULL,       
        prezzo                                numeric (7,2),
        data_registrazione         varchar (10),
        periodo_registrazione   varchar (50),
        scadenza                           varchar (10),
        id_cliente                         integer                     NOT NULL,
        id_tema                            varchar                    ARRAY NULL UNIQUE,
        note                                    varchar (500),           

        PRIMARY KEY(id,dominio),
        FOREIGN KEY (id_cliente)  REFERENCES clienti (id) ON UPDATE cascade ON DELETE RESTRICT,
        FOREIGN KEY (id_tema)  REFERENCES temi (tema) ON UPDATE cascade ON DELETE RESTRICT

);

E' fattibile procedere in questo modo secondo te?
Le tabelle sono riuscito a crearle in questo modo, però non so esattamente come procedere in quanto non so come fare per lavorare con colonne array. Puoi aiutarmi perfavore?

Grazie mille :)
 

Discussioni simili