Inserire dati tabella leggendo parte di altra tabella con php

coinfeuropea

Nuovo Utente
11 Set 2017
10
0
1
58
Sámara - Costa Rica
Salve a tutti.
Scusate la mia ignoranza, pero ho la necessitá di inserire dati in una tabella dopo un inserimento in un'altra tabella.
Mi spiego meglio:

Sto cercado di crere un sistema di accesso a un sito web con regole specifiche per ogni usario,
perció ho 3 tabelle, una tabella module, una role e una role_rights.

Nella tabella module ho i dati dei menu e delle pagine, nella role i tipi di utente e nella role_rights quello che possono fare gli utenti.


Codice:
CREATE TABLE `module` (
`mod_modulegroupcode` varchar(25) NOT NULL,
`mod_modulegroupname` varchar(50) NOT NULL,
`mod_modulecode` varchar(25) NOT NULL,
`mod_modulename` varchar(50) NOT NULL,
`mod_modulegrouporder` int(3) NOT NULL,
`mod_moduleorder` int(3) NOT NULL,
`mod_modulepagename` varchar(255) NOT NULL,
`mod_type` enum('add','edit','normal') NOT NULL DEFAULT 'normal'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `module` (`mod_modulegroupcode`, `mod_modulegroupname`, `mod_modulecode`, `mod_modulename`, `mod_modulegrouporder`, `mod_moduleorder`, `mod_modulepagename`, `mod_type`) VALUES
('SITE', 'Site', 'HOME', 'Home', 1, 0, home.php', 'normal');


CREATE TABLE `role` (
`role_rolecode` varchar(50) NOT NULL,
`role_rolename` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `role` (`role_rolecode`, `role_rolename`) VALUES
('ADMIN', 'Administrator'),
('UTENTE SEMPLICE', 'Utente Semplice'),
('SUPERADMIN', 'Super Admin');

[CODE]CREATE TABLE `role_rights` (
`rr_rolecode` varchar(50) NOT NULL,
`rr_modulecode` varchar(25) NOT NULL,
`rr_create` enum('yes','no') NOT NULL DEFAULT 'no',
`rr_edit` enum('yes','no') NOT NULL DEFAULT 'no',
`rr_delete` enum('yes','no') NOT NULL DEFAULT 'no',
`rr_view` enum('yes','no') NOT NULL DEFAULT 'no',
`rr_order` enum('yes','no') NOT NULL DEFAULT 'no',
`rr_show` enum('yes','no') NOT NULL DEFAULT 'no'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `role_rights` (`rr_rolecode`, `rr_modulecode`, `rr_create`, `rr_edit`, `rr_delete`, `rr_view`, `rr_order`, `rr_show`) VALUES
('UTENTE SEMPLICE', 'HOME', 'no', 'no', 'no', 'yes', 'no', 'no'),


Necessito che quando inserisco un record nuovo in module faccia una select della role e inserisca in role_rights:

role_rights.rr_rolecode = role.role_rolecode (select role_rolecode from role)

role_rights.rr_modulecode = module.mod_modulecode (appena inserito)

questo dovrebbe inserire un record per ogni record restituito dalla select nella tabella role.

esempio:

admin - home
superadmin - home
utente semplice - home

questo è il codice que uso per inserire il module:

codice:
PHP:
 try {
  $sql = "INSERT INTO " . TBL_MODULE . " (`mod_modulecode`, `mod_modulegroupcode`, `mod_modulegroupname`, `mod_modulename`, `mod_modulegrouporder`, `mod_moduleorder`, `mod_modulepagename`, `mod_type`) VALUES :modulecode, :modulegroupcode, :modulegroupname, :modulename, :modulegrouporder, :moduleorder, :modulepagename, :type)";
      $stmt = $DB->prepare($sql);
$stmt->bindValue(":modulecode", $modulecode);
$stmt->bindValue(":modulegroupcode", $modulegroupcode);
$stmt->bindValue(":modulegroupname", $modulegroupname);
$stmt->bindValue(":modulename", $modulename);
$stmt->bindValue(":modulegrouporder", $modulegrouporder);
$stmt->bindValue(":moduleorder", $moduleorder);
$stmt->bindValue(":modulepagename", $modulepagename);
$stmt->bindValue(":type", $type);

avete una idea di come posso fare?
Grazie a tutti per leggere questo post.
 
Ultima modifica di un moderatore:
questo è il codice que uso per inserire il module:

codice:
PHP:
 try {

  $sql = "INSERT INTO " . TBL_MODULE . " (`mod_modulecode`, `mod_modulegroupcode`, `mod_modulegroupname`, `mod_modulename`, `mod_modulegrouporder`, `mod_moduleorder`, `mod_modulepagename`, `mod_type`) VALUES :)modulecode, :modulegroupcode, :modulegroupname, :modulename, :modulegrouporder, :moduleorder, :modulepagename, :type)";

      $stmt = $DB->prepare($sql);

 
  
$stmt->bindValue(":modulecode", $modulecode);
$stmt->bindValue(":modulegroupcode", $modulegroupcode);
$stmt->bindValue(":modulegroupname", $modulegroupname);
$stmt->bindValue(":modulename", $modulename);
$stmt->bindValue(":modulegrouporder", $modulegrouporder);
$stmt->bindValue(":moduleorder", $moduleorder);
$stmt->bindValue(":modulepagename", $modulepagename);
$stmt->bindValue(":type", $type);

"filomeni, post: 194080, member: 4754"]Basta mettere le query in cascata nell'ordine di inserimento che vuoi tu...

Scusa ma non capisco cosa vuoi dire, questa é lo script che uso per caricare i dati in module, pero io devo i
 
Ultima modifica di un moderatore:
ciao
io ti aiuterei, ma vedo che utilizzi la classe pdo che non ho mai usato, sbaglierò ma non mi piace la programmazione ad oggetti e non ho voglia di impararla.
comunque ho letto quello che hai scritto
tu fai una insert sulla tabella module e sin qui ok
fai una select su role, ma in base a cosa? vuoi estrerre tutti i record della role? o solo quelli che hanno un legame con quanto hai inserito in module?
fatta la select quindi estratti i record e campi (tutti? ribadisco) vuoi inseririli (tutti?) in role_rights?
comunque se spieghi meglio posso darti una mano, ma con mysqli poi eventualmente a tradurlo per la pdo ci pensi tu
 
Ciao Borgo Italia,
grazie per rispondermi.
praticamente la tabella role é la lista degli utenti:
admin
superadmin
utente semplice
franco
pippo
minni
ect.

e il campo que necessito è role_rolecode

per tanto bisogna fare un select role_rolecode from role, pero essendo vari, non so' come inserire nella tabella role_rights
il risultato del loop while.

Necessito che quando inserisco un record nuovo in module faccia una select della role e inserisca in role_rights:

role_rights.rr_rolecode = role.role_rolecode (select role_rolecode from role)

role_rights.rr_modulecode = module.mod_modulecode (appena inserito)

questo dovrebbe inserire un record per ogni record restituito dalla select nella tabella role.

esempio:

admin - home
superadmin - home
utente semplice - home
.........

o

admin - prodotti
superadmin - prodotti
utente semplice - prodotti
.........

gli altri campi della tabella role_rights sono i permessi, pertanto quando inserisco essendo tutti default NO non ho bisogno di inserirli nel insert, in seguito li modifico in base alla pagina e al utente.
Spero di essere stato un po piu chiaro. :)
e ancora grazie per la disponibilitá
 
Ultima modifica:
ciao
scusa se non mi sono fatto sentire, ma come detto ho delle giornate impegnative.
dovrei liberarmi per fine settimana.
se non hai risolto riprendo il discorso dall'inizio e spero di saperti dire
 
ciao
riprendiamo il problema dall'inizio (col tempo ho perso il filo) esaminando le tabelle, su cui mi viene un dubbio: non c'è la chiave primaria (generalmente autoincrement)? se non hai la chiave primaria come fai a distinguere un record dall'altro?
poi ancora, scusa, ma non riesco a capire esattamente cosa vuoi fare.
prendiamo le tabelle
tabella module
Codice:
mod_modulegroupcode varchar(25) NOT NULL,
... ecc ....
mod_type enum('add','edit','normal') NOT NULL DEFAULT 'normal'
tabella role
Codice:
role_rolecode varchar(50) NOT NULL,
role_rolename varchar(50) NOT NULL
tabella role_rights
Codice:
rr_rolecode varchar(50) NOT NULL,
... ecc ...
rr_show enum('yes','no') NOT NULL DEFAULT 'no'
tu fai l'insert in tabella module e sin qui, a parte la primarykey, ok.
ora dici che vuoi fare una select su role, da quello che capisco la role dovrebbe contenere, immagino che tu abbia un solo ADMIN e SUPER ADMIN ma diversi UTENTI SEMPLICI, in questo caso come detto manca l'id del record
Codice:
role_rolecode    role_rolename
ADMIM            Franco
SUPERADMIN        Giuseppe
UTENTE SEMPLICE    Asdrubale
UTENTE SEMPLICE    Sofonisba
UTENTE SEMPLICE    Arcibaldo
è così?
ora dici che vuoi estrarre e inserire i valori in role_rights, ribadisco ma cosa vuoi estrarre? quale record e quale campo/i?
e qui un'altro dubbio
da quello che capisco in role_rights c'è cosa un utente può fare cioè es. il super può fare tutto mentre il semplice può solo vedere (giusto?), se è solo questo a che ti serve estrarre da role? se invece la tabella deve indicare cosa può fare Sofonisba non vedo un legame tra le tabelle.
i due casi sono completamente diversi
nel primo caso la role_rights avrà (considernado l'esempio)
solo tre record es.
Codice:
rr_rolecode    rr_modulecode    rr_create    rr_edit    rr_delete    rr_view enum    rr_order    rr_show enum
ADMIN        ??                no            yes        no            yes                yes            yes
SUPER        ??                yes            yes        yes            yes                yes            yes
SEMPLICE    ??                no            no        no            no                no            no
nel secondo, come detto, manca il legame tra le tabelle
quiundi devi spiegare meglio quello che vuoi fare

comunque un appunto: non conosco il tuo livello di conoscenza, ma ricorda che quando si lavora con i db la parte più difficile (ed importante) non sono i vari script ma organizzare bene la sua struttura, tra l'altro una volta finito è molto più semplice andare a correggere/modificare gli script che la struttura del db
 
Ciao,
grazie per la risposta, ti spiego bene.
l'id del record non mi serve perche è il primo campo.

Non esistono:
ADMIM Franco
SUPERADMIN Giuseppe
UTENTE SEMPLICE Asdrubale
UTENTE SEMPLICE Sofonisba
UTENTE SEMPLICE Arcibaldo

esistono:

ADMIM Nome Cognome
SUPERADMIN Nome Cognome
Asdrubale Nome Cognome
Sofonisba Nome Cognome
Arcibaldo Nome Cognome

ogni utente (role_rolecode della tabella role) deve avere un suo record per ogni role_rights di cada pagina:
Codice:
rr_rolecode    rr_modulecode    rr_create    rr_edit    rr_delete    rr_view enum    rr_order    rr_show enum
ADMIN                ??                no            yes        no            yes                yes            yes
SUPER                 ??                yes            yes        yes            yes                yes            yes
asdrubale             ??                no            no        no            no                no            no
Arcibaldo             ??                no            no        no            no                no            no
sofonidba             ??                no            yes        no            yes                yes            yes

Dove ?? è module.mod_modulecode (appena inserito nella tabell module)

Praticamente devo fare una select di role dopo aver inserito nella tabella module, prendendo solo il campo role.role_rolecode que è unico, e inserire nella tabella role_rights i seguenti risultati:

role_rights.rr_rolecode = role.role_rolecode (select role_rolecode from role)

role_rights.rr_modulecode = module.mod_modulecode (appena inserito)

per quanto riguarda gli altri campi nella tabella role_rights (rr_create rr_edit rr_delete rr_view enum rr_order rr_show enum) sono tutti di default NO.
Spero essermi spiegato bene, perche è un poco incasinato...
E grazie ancora
 
Ultima modifica:
ciao
attento non vuol dire nulla che sia il primo campo, l'importante è avere una primarykey (non è importante che sia numerica anche se è più comodo), se fai così nella tabella role corri il rischio di trovarti esempio in questa situazione
ADMIM Nome Cognome
SUPERADMIN Nome Cognome
Asdrubale Nome Cognome
Sofonisba Nome Cognome
Arcibaldo Nome Cognome
Asdrubale Nome Cognome
il tutto senza contare che senza tale prymary non potrai fare collegamenti tra le tabelle.
poi dici di fare uan select di role dove affermi che il campo è unico, cosa intendi? che gli hai dato il paramtro unique? non lo vedo nella struttura della tabella

ipotizziamo di fare una select di role
PHP:
$query="SELECT role_rolecode FROM role";
$ris=mysqli_query($conn, $query);
tale select se non fai il while per estrarre
PHP:
$stratto=mysql_fetch_assoc($ris);
in $estratto ti ritrovi sempre ADMIN, al che a che ti serve estrare da role?
se usi il while estrai tutti i campi role_rolecode
PHP:
while($riga=mysqli_fetch_assoc($ris)){
    //usiamo un array per conservali
    $estratto[]=$riga['role_rolecod'];
}
in questo caso ti ritrovi
$estratto[0] -> ADMIN
$estratto[1] -> SUPERADMIN
$estratto[2] -> Asdrubale
$estratto[3] -> Sofonisba
$estratto[4] -> Arcibaldo
e se hai fatto l'errore citato ti ritrovi anche
$estratto[5] -> Asdrubale
ora quele di questi campi ti serve?

per fare quelcosa di logico la query di prima per estrarre un campo determinato dovrebbe essere
PHP:
$query="SELECT role_rolecode FROM role WHERE role_rolecode=$qualcosa";
dove $qualcosa deve contenere un valore tra quelli che hai usato per fare l'insert in mod_modulegroupcode, ma io non vedo quale potrebbe essere

mi sbaglierò, ma secondo stai facendo un po' di confusione, salvo che non sia io a continuare a non capire il problema
 
Ciao, Grazie per la risposta.
si, mi sono spiegato male, Il campo della tabella role_rolecode é chiave primaria e percio non esiste duplicato.
Quello que ho bisogno è appunto di fare una select di tutti i valori role_rolecode della tabella role e inserire i risultati nella tabella role_rights e il valore appena ottenuto dal $_POST cioé $modulecode

praticamente devo inserire qualcosa come:

ADMIM, contatti
SUPERADMIN , contatti
Asdrubale , contatti
Sofonisba, contatti
Arcibaldo , contatti

dove contatti è il post $modulecode
forse cosí è un poc piu chiaro, scusa.
 

Discussioni simili