Pagina 2 di 2

Re: Aiuto relazione database

Inviato: mer 17 ott 2012, 18:38
da lablinux
php non lo conosco benissimo, in un progetto testavo, prima di ogni azione la pagina in cui si trovava e se l'utente era abilitato. Ma nel mio caso era più semplice, bastava loggarsi e avevi accesso a tutto.

-> brevemente:
se non si è sulla pagina di login e neppure quella di errore
se l'utente non è loggato (!ABILITATO) vado alla pagina di login, altrimenti proseguo.

Codice: Seleziona tutto

// se non c'� user o password , chiamo la pagina di login (a meno che non sia gi� la pagina di login)
if ( $_SERVER['SCRIPT_NAME'] != $URL_PATH. 'login.php' and $_SERVER['SCRIPT_NAME'] != $URL_PATH. 'errore.php') {
	if(!isset($_COOKIE['ABILITATO']) ){
		header('location: ' . $URL_PATH .  'login.php');
	}else{
		//  Nella home page visiualizzo l'elenco delle richieste inserite
		require_once $LVL_PATH . 'include/cls_utente.php';
		$dataDB = new DB_SCORPORI($_COOKIE['AMB_DB2']);
	}
}

Nel tuo caso la seconda if la dovresti fare più complicata. Mettendo in join (con una and) il ruolo e la pagina che stai per visualizzare.
Opure la potresti fare più sporca, se usi il giochino dei ruoli (non è per adulti), classifichi le pagine in base al ruolo (magari in un array) e se coincide la chiave prosegui altrimenti ciccia.

Codice: Seleziona tutto

$array = array(
    "pagina1" => array(1,2,3),
    "pagina2" => array(1,3)
);

Re: Aiuto relazione database

Inviato: mer 17 ott 2012, 23:24
da darkstaring
non ho capito molto a dir la verità..
comunque io in admin ho un'intero che parte da 0 a 9... 0 sta per il superadmin,1 sede, 2 dipendente..
lablinux ha scritto: Nel tuo caso la seconda if la dovresti fare più complicata. Mettendo in join (con una and) il ruolo e la pagina che stai per visualizzare.
Opure la potresti fare più sporca, se usi il giochino dei ruoli (non è per adulti), classifichi le pagine in base al ruolo (magari in un array) e se coincide la chiave prosegui altrimenti ciccia.

Codice: Seleziona tutto

$array = array(
    "pagina1" => array(1,2,3),
    "pagina2" => array(1,3)
);
io pensavo ad un (SE admin > 0 ) vai fuori se per esempio quella risorsa deve essere vista solo dall'admin....
ho organizzato il sito in directory, per esempio appuntamenti, report ecc... io verifico se il percorso (quella directory) del file in esecuzione è autorizzato da quell'utente...

Mi è venuto in mente così dal niente... :)
Ancora non conoscevo la funzione
header("location: http://....);
grazie

Re: Aiuto relazione database

Inviato: gio 18 ott 2012, 9:13
da lablinux
si si, l'idea è quella, la mia era una possibile soluzione. Un censimento univoco di tutte le pagine ( "pagina1", "pagina2") con i ruoli ( array(1,2,) ).
Oppure inserisci all'interno di ogni pagina i codici (0,1,2,...9) di chi può accedere alla risorsa.
Vedi tu, ci sono N soluzioni al problema. Scegli quella che ti piace o che ti sembra migliore.

Re: Aiuto relazione database

Inviato: gio 18 ott 2012, 15:33
da darkstaring
Chiedo un'altra cosa.. :o

In pratica vorrei che una tabella che contiene 2 chiavi esterne ed una chiave primaria
potesse avere la possibilità di non avere record "doppi"... pensavo ad unique ma è la coppia dei valori a non doversi ripetere..
Quindi credo che debbo creare una chiave composta ed usare quella come chiave primaria...
Sbaglio??? sapete anche aiutarmi a crearla???
questo è il dump della tabella alla situazione attuale:

Codice: Seleziona tutto

CREATE TABLE `dip_sedi` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_dip` int(11) NOT NULL,
  `id_sede` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id_dip` (`id_dip`),
  KEY `id_sede` (`id_sede`),
  CONSTRAINT `dip_sedi_ibfk_1` FOREIGN KEY (`id_dip`) REFERENCES `dipendenti` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
  CONSTRAINT `dip_sedi_ibfk_2` FOREIGN KEY (`id_sede`) REFERENCES `sedi` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
in pratica vorrei impedire di scrivere un record se la coppia (id_dip e id_sede) è già presente..
Sono stato comprensibile?
Grazie

Re: Aiuto relazione database

Inviato: gio 18 ott 2012, 17:03
da lablinux
prova a sostituire

Codice: Seleziona tutto

KEY `id_dip` (`id_dip`),
KEY `id_sede` (`id_sede`),
(oppure aggiungi)

Codice: Seleziona tutto

KEY `id_dip_set` (`id_dip`, 'id_sede')
Poi, se funziona, aggiungi il parametro unique.

Re: Aiuto relazione database

Inviato: gio 18 ott 2012, 20:50
da kreen
Ciao. credi bene.
darkstaring ha scritto:n pratica vorrei che una tabella che contiene 2 chiavi esterne ed una chiave primaria
potesse avere la possibilità di non avere record "doppi"... pensavo ad unique ma è la coppia dei valori a non doversi ripetere..
Quindi credo che debbo creare una chiave composta ed usare quella come chiave primaria...
Se ho letto bene lo schema, la cardinalità della relazione sedi e dipendenti è molti a molti. Hai commesso un errore in dip_sedi mettendo come chiave primaria id.
Togli id e metti come chiave primaria id_dip e id_sede. :thumbright:

Re: Aiuto relazione database

Inviato: gio 18 ott 2012, 21:28
da kreen
Dimenticavo, scusa
id_dip int(11) references dipendenti(id),
id_sede int(11) references sedi(id),
PRIMARY KEY (id_dip,id_sede)....

Una curiosità: perché quel NO ACTION in caso di cancellazione di record dalla tabella Master? Non sono contemplate eliminazioni di personale nell'azienda (faccio subito domanda, allora \:D/ )?

Re: Aiuto relazione database

Inviato: gio 18 ott 2012, 23:50
da darkstaring
Ho modificato la tabella così:

Codice: Seleziona tutto

mysql> describe dip_sedi;
+---------+---------+------+-----+---------+----------------+
| Field   | Type    | Null | Key | Default | Extra          |
+---------+---------+------+-----+---------+----------------+
| id      | int(11) | NO   | UNI | NULL    | auto_increment |
| id_dip  | int(11) | NO   | PRI | NULL    |                |
| id_sede | int(11) | NO   | PRI | NULL    |                |
+---------+---------+------+-----+---------+----------------+
kreen ha scritto:Una curiosità: perché quel NO ACTION in caso di cancellazione di record dalla tabella Master? Non sono contemplate eliminazioni di personale nell'azienda (faccio subito domanda, allora \:D/ )?
Grazie.. credo che hai perfettamente ragione riguardo il no-action in caso di eliminazione...
Lasciando così, nel caso una sede venga eliminata rimangono le associazioni in dipendenti e viceversa... Grazie dell'osservazione :D

Re: Aiuto relazione database

Inviato: gio 18 ott 2012, 23:59
da darkstaring
darkstaring ha scritto:Direi di si... Anche io adesso sono arrivato a questa conclusione....nessuna relazione da utenti, ma solo un controllo al momento del login.
Tornando alla tabella utenti per un'attimo mi sono reso conto che non avere un'associazione è grave! :)
Se per esempio un dipendente viene eliminato il suo utente rimane... stesso discorso per le sedi...
Domani vedrò di darle uno sguardo anche a questo..

Re: Aiuto relazione database

Inviato: ven 19 ott 2012, 7:56
da kreen
Ciao,
non vorrei essere pedante, mi scuso.
Non capisco perché mantieni l'attributo id nella relazione. Non ha nessuna utilità e consuma risorse.
Tieni conto che il dbms crea automaticamente gli indici per la chiave primaria e quindi un campo id non solo crea una ridondanza, ma in questo caso di cardinalità è concettualmente sbagliato.

Ma non i sento di insistere ulteriormente.

Re: Aiuto relazione database

Inviato: ven 19 ott 2012, 8:59
da lablinux
Forse ti posso riposndere io. In caso di utilizzo di un framework che si appoggioa ad un ORM (Django, Rails, CakePHP, Symphony) è indispensabile un campo autoincrementale.
In oltre considera che se è autoincrementale in caso di insert non devi neppure considerare il campo.
Aggiungo, che non è detto che aumenti lo spazio, dipende con quante altre tabelle è legata la tabella con il campo id. Se ha più di un legame, devi riportare solo un campo sulle collegate al posto di due.

Re: Aiuto relazione database

Inviato: ven 19 ott 2012, 9:21
da kreen
lablinux ha scritto:Forse ti posso riposndere io. In caso di utilizzo di un framework che si appoggioa ad un ORM (Django, Rails, CakePHP, Symphony) è indispensabile un campo autoincrementale.
In oltre considera che se è autoincrementale in caso di insert non devi neppure considerare il campo.
Ah, grazie. Questo non lo sapevo. Io non ho mai esplorato il paradigma ad oggetti nei DBMS. Sono fermo alla vecchia scuola :)
lablinux ha scritto: Aggiungo, che non è detto che aumenti lo spazio, dipende con quante altre tabelle è legata la tabella con il campo id. Se ha più di un legame, devi riportare solo un campo sulle collegate al posto di due.
Vero, riguardo lo spazio hai perfettamente ragione. :-k

Re: Aiuto relazione database

Inviato: lun 22 ott 2012, 9:26
da darkstaring
A proposito di spazio consumato, ho una tabella che contiene date, il problema è che ho una data di partenza ed una di fine..
Attualmente chiedo le 2 date e scrivo dentro la tabella mediante un ciclo for scrivendo tutte le date, da quella di partenza a quella di arrivo creando così un sacco di dati.

Vorrei modificare mettendo 2 campi con appunto la data di partenza e quella di fine ma poi posso sapere tutti i record presenti dato un giorno?
Grazie

Re: Aiuto relazione database

Inviato: lun 22 ott 2012, 9:50
da lablinux
Non ho capito il problema, ma trattandosi di un altro argomento, e quello sulle relazioni sembra risolto, ti chiederei di aprire una nuova discussione.
Cosi facendo rendi più semplice una ricerca a chi ha un problema simile al tuo.

Re: Aiuto relazione database

Inviato: lun 22 ott 2012, 10:05
da darkstaring
Volevo evitare di aprire più topic.. ma va bene.. grazie