Visualizzazione risultati 1 fino 6 di 6
Like Tree1Likes
  • 1 Post By mzanella

Discussione: Ricerche di porzioni

  1. #1
    exlot non è connesso Utente giovane
    Data registrazione
    14-06-2016
    Messaggi
    38

    Predefinito Ricerche di porzioni

    buongiorno a tutti, stavo provando a creare un piccolo forum interno al sito, ma i permessi di lettura e scrittura mi inchiodano nella logica di controllo.

    Nel database ho questa stringa di controllo '001,002,00,01' che equivale all'id del gruppo utenti, poi ho gli utenti con 5 campi gruppo che messi in una variabile appaiono così '95030,00100,21605,,30000'.

    Codice PHP:
    $result = strpos($icone,$lettura);
    Ho pensato di usare STRPOS ma non va. In pratica dalla variabile $lettura tiro fuori i permessi che sono indicati a 3 cifre o 2 cifre. Se tre cifre sono le prime tre da sinistra in $icone, altrimenti se sono due cifre, sono le prime due da destra dentro $icone...

    che tipo di funzione si può usare per fare la ricerca?

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Detta così sembra piuttosto caotica, bisogna capire bene cosa stai facendo e come.

    Nel database ho questa stringa di controllo '001,002,00,01' che equivale all'id del gruppo utenti
    Se capisco bene, un valore come 001,002,00,01 vuol dire che una riga "appartiene" ai gruppi i cui id sono 001, 002, 01 e 01. In pratica hai un vettore di id che hai serializzato codificandolo come stringa ed inserito nella base di dati. Questo approccio, benché possibile, ti impedisce di sfruttare le capacità relazionali di MySQL. Concretamente significa che operazioni come quella che interessa a te dovrai realizzarle a mano anziché usare le funzioni che MySQL ti mette a disposizione (in particolare le JOIN).

    poi ho gli utenti con 5 campi gruppo che messi in una variabile appaiono così '95030,00100,21605,,30000'.
    Discorso analogo al precedente.

    Ho pensato di usare STRPOS ma non va. In pratica dalla variabile $lettura tiro fuori i permessi che sono indicati a 3 cifre o 2 cifre.
    Questi "permessi" cosa sono? Gli id dei gruppi?

    Se tre cifre sono le prime tre da sinistra in $icone, altrimenti se sono due cifre, sono le prime due da destra dentro $icone...
    Presa questa frase così com'è, senza nemmeno cercare di capirla, la traduzione in pseudocodice potrebbe essere:
    Codice:
    if (strlen($lettura) == 3) {
        $digits = substr($icone, 0, 3);
        return $lettura == $digits;
    }
    elseif (strlen($lettura) == 2) {
        $digits = substr($icon, 0, 2);
        return $lettura == $digits;
    }
    Che si può esprimere in modo compatto in:
    Codice:
    return $lettura == substr($icone, 0, strlen($lettura));

    I suggerimenti che do più spesso:


  3. #3
    exlot non è connesso Utente giovane
    Data registrazione
    14-06-2016
    Messaggi
    38

    Predefinito

    alla fine ho fatto così, dici possa andare bene?
    Anche se ho un utente che al momento non riesce ad accedere pur avendo i permessi abilitati ...

    lui ha codice : 01100 ... credo che inserendo un codice a 5 cifre nelle condizioni non vada bene... manca il controllo in quel senso.

    Codice PHP:
    $id=filter_var(trim($_GET['id']), FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $sql='SELECT * FROM t_forum WHERE id = "'.$id.'" ';
    $result = mysqli_query($dbLink,$sql);
    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
    $nome=$row['nome'];
    $descrizione=$row['descrizione'];
    $genitore=$row['genitore'];
    $tipo =$row['tipo'];
    $lettura = explode(',',$row['lettura']);
    $scrittura = explode(',',$row['scrittura']);
    mysqli_free_result($result);

    $sql='SELECT * FROM t_utenti WHERE utente = "'.$_SESSION['utente'].'" ';
    $result = mysqli_query($dbLink,$sql);
    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
    $permessi=$row['icoView'];
    $gruppo= substr($row['icoView'],0,3);
    $grado= substr($row['icoView'],3,5);
    mysqli_free_result($result);

    if ( !empty(
    $lettura[0]) ) { $avviso='accesso riservato'; }
    $check = 0;
    for (
    $i = 0, $n = count($lettura) ; $i < $n ; $i++) { if($lettura[$i]===$gruppo ) { $check=1; } }
    for (
    $i = 0, $n = count($lettura) ; $i < $n ; $i++) { if($lettura[$i]===$grado ) { $check=1; } }
    if(
    $lettura[0]!='' && $check == '0' ) { echo ' - ACCESSO VIETATO - '; exit; }
    if(
    $scrittura[0]!='') {
    for (
    $i = 0, $n = count($scrittura) ; $i < $n ; $i++) { if($scrittura[$i]===$gruppo ) { $check=1; } }
    for (
    $i = 0, $n = count($scrittura) ; $i < $n ; $i++) { if($scrittura[$i]===$grado ) { $check=1; } }
    if(
    $check == '1' ) { $scrivi=1; }
    } else {
    $scrivi=1;}

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Mah, è un codice e immagino possa funzionare... la logica non la capisco, in ogni caso penso sarebbe più pratico ridefinire la struttura del database in termini relazionali.

    Comunque alcune cose si possono semplificare, per esempio anziché
    Codice PHP:
    for ($i = 0, $n = count($lettura) ; $i < $n ; $i++) { if($lettura[$i]===$gruppo ) { $check=1; } }
    for (
    $i = 0, $n = count($lettura) ; $i < $n ; $i++) { if($lettura[$i]===$grado ) { $check=1; } }
    si può riscrivere come:
    Codice PHP:
    $check = (in_array($gruppo, $lettura) || in_array($grado, $lettura)) ? 1 : 0;

    I suggerimenti che do più spesso:


  5. #5
    exlot non è connesso Utente giovane
    Data registrazione
    14-06-2016
    Messaggi
    38

    Predefinito

    cerco di spiegare la situazione :
    gioco di ruolo. All'interno del quale ci sono dei gruppi. Ogni gruppo ha un suo codice, ogni grado nel gruppo ha un codice composto dal codiceGruppo+codiceGrado.

    Ogni gruppo grado o anche gruppo+grado ti abilita delle funzioni. Al momento sto cercando di aprire le cartelle forum per queste 3 condizioni.

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    gioco di ruolo. All'interno del quale ci sono dei gruppi. Ogni gruppo ha un suo codice, ogni grado nel gruppo ha un codice composto dal codiceGruppo+codiceGrado.
    Chiaro, e si presta bene ad una struttura di questo tipo
    Codice:
    CREATE TABLE gruppo (
        id INT AUTO_INCREMENT PRIMARY KEY,
        codice VARCHAR(255) UNIQUE,
    );
    
    CREATE TABLE grado (
        id INT AUTO_INCREMENT PRIMARY KEY,
        id_gruppo INT,
        codice VARCHAR(255)
    );
    
    CREATE TABLE permesso (
        id_grado INT,
        nome_risorsa VARCHAR(255),
        lettura INT DEFAULT 0,
        scrittura INT DEFAULT 0
    );
    
    CREATE TABLE grado_utente (
        id_utente INT,
        id_grado VARCHAR(255)
    più le opportune migliorie, come l'uso di chiavi esterne.

    Così facendo diventa semplice verificare se l'utente con id X ha accesso in lettura o scrittura alla risorsa Y:
    Codice:
    SELECT * FROM grado_utente JOIN permesso ON grado_utente.id_grado = permesso.id_grado WHERE id_utente = X AND nome_risorsa = "Y";
    Il risultato sarebbe nella forma:
    Codice:
    | id_utente | id_grado | nome_risorsa | lettura | scrittura |
    |         X |        1 |            Y |       0 |         0 |
    |         X |        3 |            Y |       1 |         0 |
    |         X |      156 |            Y |       0 |         1 |
    programmazioned likes this.

    I suggerimenti che do più spesso:


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •