Problema ricerca in database

  • Creatore Discussione Creatore Discussione Emix
  • Data di inizio Data di inizio

Emix

Utente Attivo
15 Feb 2010
596
0
16
Salve a tutti,
ho un problema.. è qualche giorno che provo a fare un pezzo di codice che serve per ricercare all'interno di due tabelle in un database dei campi.. precisamente due.

Mi spiego meglio... io ho due tabelle una Utenti e una Admin.
La parte di codice che devo fare è composto cosi:

Io tramite post recupero dal form user e password.

La ricerca che devo fare è quella di cercare all'interno dei due database user e pwd.Nel caso fosse presente in utente assegnare alla variabile (esempio) utente il valore 1 e se è presente in quella admin utente 2, nel caso in cui non fosse presente stampasse a video l'errore dicendo di non aver trovato nessun utente corrispondente a quelle credenziali.. A dir cosi sembra facile, ma sono 3 giorni che provo senza ottenere risultati :(( aiuto :(
 
Hai sbagliato già a monte la logica della tua applicazione. Sarebbe stato molto più efficiente fare una sola tabella utenti con un campo is_admin che può essere solo 0 o 1. Se è 0 l'utente è un comune mortale, se è 1 invece è un amministratore. Ti consiglio di correggere.

Comunque, se non puoi/vuoi per qualche ragione manipolare il database, posso anche preparare un esempio per fare ciò che mi hai chiesto. Fammi sapere tu!
 
riesci invece a farli entrambe? perlomeno per capire.. io in ogni caso preferirei tenere due database perchè l'applicazione che sto costruendo sara un gestionale di magazzino , ed è importante capire chi è amministratore e chi no e sapere i suoi dati.
attendo notizie.
 
Devi fare una cosa di questo tipo:
PHP:
<?php
// si connette al database
$conn = mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('miodb', $conn) or die(mysql_error());

// definisce username e password
$username = 'admin';
$password = 'pinco';

// definisce la variabile a 0 (di default)

$utente = 0;
// controlla che siano di un utente
$query = mysql_query("SELECT * FROM Utenti WHERE username='{$username}' AND password='{$password}'");
if(mysql_num_rows($query) == 1)
	$utente = 1;

// se non è ancora stato definito il grado
if(!$utente)
{
	// controlla che siano di un amministratore
	$query = mysql_query("SELECT * FROM Admini WHERE username='{$username}' AND password='{$password}'");
	if(mysql_num_rows($query) == 1)
		$utente = 2;
}

// chiude la connessione
mysql_close($conn);
?>
Anche se non usi MySQL come database la logica è la stessa.
 
ciao, grazie per la risposta celere... intanto che mi studio la parte di codice da te scritta ti posto quella che avevo fatto io :

PHP:
<html>
<head> <title>Inserimento Utenti</title></head>
<body>
<?php
//CONNESSIONE AL DATABASE
include('connect.php');
//RECUPERA DATI DAL FORM
$user = $_POST['user'];
$user = addslashes(htmlspecialchars(($_POST['user'])));
if($user==""){
echo "<p>Il campo Username non puo essere vuoto</p>";
//ritorno al form
}  
$pwd = $_POST['pwd'];
$pwd = addslashes(htmlspecialchars(($_POST['pwd'])));
if($pwd ==""){
echo "<p>Il campo Password non puo essere vuoto</p>";
//ritorno al form
}



 $risultati = @mysql_query('SELECT * FROM utenti WHERE user = '%$user%'');
 if (!$risultati) {
 exit('<p> Errore di formazione query: ' . mysql_error() . '</p>');
 }
 
while ($righe = mysql_fetch_array($risultati)){
  echo '<p>' . $righe['user'] . '</p>';
 }
?>
</body>
</html>

Unica cosa se la provo mi dice : Errore di formazione query: Query was empty
 
Ultima modifica:
aggiungo che anche con la tua di prova mi dice Errore di formazione query: Query was empty .. ma io un utente l'ho creato... devo crearne piu di uno??

P.S. Se hai msn dammelo.. Grazie.
 
Temo che il tuo problema si l'istruzione:

Codice:
@mysql_query('SELECT * FROM utenti WHERE user = '%$user%'');

Sono sbagliate le quote e/o manca l'operatore di concatenamento delle stringhe.
Riprova con:

Codice:
@mysql_query('SELECT * FROM utenti WHERE user = "%'.$user.'%"');

Dovrebbe andare...
 
allora ho usato un altra parte di codice che ho editato con l'aiuto dell'utente borgo. Vi posto le tre pagine..

PAGINA LOGIN.PHP
PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Benvenuti nel Magazzino</title>
</head>
<body>
<?php
if(!isset($_SESSION)){
  session_start ();
  }
  //in TUTTE le pagine in cui uso le sessioni
/*serve perchè l'utente non debba riscrivere user e password
se è un utente autorizzato*/
if(isset($_SESSION['user'])) {
  $_SESSION['user'] = $user;
  }
  else
  {
    $user = "" ;
  }
if(isset($_SESSION['pwd'])){
  $_SESSION['pwd'] = $pwd;
  }
  else
  {
    $pwd = "" ;
    }
?>

<form action="session_start.php" method="post">
inserisci username<input name="user" type="text" value="">
inserisci password<input name="pwd" type="text" value="">
<p align="center">
<input type=submit value="Login" name="B1" style="font-weight: 700"></font></td></tr>
</form>
</body>
</html>


PAGINA SESSION_START.PHP

PHP:
<?php
include('connect.php');
//creo la sessione
if(!isset($_SESSION)){
  session_start ();
  }
	//in TUTTE le pagine in cui uso le sessioni
//verifico di provenire da login.php e non digitando sul bw il nome della pagina
if(basename($_SERVER['HTTP_REFERER']) != 'login.php'){
    //non provengo da login.php
    unset($_SESSION);
    //distuggo eventuali sessioni e quindi rimando a login
    @header('Location:login.php');
}else{
    //ho verificato che provengo da login
    //collegamento al db
    //verifiche sui post ....e li leggo
    $user=$_POST['user'];
    $pwd=$_POST['pwd'];
    //interrogo il db, non ho messo la codifica dell'user e pass
    $query=mysql_query("SELECT * FROM utenti WHERE user='$user' and pwd='$pwd'");
    //verifico che esista un utente con tale username e tale password
    $esiste=mysql_num_rows($query);
    //se $esiste == 0 non cè
    if($esiste > 0){//esiste
        //estraggo usn e pass
        $rows=mysql_fetch_array($query);
        //e li passo in sessione
        $_SESSION['user']=$rows['user'];
        $_SESSION['pwd']=$rows['pwd'];
        //accedo alla/alle pag riservate
        @header('Location:pagina_riservata.php');
    }else{//non esiste
        unset($_SESSION);
        @header('Location:login.php');
    }
}
?>

E INFINE LA PAGINA_RISERVATA :

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Benvenuti nella sezione riservata del Magazzino</title>
</head>
<body>
<?php
if(!isset($_SESSION)){session_start ();}//in TUTTE le pagine in cui uso le sessioni
//verifico l'esistenza delle sessioni
if(!isset($_SESSION['user']) || !isset($_SESSION['pwd']){
    //le sessioni non esistono per cui riinvio al login (o alla pagina che voglio)
    @header('Location:login.php');
}
?>

Funzionaaaaaaaaaaa
</table>
</body>
</html>


Ora perfavore ditemi dove sbaglio.. In ogni caso in output mi dice questo senza andare avanti da login.php :


Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /var/www/login.php:8) in /var/www/login.php on line 10
Non mi va avanti, anzi cancella user e pwd come da me chiesto nell'else...
 
allora ho testato tutto con moltisisma calma e togliendo qualche errore di sintassi son riuscito a far funzionare tutte e tre le pagine.. Ora mi rimane l'errore :

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /var/www/login.php:8) in /var/www/login.php on line 10


lo so che è un paramentro di configurazione, ma dove lo trovo e come lo correggo??

Ultima domanda... Come testo se veramente sono loggato ???
 
Session iniziata dopo l'output

Non dipende dalle configurazioni: è un errore comune.

Negli script php che usano le session devi iniziarle PRIMA di qualsiasi output.

E, ad esempio, qualsiasi porzione HTML è un output!

Sposta alla prima riga degli script:

Codice:
<?php session_start ();?>

e quindi rimuovi dal seguito dello script tale istruzione.
 
si hai ragione ora però nella pagina login.php e solo in quella mi da :

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively in Unknown on line 0

:byebye:
 
apparte quanto detto sopra ho qualche altro dubbio..
Come faccio a fare in modo che il controllo di user e password avviene su due tabelle delle stesso database? se possibile nella stessa if..

Inoltre nello script login.php (sta nell'altra pagina) come faccio a controllare che l'utente non lasci campi vuoti e , sopratutto che in caso di campi vuoti lo script si fermi mostrando un errore? ci son riuscito sull'inserimento degli utenti ma qui mi rimane difficile... Inoltre, come faccio nella pagina session_start.php (sempre visibile nell'altra pagina) a farmi restituire un msg in caso di utente non trovato?Sempre nella stessa pagina mi servirebbe fare in modo che, se l'user esiste e la password è errata ti chieda di rispondere ad una domanda segreta, o di mandare il reset (magari impostandone una a caso da php) per mail?Ovviamente qui diventano doppi i controlli ossia un controllo, cerca l'user se l'user c'è ti manda alla domanda segreta o cmq al form di reset per mail, se invece l'user non c'è ti dica user inesistente.
 
ok ora do uno sguardo, intanto son riuscito a far in modo che se l'utente sbaglia user ti appare utente inesistente, verrai reinderizzato tra 3 secondi alla pagina di login.
Solamente che funziona tutto, ma mi da quest'errore php e non mi redirecta:


Warning: Cannot modify header information - headers already sent by (output started at /var/www/session_start.php:37) in /var/www/session_start.php on line 38


P.S. hai msn? cosi posso farti domande a botta e risposta.
 
dopo svariati tentativi, sono riuscito a far si che nell'inserimento utente o admin si hanno i seguenti controlli, se non si soddisfano tutti non si procede con l'inserimento :

  • Se campi vuoti
  • Se campi pwd e confpwd diversi
  • Se campi mail e confmail diversi
  • Se formato mail non valido
  • Se email gia usata
  • Se username gia usata

Di seguito vi posto il codice :

PHP:
<html>
<head> <title>Inserimento Utenti</title></head>
<body>
<?php
//CONNESSIONE AL DATABASE
include('connect.php');
//RECUPERA DATI DAL FORM
$nome = $_POST['nome'];
$nome = addslashes(htmlspecialchars(($_POST['nome'])));
if($nome==""){
echo "<p>Il campo nome non puo essere vuoto</p>";
$a=1;
//ritorno al form
}else{
  $a=2;
  }
$cognome = $_POST['cognome'];
$cognome = addslashes(htmlspecialchars(($_POST['cognome'])));
if($cognome ==""){
echo "<p>Il campo cognome non puo essere vuoto</p>";
$b=1;
//ritorno al form
}else{
  $b=2;
  }
$indirizzo = $_POST['indirizzo'];
$indirizzo = addslashes(htmlspecialchars(($_POST['indirizzo'])));
if($indirizzo ==""){
echo "<p>Il campo indirizzo non puo essere vuoto</p>";
$c=1;
//ritorno al form
}else{
  $c=2;
  }
$citta = $_POST['citta'];
$citta = addslashes(htmlspecialchars(($_POST['citta'])));
if($citta ==""){
echo "<p>Il campo citta non puo essere vuoto</p>";
$d=1;
//ritorno al form
}else{
  $d=2;
  }
  // controllo sul formato dell'email
  if((!isset($_POST['mail'])) || (!eregi("^([a-z0-9\._-]+)(@[a-z0-9.-]+)(\.{1}[a-z]{2,4})$", $_POST['mail'])))
  {
    echo "Attenzione, formato email non valido.";
  $l=1;
//ritorno al form
}else{
  $l=2;
  }
$mail = $_POST['mail'];
$mail = addslashes(htmlspecialchars(($_POST['mail'])));
if($mail ==""){
echo "<p>Il campo email non puo essere vuoto</p>";
$e=1;
//ritorno al form
}else{
  $e=2;
  }
$confmail = $_POST['confmail'];
$confmail = addslashes(htmlspecialchars(($_POST['confmail'])));
if($confmail ==""){
echo "<p>Il campo conferma email non puo essere vuoto</p>";
$f=1;
//ritorno al form
}else{
  $f=2;
  }
$user = $_POST['user'];
$user = addslashes(htmlspecialchars(($_POST['user'])));
if($user ==""){
echo "<p>Il campo username non puo essere vuoto</p>";
$g=1;
//ritorno al form
}else{
  $g=2;
  }
$pwd = $_POST['pwd'];
$pwd = addslashes(htmlspecialchars(($_POST['pwd'])));
if($pwd ==""){
echo "<p>Il campo password non puo essere vuoto</p>";
$h=1;
//ritorno al form
}else{
  $h=2;
  }
$confpwd = $_POST['confpwd'];
$confpwd = addslashes(htmlspecialchars(($_POST['confpwd'])));
if($confpwd ==""){
echo "<p>Il campo conferma password non puo essere vuoto</p>";
$i=1;
//ritorno al form
}else{
  $i=2;
  }
if($mail != $confmail){
  echo "<p>I campi Email non corrispondono</p>";
  $up = 2;
}
else{
  $up = 0;
}
if($pwd != $confpwd){
  echo "<p>I campi Password non corrispondono</p>";
  $avanti = 2;
} else{
  $avanti = 1;
}
$ctrl_mail = @mysql_query("SELECT * FROM utenti WHERE mail='$mail'") or die (mysql_error());
    if(@mysql_num_rows($ctrl_mail)>0)
    {
      echo "L'email risulta gia' in uso.";
      $m=1;
//ritorno al form
      }else{
       $m=2;
      }
//ritorno al form
$ctrl_user = @mysql_query("SELECT * FROM utenti WHERE user='$user'") or die (mysql_error());
    if(@mysql_num_rows($ctrl_user)>0)
    {
      echo "L'username risulta gia' in uso.";
      $n=1;
//ritorno al form
      }else{
       $n=2;
      }
//ritorno al form
  if($up == 0 && $avanti == 1 && $a == 2 && $b == 2 && $c == 2 && $d == 2 && $e == 2 && $f == 2 && $g == 2 && $h == 2 && $i == 2 && $l == 2 && $m == 2 && $n == 2   ){
//INSERISCI NUOVO ARTICOLO NEL DATABASE
$query = "INSERT INTO utenti ( id,nome,cognome,indirizzo,citta,mail,user,pwd) 
VALUES (NULL,'$nome', '$cognome', '$indirizzo','$citta','$mail', '$user', '$pwd')";

if (@mysql_query($query)) {
	echo ("<div align=center class=testo> <b> Utente inserito con successo.Conferma la registrazione tramite la mail che ti abbiamo inviato.</b></div>");
	} else {
		echo ("<div align=center class=testo> <b>Errore di inserimento utente: ". mysql_error()
		."</b></div>");
		}
		}
		else {
		  echo "<p>Utente non Inserito</p>";
		  }
        // email per la conferma
        // intestazioni
        $headers = "From: $admin_email\nreply-To: noreply\r\n";
        $subject = "Conferma la registrazione.";
        //corpo del messaggio
        $messaggio = "Ti ringraziamo per la tua registrazione.\n";
        $messaggio .= "La tua user e': ".$user."\n";
        $messaggio .= "La tua password e': ".$pwd."\n";
        $messaggio .= "Per confemare vai alla pagina http://localhost/conferma.php ";
        $messaggio .= "e inserisci i dati per l'autenticazione.\n"; 
        // invio dell'email
        @mail($mail, stripslashes($subject),stripslashes($messaggio),$headers);

?>
</body>
</html>

Son riuscito a creare una pagina di conferma registrazione :

PHP:
<?php
// controllo sul parametro d'invio
if( isset($_POST['submit']) && (trim($_POST['submit']) == "Conferma") )
{ 
    $user = $_POST['user'];
    $pwd = $_POST['pwd'];

    // includiamo il file di configurazione
    include "connect.php";

    // controlliamo se i parametri sono presenti in tabella
    $ctrl_login = @mysql_query("SELECT * FROM utenti WHERE user='$user' AND pwd='$pwd'") or die (mysql_error());
    if(@mysql_num_rows($ctrl_login)==0)
    {
      // esito login negativo
      echo "Login incorretto.";
    }else{
      // esito login positivo quindi rendiamo l'utente attivo
      $obj = @mysql_fetch_object($ctrl_login) or die (mysql_error());
      $query_attivo = @mysql_query("UPDATE utenti SET attivo='1' WHERE id=".$obj->id) or die (mysql_error());
      // redirect alla pagina degli iscritti
      @header("Location: login.php");
    }
  } else{
  // form per la conferma
  ?>
<h1>Modulo di conferma:</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
User:<br>
<input name="user" type="text" size="20"><br>
Password:<br>
<input name="pwd" type="password" size="20"><br>
<input name="submit" type="submit" value="Conferma">
</form>
  <?
}
?>

Sono riuscito a effettuare controlli su user e pwd sia nella tabella utenti che in quella admin, creando la sessione o distruggendola riderizionando al login.php :

PHP:
<?php
//creo la sessione
//in TUTTE le pagine in cui uso le sessioni
if(!isset($_SESSION)){
  session_start ();
  }
?>
<?php
$admin=0;
$utente=0;
include('connect.php');
//verifico di provenire da login.php e non digitando sul bw il nome della pagina
if(basename($_SERVER['HTTP_REFERER']) != 'login.php'){
    //non provengo da login.php
    unset($_SESSION);
    //distruggo eventuali sessioni e quindi rimando a login
    @header('Location:login.php');
}else{
    //ho verificato che provengo da login
    //collegamento al db
    //verifiche sui post ....e li leggo
    $user=$_POST['user'];
    $pwd=$_POST['pwd'];
    //interrogo il db, non ho messo la codifica dell'user e pass
    $query=mysql_query("SELECT * FROM utenti WHERE user='$user' and pwd='$pwd'");
    //verifico che esista un utente con tale username e tale password
    $esiste=mysql_num_rows($query);
    //se $esiste == 0 non cè
    if($esiste > 0){//esiste
        //estraggo usn e pass
        $rows=mysql_fetch_array($query);
        //e li passo in sessione
        $_SESSION['user']=$rows['user'];
        $_SESSION['pwd']=$rows['pwd'];
	$utente=1;
        //accedo alla/alle pag riservate
        @header('Location:pagina_riservata.php');
    }else{ //non esiste
	// controlla che siano di un amministratore
    $queryadmin = mysql_query("SELECT * FROM admin WHERE user='$user' AND pwd='$pwd'");
    $esisteadmin=mysql_num_rows($queryadmin);
    //se $esiste == 0 non cè
    if($esisteadmin > 0){//esiste
        //estraggo usn e pass
        $rows=mysql_fetch_array($queryadmin);
        //e li passo in sessione
        $_SESSION['user']=$rows['user'];
        $_SESSION['pwd']=$rows['pwd'];
	$admin=1;
        //accedo alla/alle pag riservate
        @header('Location:pagina_riservata.php');
	}else{
        unset($_SESSION);
	echo 'Utente inesistente';
	header('Refresh: 3; URL=login.php');
        echo "Utente Inesistente, tra 3 secondi verrai reinidirizzato alla pagina di login";  
    }
}
}
?>

E una volta appurato che l'utente esiste lo manda alla pagina riservata :

PHP:
<?php
//creo la sessione
//in TUTTE le pagine in cui uso le sessioni
if(!isset($_SESSION)){
  session_start ();
  }
?>
<?php
//verifico l'esistenza delle sessioni
if((!isset($_SESSION['user'])) || !isset($_SESSION['pwd'])){
    //le sessioni non esistono per cui riinvio al login (o alla pagina che voglio)
    @header('Location:login.php');
} else {
echo "Benvenuto : ".$user."\n";
if($utente > 0){
	echo "Benvenuto : ".$user."\n";
	}
	else {
		if($admin > 0){
			echo "Benvenuto Amministratore : ".$user."\n";
			}
			}
}

Il problema arriva qui.. Forse la cosa piu banale ma non mi riesce :(

Devo stampare sulla pagina riservata Benvenuto Admin o Benvenuto Utente a seconda del livello. Nelle pagine : pagina_riservata e session_start noterete che ci sono delle if e delle variabili create da me per poter stampare admin o utente ma niente.. ditemi dove sbaglio ç_ç

Grazie ancora!!

P.S. l'errore del post precedenze sussiste...
 
Sintassi...

Ci sono vari problemi di sintassi, o forse proprio di struttura.

Ad esempio, nella pagina riservata, dove diavolo viene definito un valore per $admin o $utente ?
Perchè mai tali variabili dovrebbe valere più di zero (vedi tuo if($admin > 0) e if($utente>0)?

Quindi hai un output solamente dalla prima delle due linee
echo "Benvenuto : ".$user."\n";
mentre le altre vengono ignorate sempre.

Non te la prendere, ma credo che ti stai cimentando con un progetto troppo complesso: prima dovresti farti meglio le ossa su php con qualcosa di più semplice...
 
ma veramente fin ora ho solamente fatto tutto da solo.. con il vostro aiuto, chiaro , ma gli script sono fatti da me niente copia\incolla.

Le variabili credevo che le riportasse da login a session_start e da session_start e pagina_riservata.. Come faccio in ogni caso a stamparle? questa è\era la mia domanda...
 
Credo che prima dovresti leggere un buon tutorial sulle variabili php, ed anche sulle sessioni php.

Il codice inviato contiene vari errori e parecchie porzioni "cavillose".

Progettare un sistema di registrazione/login funzionante non è la cosa più facie: farne uno ragionevolmente sicuro è ancora più difficile.

Non posso darti singoli suggerimenti sul codice, che secondo me faresti meglio a riscrivere ex-novo, magari con l'aiuto di qualcuno si, ma dopo acquisite le competenze di base.
 
non per cattiveria, ma funziona tutto.. il mio problema è stampare se è amministratore o utente.. e riscrivo un codice intero per stampare ste due stupidaggini?
 

Discussioni simili