Aiuto relazione database

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
lablinux
Linux 4.x
Linux 4.x
Messaggi: 1212
Iscritto il: gio 27 nov 2008, 12:23
Desktop: Gnome
Distribuzione: Debian testing
Località: Rho

Re: Aiuto relazione database

Messaggio 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)
);

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: Aiuto relazione database

Messaggio 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

Avatar utente
lablinux
Linux 4.x
Linux 4.x
Messaggi: 1212
Iscritto il: gio 27 nov 2008, 12:23
Desktop: Gnome
Distribuzione: Debian testing
Località: Rho

Re: Aiuto relazione database

Messaggio 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.

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: Aiuto relazione database

Messaggio 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

Avatar utente
lablinux
Linux 4.x
Linux 4.x
Messaggi: 1212
Iscritto il: gio 27 nov 2008, 12:23
Desktop: Gnome
Distribuzione: Debian testing
Località: Rho

Re: Aiuto relazione database

Messaggio 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.

Avatar utente
kreen
Linux 2.x
Linux 2.x
Messaggi: 228
Iscritto il: mer 1 feb 2006, 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

Re: Aiuto relazione database

Messaggio 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:

Avatar utente
kreen
Linux 2.x
Linux 2.x
Messaggi: 228
Iscritto il: mer 1 feb 2006, 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

Re: Aiuto relazione database

Messaggio 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/ )?

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: Aiuto relazione database

Messaggio 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

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: Aiuto relazione database

Messaggio 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..

Avatar utente
kreen
Linux 2.x
Linux 2.x
Messaggi: 228
Iscritto il: mer 1 feb 2006, 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

Re: Aiuto relazione database

Messaggio 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.

Avatar utente
lablinux
Linux 4.x
Linux 4.x
Messaggi: 1212
Iscritto il: gio 27 nov 2008, 12:23
Desktop: Gnome
Distribuzione: Debian testing
Località: Rho

Re: Aiuto relazione database

Messaggio 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.

Avatar utente
kreen
Linux 2.x
Linux 2.x
Messaggi: 228
Iscritto il: mer 1 feb 2006, 18:32
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE
Località: Verona

Re: Aiuto relazione database

Messaggio 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

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: Aiuto relazione database

Messaggio 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

Avatar utente
lablinux
Linux 4.x
Linux 4.x
Messaggi: 1212
Iscritto il: gio 27 nov 2008, 12:23
Desktop: Gnome
Distribuzione: Debian testing
Località: Rho

Re: Aiuto relazione database

Messaggio 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.

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: Aiuto relazione database

Messaggio da darkstaring »

Volevo evitare di aprire più topic.. ma va bene.. grazie

Rispondi