Problema [PHP] index non trovato: login

Salve, sto cercando di elaborare la fase di Login in un sito, e mi ritrovo a voler

inserire nell'header un form di login solo se non è stato ancora effettuato il login

(dunque premuto il tasto login) e di conseguenza sarà presente un tasto di logout,

altrimenti verrà visualizzato il form di login suddetto;
 

Dunque vorrei far si che controllando che il tasto di 'login' si premuto possa anche effettuare

il login stesso ma non riesco poichè non mi trova l'index, è sbagliato usare come trigger di un evento

qualcosa che hai inserito nella pagina con codice php tramite un echo?

Beh sono sicuro che il codice sarà più chiaro di me:


 

<?php
function loginArea() {
echo "<form id='login_area' name='Login' class='login_area' method='POST' action='Registrazione.php'>
  <input type='text' id='mail' name='nome' class='lessRounded' maxlength='22' value='  Nome:'
        onfocus=\"clickclear(this,'  Nome:')\"
        onblur=\"clickrecall(this,'  Nome:')\"/>
 

        <input type='password' id='pass' name='pass' class='lessRounded' maxlength='22' value='  Password:'
        onfocus=\"clickclear(this,'  Password:')\"
        onblur=\"clickrecall(this,'  Password:')\"/>
<input type='button' name='login' class='login' value='Login' />
        <input type='submit' name='register' class='register' value='Register' />
     </form>
   ";
 
}

function logoutArea() {
  //da fare
}
function login($nome,$pass) {
  //da dare
}
?>
<?php

////PROBLEMA////
//da Notice: Undefined index: login
if($_POST['login']) {
  loginArea();
}
else{ 
  //anche qui non riconosce nome e pass
  login($_POST['nome'] , $_POST['pass']);
  logoutArea();
}

?>
inviato 4 anni fa
Hextar13
@gbenfe comunque mi dice Undefined index: nome ed Undefined index: pass :(Hextar13 4 anni fa
X 0 X

potresti mettere:

if(array_key_exists('login', $_POST)):
    loginArea();
else:
    login($_POST['nome'] , $_POST['pass']);
    logoutArea();
endif;

appena accedi alla pagina il $_POST è vuoto.

risposto 4 anni fa
gbenfe
gbenfe
16
X 0 X

Ok ho trovato una valida soluzione lavorando nella forma

 

<?php

if(isset($_POST['login'])){
     $testo=$POST['testo'];
     //Esegui login
     //inserisci pulsante logout
}
else{
?>

     //n.b: non funziona il type button
     <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method='POST'>
         <input type="text" name="testo" value="testo">
         <input type="submit" name="login" value="login">
     </form>

<?php
}
?>

Mi rimane solo un piccolo dubbio, quando andrei a fare effettivamente il login e "SOSTITUIRE"
il login_form al form di logout, mi ricarica la pagina, è possibile evitarlo???
Pensavo magari con un approccio ajax dove in js svuoto il login_form sostituendolo
con il logout_form, l'approccio è giusto e qualcuno sa come realizzarlo?

Grazie mille

risposto 4 anni fa
Hextar13
X 0 X

Ajax per una cosa del genere è assurdo, in considerazione del fatto che è normale procedura nel protocollo http la rigenerazione delle pagine.

Quello che puoi fare è il redirect ad altra pagina, quando non sei più loggato rimandi ad una pagina di default, per esempio l'home page.

Tornando al logout la cosa più semplice è quella di cancellare il cookie di sessione legato alla fase di login, a quanto mi è parso di capire non hai le idee chirissime nemmeno su come realizzare la fase di login.

Normalmente questa fase è semplice perché si tratta di un confronto tra due o più valori, cioè un dato proveniente dal form e uno memorizzato da qualche parte, di solito un database.

Confronto semplice, uno a uno (esempio: $_POST[nome] = $account (proveniente dal database)) stessa cosa per la password.

Se i due dati sono confrontati memorizzi un semplice cookie di sessione, cosa semplicissima perché basta riempire una variabile: $_SESSION['log'] = $_POST['nome']. Fatto! (ed errato allo stesso tempo per via di un immenso buco di sicurezza introdotto dal passaggio diretto dell'array post, ma vale il principio per ora)

Ogni volta che sei loggato esiste quel cookie ed è su quello che devi confrontarti, se esiste sei loggato, se non esiste non lo sei, quindi, per fare il logout ti basta cancellarlo, ad esempio

if (isset($_SESSION['log'])) unset($_SESSION['log'];

Semplice, se esiste $_SESSION['log'] lo elimino, quindi non sono più loggato e per fare questo non serve un form, basta un link.

Ovviamente solo se richiami gli eventi in ogni tuo file, che deve perciò iniziare con session_start(); in ogni file richiamato dal browser.

Esempietto di logout:

<a href="mia_pagina.php?id=logout">LOGOUT</a>
// PHP
<?php
if (isset($_GET['id']) && $_GET['id'] == 'logout') {
   unset($_SESSION['log']);
}

?>

Quando premi il link trasmette alla pagina la parola logout dentro la variabile id, quindi la pagina confronta il dato che se esiste e se è proprio lap arola logout (potrebbe essere stata modificata ad arte da qualcuno) esegue la cancellazione del cookie di sessione.

Tasto input, type button non manda un dato via form ma esegue un'azione, o meglio non esegue nulla se non vi associ un evento, di solito serve per scatenare eventi a comando, che so onclick(), onsubmit(;-) ma da solo non fa nulla.

Quando usi più eventi in un solo comando (link o tasto) e questi rimandano sempre alla stessa routine con gli stessi parametri, invece di riscrivere sempre la stessa minestra, scrivila nua volta sola e poi richiami l'evento dall'evento, ad esempio invece di scrivere

<input type='password' id='pass' name='pass' class='lessRounded' maxlength='22' value='  Password:'
        onfocus=\"clickclear(this,'  Password:')\"
        onblur=\"clickrecall(this,'  Password:')\"/>

scrivi semplicemente:

<input type='password' id='pass' name='pass' class='lessRounded' maxlength='22' value='  Password:'

        onfocus=\"clickclear(this,'  Password:')\"
        onblur=\"onfocus()\"/>

in pratica quando rilasci il campo (blur) scateni l'evento onfocus() che porta la routine da eseguire, diventa tutto più facile da scrivere tante volte. Per il resto funziona come prima.

risposto 4 anni fa
Marco Grazia
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda