Pagina 1 di 6

php / sql - dubbi e domande varie...

Inviato: gio 12 giu 2008, 20:18
da danix
Ciao a tutti,
apro un nuovo thread per non sporcare quest'altro thread...
non riesco a lavorare con i database, o meglio, con le tabelle...
provo a spiegarmi meglio, sto imparando da qualche giorno un po' di php e mysql, dalla shell riesco a gestire bene una tabella degli utenti con le password in chiaro, riesco a visualizzare selettivamente i vari contenuti, però ho un paio di dubbi...
leggendo l'ottimo tutorial di Nino "aschenaz" B. :D , quando è spiegato come gestire l'autenticazione, nel codice della pagina che si occupa di gestire i dati c'è questo commento:

Codice: Seleziona tutto

#  Altrimenti registriamo le nostre variabili di sessione; per praticità, visto che la query,
#+ in questo caso, ci restituisce un'unica riga, usiamo la funzione "mysql_result", coi parametri
#+ "risorsa","riga","chiave", non essendoci bisogno di dover "sfogliare" più righe... 
non conoscendo il php ho pensato che non si potesse estrarre più di una riga con questo statement:

Codice: Seleziona tutto

$_SESSION["utenteautorizzato"]=mysql_result($risultatoamministratore,0,0);
giusto??
ma se io ho più utenti, come faccio a gestire le varie autenticazioni anche contemporaneamente??
ad esempio, io ho creato una tabella "users" strutturata così:

Codice: Seleziona tutto

mysql> DESCRIBE users;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type                | Null | Key | Default | Extra          |
+-------+---------------------+------+-----+---------+----------------+
| ID    | tinyint(3) unsigned | NO   | PRI | NULL    | auto_increment | 
| USER  | varchar(50)         | NO   |     | NULL    |                | 
| PASS  | varchar(255)        | NO   |     | NULL    |                | 
+-------+---------------------+------+-----+---------+----------------+
3 rows in set (0,00 sec)
e con questi dati:

Codice: Seleziona tutto

mysql> SELECT * FROM users;
+----+--------+------------+
| ID | USER   | PASS       |
+----+--------+------------+
|  1 | admin  | 123321     | 
|  2 | danix  | mypass     | 
|  3 | poster | posterpass | 
|  4 | user1  | 555888     | 
|  5 | user2  | 777333     | 
+----+--------+------------+
5 rows in set (0,00 sec)
come faccio a sapere quale utente si sta loggando?

Spero mi aiuterete, grazie mille a tutti...


Ciau

Re: php / sql - dubbi e domande varie...

Inviato: gio 12 giu 2008, 21:54
da aschenaz
Non è che abbia capito molto bene... :-k

Considera che le variabili di sessione sono, per così dire
(ma non è un'espressione felice), come delle variabili lato-client.
Nel momento in cui tu memorizzi l'id dell'utente in una variabile
di sessione, quella variabile rimane memorizzata globalmente
finché non chiudi il browser (o finché non la de-registri tu).
Allo stesso modo, puoi registrare altre variabili di sessione
con l'username etc...
La funzione mysql_result($risorsa,$riga,$chiave) restituisce
un valore unico, corrispondente alla riga di $risorsa numero
$riga ed alla voce numero $chiave. Ad esempio, se la risorsa
$risorsa restituita dalla query "SELECT * FROM utenti", è così
formata...

Codice: Seleziona tutto

ID   user   password
 1    tizio   hjhjhj
 2    caio   llklkll
se voglio sapere la password di tizio, devo richiamare
mysql_result($risorsa,0,2) (ricordando che gli indici partono da 0,
come per gli array), se voglio l'username di caio, avrò
mysql_result($risorsa,1,1) etc...

Ma hai altre possibilità per indicizzare le risorse restituite dalle query:

Codice: Seleziona tutto

while($righequery=mysql_fetch_row($risorsa)) {
   echo 'id = '.$righequery[0].' - user = '.$righequery[1].' ...\n';
}
oppure...

Codice: Seleziona tutto

while($righequery=mysql_fetch_array($risorsa)) {
   echo 'id = '.$righequery["id"].' - user = '.$righequery["user"].' ...\n';
}
oppure ancora (il mio preferito)...

Codice: Seleziona tutto

while($righequery=mysql_fetch_object($risorsa)) {
   echo 'id = '.$righequery->id.' - user = '.$righequery->user.' ...\n';
}
Se vuoi lasciare traccia dei log, puoi scrivere un file di
testo con tutti i login, oppure puoi creare una tabella mysql
ad hoc.

Ma, probabilmente, non ho capito nulla di quello che intendevi. :lol:

Re: php / sql - dubbi e domande varie...

Inviato: ven 13 giu 2008, 0:01
da danix
Adesso che ho un po' più chiaro il discorso delle tabelle di mysql (e anche di php in genere) forse riesco ad esprimermi un po' più chiaramente (nonostante mi stia per addormentare ;) )...
Avevo capito male il senso di quel commento, quando dici che la query ci restituisce un'unica riga, avevo capito che questo statement

Codice: Seleziona tutto

$_SESSION["utenteautorizzato"]=mysql_result($risultatoamministratore,0,0);
avrebbe letto solo dalla riga 0,0, cioè la prima della tabella... invece la query:

Codice: Seleziona tutto

$risultatoamministratore=mysql_query("SELECT ID FROM amministratori WHERE User='$user' AND Pass='$pass'");
si occupa di fare la ricerca, e ovviamente restituisce una sola riga, per cui la sessione viene registrata correttamente utilizzando l'unica riga che si ha a disposizione, e cioè il risultato della query...

Grazie lo stesso dell'aiuto Nino, stasera posso andare a dormire soddisfatto, sono riuscito a creare una sezione nascosta del sito che è visibile solo se si è loggati, e dentro questa sezione sono riuscito a mettere una tabella degli utenti simile a quella che ho postato prima... :D


Ciau...

Re: php / sql - dubbi e domande varie...

Inviato: ven 13 giu 2008, 8:07
da danix
un altro dubbio più che altro concettuale, per gestire utenti con permessi diversi, come mi consigliate di organizzarmi?? una singola tabella con un campo admin (di tipo bool) o 2 directory, una per tutti gli utenti e un'altra solo per quelli amministratori??

Non riesco a organizzare bene le varie tabelle tra loro, si nota?? :D


Grazie mille...

Re: php / sql - dubbi e domande varie...

Inviato: ven 13 giu 2008, 9:31
da aschenaz
danix85 ha scritto:un altro dubbio più che altro concettuale, per gestire utenti con permessi diversi, come mi consigliate di organizzarmi?? una singola tabella con un campo admin (di tipo bool) o 2 directory, una per tutti gli utenti e un'altra solo per quelli amministratori??

Non riesco a organizzare bene le varie tabelle tra loro, si nota?? :D


Grazie mille...
Io in genere uso la prima ipotesi. Anche in Asche è così: un campo, che,
se flaggato, al login registra un'ulteriore variabile di sessione.

Certo, se devi gestire un sito con la registrazione di utenti e devi
raccogliere tante informazioni (indirizzo, telefono, e-mail...), a questo
punto ti conviene usare due tabelle, una degli utenti ed una degli admin
(per questi, infatti, ti bastano username, password, al limite e-mail...).

Per quanto riguarda l'uso del database, leggiti (se non l'hai già fatto) il
paragrafo delle tabelle sul tutorial:
http://www.slacky.eu/wikislack/index.ph ... Le_Tabelle ;
è un buon cosnsiglio che mi ha dato anni fa un docente in un minicorso di
ah-ccess (ovvero ah... che cess di programma! :badgrin: ).

Ciao,
nino

Re: php / sql - dubbi e domande varie...

Inviato: ven 13 giu 2008, 13:57
da danix
ok. adesso ho un'altra domanda (non legata con la precedente)... il sito che sto sviluppando per imparare deve servire delle foto in jpg agli utenti, quindi pensavo di fare una tabella per le immagini con un riferimento al percorso sul disco fisso, ma cercando in rete mi sono imbattuto in un pdf in cui si paragonavano le prestazioni di php nel servire le immagini sia partendo da un database sia dal disco rigido... leggendo ho quindi appreso che si possono memorizzare le immagini direttamente nel database... non sono riuscito però a trovare altre info in merito, qualcuno mi può dare dei chiarimenti??

Grazie mille...

Re: php / sql - dubbi e domande varie...

Inviato: ven 13 giu 2008, 18:02
da aschenaz
danix85 ha scritto:ok. adesso ho un'altra domanda (non legata con la precedente)... il sito che sto sviluppando per imparare deve servire delle foto in jpg agli utenti, quindi pensavo di fare una tabella per le immagini con un riferimento al percorso sul disco fisso, ma cercando in rete mi sono imbattuto in un pdf in cui si paragonavano le prestazioni di php nel servire le immagini sia partendo da un database sia dal disco rigido... leggendo ho quindi appreso che si possono memorizzare le immagini direttamente nel database... non sono riuscito però a trovare altre info in merito, qualcuno mi può dare dei chiarimenti??

Grazie mille...
Si, in teoria puoi salvare anche dei file su database, ma è una cosa
che non ho mai fatto né approfondito.
Io mi limito a salvare il percorso delle immagini...

Ciao,
nino

Re: php / sql - dubbi e domande varie...

Inviato: ven 13 giu 2008, 18:14
da puzuma
Per salvare dati di tipo binario su db devi usare il tipo "blob", normalmente però è sconsigliabile salvare file di grosse dimensioni su db per vari motivi che trovi facilemente elencati su internet.

Quindi su db metti tutte le "meta-info" (nome, descrizione, dimensioni, altezza, larghezza e tutto quello che ti passa per la testa) e il percorso del file salvato su disco.

Se gli utenti possono fare l'upload dei file sta attento a come salvi i file, di solito si salva il nome originale del file su db mentre il file su disco viene salvato con un nome generato sul momento. Questo sia per motivi di sicurezza sia per evitare che se un utente ti carica un file con lo stesso nome di uno già caricato venga sovrascritto il primo.

Re: php / sql - dubbi e domande varie...

Inviato: ven 13 giu 2008, 19:20
da danix
grazie ragazzi, 'sto thread sta diventando sempre più interessante... :D

adesso ho bisogno di un aiuto più "pratico"...
Ho questo codice in una pagina di errore che è effettivamente troppo ripetitivo,

Codice: Seleziona tutto

    <?php
      if ($error_id==1) {
        $error_1_query="SELECT ERR_TEXT FROM site_errors WHERE ID = 1";
        $error_1_result=mysql_query($error_1_query, $connessione);
        $error_1_line = mysql_fetch_row($error_1_result);
        echo "<p id=\"error\">";
        echo "$error_1_line[0]";
        echo "</p>"; 
        echo "\n";
      }
      elseif ($error_id==2) {
        $error_2_query="SELECT ERR_TEXT FROM site_errors WHERE ID = 2";
        $error_2_result=mysql_query($error_2_query, $connessione);
        $error_2_line = mysql_fetch_row($error_2_result);
        echo "<p id=\"error\">";
        echo "$error_2_line[0]";
        echo "</p>"; 
        echo "\n";
      }
      elseif ($error_id==3) {
        $error_3_query="SELECT ERR_TEXT FROM site_errors WHERE ID = 3";
        $error_3_result=mysql_query($error_3_query, $connessione);
        $error_3_line = mysql_fetch_row($error_3_result);
        echo "<p id=\"error\">";
        echo "$error_3_line[0]";
        echo "</p>"; 
        echo "\n";
      }
      elseif ($error_id==4) {
        $error_4_query="SELECT ERR_TEXT FROM site_errors WHERE ID = 4";
        $error_4_result=mysql_query($error_4_query, $connessione);
        $error_4_line = mysql_fetch_row($error_4_result);
        echo "<p id=\"error\">";
        echo "$error_4_line[0]";
        echo "</p>"; 
        echo "\n";
      }
      elseif ($error_id==5) {
        $error_5_query="SELECT ERR_TEXT FROM site_errors WHERE ID = 5";
        $error_5_result=mysql_query($error_5_query, $connessione);
        $error_5_line = mysql_fetch_row($error_5_result);
        echo "<p id=\"error\">";
        echo "$error_5_line[0]";
        echo "</p>"; 
        echo "\n";
      }
      elseif ($error_id==6) {
        $error_6_query="SELECT ERR_TEXT FROM site_errors WHERE ID = 6";
        $error_6_result=mysql_query($error_6_query, $connessione);
        $error_6_line = mysql_fetch_row($error_6_result);
        echo "<p id=\"error\">";
        echo "$error_6_line[0]";
        echo "</p>"; 
        echo "\n";
      }

    ?>
vorrei trasformarlo in una funzione ma non saprei da dove partire per metterci mano... :(
qualcuno mi sa consigliare??

Giusto per esporre meglio il tutto, $error_id va a controllare il valore di eid che è un parametro passato con GET alla pagina in questione... sul database (a cui mi connetto tramite $connessione) ho una tabella così strutturata:

Codice: Seleziona tutto

mysql> SELECT * FROM site_errors;
+----+---------------------+-------------------------------------------------------------------+
| ID | ERR_NAME            | ERR_TEXT                                                          |
+----+---------------------+-------------------------------------------------------------------+
|  1 | 1_login_nouser      | You forgot to insert your login name                              | 
|  2 | 2_login_nopass      | You forgot to insert your password                                | 
|  3 | 3_register_nouser   | You are trying to register a new user with no username            | 
|  4 | 4_register_nopass   | You are trying to register a new user with no password            | 
|  5 | 5_register_db_error | An error occurred in the users database, contact an administrator | 
|  6 | 6_username_exists   | You are trying to register with an already existing username      | 
+----+---------------------+-------------------------------------------------------------------+
Ovviamente il tutto funziona in questo modo, ma è poco estetico per i miei gusti... ;)

mi date una mano??


Grazie mille a tutti...

Re: php / sql - dubbi e domande varie...

Inviato: sab 14 giu 2008, 9:43
da aschenaz

Codice: Seleziona tutto

$errors=array(
  "1"=>"You forgot to insert your login name",
  "2"=>"You forgot to insert your password",                               
  "3"=>"You are trying to register a new user with no username",           
  "4"=>"You are trying to register a new user with no password",
  "5"=>"An error occurred in the users database, contact an administrator",
  "6"=>"You are trying to register with an already existing username"
);
echo "<p id=\"error\">{$errors["$error_id"]}</p>\n";
Senza bisogno di scomodare mysql. KISS, nevvero? ;)

Re: php / sql - dubbi e domande varie...

Inviato: sab 14 giu 2008, 13:31
da danix
e questa è stata la successione di facce che si sono alternate sul mio volto leggendo il tuo post...

:shock:
:)
:D
:lol:
:badgrin:
:evil:
:cry:
:banghead:

credo che farò una gigantografia della KISS rule (la versione di Berkley però) e la metterò nel muro di fronte al mio pc...

Grazie nino... :D

Re: php / sql - dubbi e domande varie...

Inviato: sab 14 giu 2008, 14:47
da danix
rieccomi...
non riesco a gestire i permessi degli utenti, nel senso che riesco a gestire le sessioni, solo che non so come distinguere tra utenti admin e utenti semplici... nel database ho la tabella users con i valori che ho postato sopra, il login lo eseguo come ha consigliato Aschenaz nel suo tutorial, in cima alla index.php ho:

Codice: Seleziona tutto

$pagineutenti=array("gestione","utenti","upload");
isset($_GET["pagina"]) ? $pagina=$_GET["pagina"] : $pagina="home";
if(in_array($pagina,$pagineutenti) && !isset($_SESSION["utenteautorizzato"])) {
  header("Location: index.php?pagina=secondaria&messaggio=MUST-AUTHENTICATE!");
  exit;
}
e disegno il menu con queste righe:

Codice: Seleziona tutto

        $vocimenu=array("home","gallery","products","contacts", "gestione", "utenti", "upload");
        foreach($vocimenu as $voce) {
          if(!in_array($voce,$pagineutenti) || isset($_SESSION["utenteautorizzato"])) {
            if($pagina==$voce) echo '
            <li id="current">';
          elseif($pagina!=$voce) echo "
            <li>";
            if($pagina!=$voce) echo '<a href="index.php?pagina='.$voce.'">';
            echo $voce;
            if($pagina!=$voce) echo "</a>";
            echo "</li>";
          }
        }
in fondo alla pagina ho

Codice: Seleziona tutto

include("pages/$pagina.php");
che mi visualizza la pagina selezionata...
riguardo alla funzione di autenticazione ho nella pagina di raccolta dei dati:

Codice: Seleziona tutto

$azione=$_GET["action"];

if($azione=="login") {
  $User=$_POST["user"];
  $Pass=$_POST["pass"];
  if ($User=="") {
    reindirizza("pagina=error&eid=1");
  }
  elseif ($Pass=="") {
    reindirizza("pagina=error&eid=2");
  }
  else {
    $risultatoutente=mysql_query("SELECT ID FROM users WHERE USER='$User' AND PASS='$Pass'", $connessione);

    if(mysql_num_rows($risultatoutente)==0) { 
      reindirizza("pagina=register&user=$User");
    }

    else {
      $_SESSION["utenteautorizzato"]=mysql_result($risultatoutente,0,0);
      reindirizza("pagina=home&sezione=secondaria&messaggio=$User-LOGGED-IN");
    }
  }
}
mi aiutate a capire?? Grazie mille a tutti per l'infinita pazienza...

Re: php / sql - dubbi e domande varie...

Inviato: sab 14 giu 2008, 22:56
da aschenaz
danix85 ha scritto: ... non so come distinguere tra utenti admin e utenti semplici... nel database ho la tabella users con i valori che ho postato sopra...
Dovresti aggiungere un campo admin alla tabella. Poi verifichi con una
query se il campo admin è flaggato e registri una variabile di sessione
(che so $_SESSION["admin"] per esempio)... Puoi farlo benissimo
nella stessa query dell'accesso autenticato.
A questo punto, decidi quali pagine devono essere accessibili solo
agli admin e le metti un altro array, verificando, nel caso la pagina
attiva sia compresa nell'array, se è registrata la variabile di sessione
degli admin (allo stesso modo in cui verifichi l'accesso autenticato).

Re: php / sql - dubbi e domande varie...

Inviato: sab 14 giu 2008, 23:52
da danix
oops, mi sono accorto che nella tabella sopra non c'è il campo admin... l'avevo aggiunto però... :oops:
comunque, ho modificato la pagina di raccolta dati così:

Codice: Seleziona tutto

$azione=$_GET["action"];
if($azione=="login") {
  $User=$_POST["user"];
  $Pass=$_POST["pass"];
  if ($User=="") {
    reindirizza("pagina=error&eid=1");
  }
  elseif ($Pass=="") {
    reindirizza("pagina=error&eid=2");
  }
  else {
    $risultatoutente=mysql_query("SELECT ID FROM users WHERE USER='$User' AND PASS='$Pass'", $connessione);
    $risultatoadmin=mysql_query("SELECT ADMIN FROM users WHERE USER='$User' AND PASS='$Pass'", $connessione);
    if(mysql_num_rows($risultatoutente)==0) { 
      reindirizza("pagina=register&user=$User");
    }
    elseif(mysql_num_rows($risultatoadmin)==0) {
      $_SESSION["utenteautorizzato"]=mysql_result($risultatoutente,0,0);
      reindirizza("pagina=home&sezione=secondaria&messaggio=$User-LOGGED-IN");
    }
    else {
      $_SESSION["adminautorizzato"]=mysql_result($risultatoadmin,0,0);
      reindirizza("pagina=home&sezione=secondaria&messaggio=$User-ADMIN-LOGGED-IN");
    }
  }
}
In questa pagina ho qualche dubbio sulla verifica del campo admin, in quella colonna della tabella ho messo solo valori binari, 1 se l'utente è admin e 0 se è un utente normale...


Poi ho modificato index.php in questo modo:

Codice: Seleziona tutto

$pagineutenti=array("upload");
$pagineadmin=array("gestione","utenti");
isset($_GET["pagina"]) ? $pagina=$_GET["pagina"] : $pagina="home";
if(in_array($pagina,$pagineutenti) && !isset($_SESSION["utenteautorizzato"])) {
  header("Location: index.php?pagina=secondaria&messaggio=MUST-AUTHENTICATE!");
  exit;
}
elseif(in_array($pagina,$pagineadmin) && !isset($_SESSION["adminautorizzato"])) {
  header("Location: index.php?pagina=secondaria&messaggio=NOT-ADMIN");
  exit;
}
per il menu (che è la parte su cui ho più dubbi) ho fatto così:

Codice: Seleziona tutto

        $vocimenu=array("home","gallery","products","contacts", "gestione", "utenti", "upload");
        foreach($vocimenu as $voce) {
          if(!in_array($voce,$pagineutenti) || isset($_SESSION["utenteautorizzato"])) {
            if($pagina==$voce) echo '
              <li id="current">';
            elseif($pagina!=$voce) echo "
              <li>";
              if($pagina!=$voce) echo '<a href="index.php?pagina='.$voce.'">';
              echo $voce;
              if($pagina!=$voce) echo "</a>";
              echo "</li>";
          }
          elseif(!in_array($voce,$pagineadmin) || isset($_SESSION["adminautorizzato"])) {
            if($pagina==$voce) echo '
              <li id="current">';
            elseif($pagina!=$voce) echo "
              <li>";
              if($pagina!=$voce) echo '<a href="index.php?pagina='.$voce.'">';
              echo $voce;
              if($pagina!=$voce) echo "</a>";
              echo "</li>";
          }
        }
solo che anche senza essermi loggato il menu mi mostra tutte le pagine, ma l'accesso mi viene negato in quelle contenute nell'array pagineadmin e in quelle riservate agli utenti autenticati...

dove sto sbagliando??


Grazie dell'aiuto...

PS
per completezza questa è la tabella users:

Codice: Seleziona tutto

+----+--------+------------+-------+
| ID | USER   | PASS       | ADMIN |
+----+--------+------------+-------+
|  1 | admin  | 123321     |     1 | 
|  2 | danix  | mypass     |     1 | 
|  3 | poster | posterpass |     0 | 
|  4 | user1  | 555888     |     0 | 
|  5 | user2  | 777333     |     0 | 
|  6 | dammit | danix      |     0 | 
|  7 | zazza  | azazz      |     0 | 
+----+--------+------------+-------+

Re: php / sql - dubbi e domande varie...

Inviato: dom 15 giu 2008, 0:58
da danix
ho modificato ancora la index.php...

Codice: Seleziona tutto

$pagineutenti=array("upload");
$pagineadmin=array("gestione","utenti");
isset($_GET["pagina"]) ? $pagina=$_GET["pagina"] : $pagina="home";
if(in_array($pagina,$pagineutenti) && !isset($_SESSION["utenteautorizzato"]) || in_array($pagina,$pagineadmin) && !isset($_SESSION["adminautorizzato"])) {
  header("Location: index.php?pagina=secondaria&messaggio=MUST-AUTHENTICATE!");
  exit;
}
e poi:

Codice: Seleziona tutto

        $vocimenu=array("home","gallery","products","contacts", "gestione", "utenti", "upload");
        foreach($vocimenu as $voce) {
          if(!in_array($voce,$pagineutenti) || isset($_SESSION["utenteautorizzato"]) && !in_array($voce,$pagineadmin) || isset($_SESSION["adminautorizzato"])) {
            if($pagina==$voce) echo '
              <li id="current">';
            elseif($pagina!=$voce) echo "
              <li>";
              if($pagina!=$voce) echo '<a href="index.php?pagina='.$voce.'">';
              echo $voce;
              if($pagina!=$voce) echo "</a>";
              echo "</li>";
          }
        }
adesso funziona parzialmente, nel senso che non mi viene visualizzata nel menu la pagina "upload" (che è nell'array $pagineutenti), ma mi vengono ancora visualizzate le pagine "gestione" e "utenti" che si trovano nell'array $pagineadmin, non posso accedervi se non faccio il login, ma non dovrebbero proprio vedersi... cosa sto sbagliando??

Mi rimangono ancora i dubbi relativi alla pagina di raccolta dati che ho esposto nel precedente post, ma non credo che c'entrino con questo problemino...

se avete suggerimenti fatemi sapere... :D


Grazie mille