Problema form di registrazione

di il
5 risposte

Problema form di registrazione

Salve mi sto scervellando per capire come mai il mio codice non riesce a registrare gli utenti sul database.
<?php

	session_start();

	//se questa variabile esiste allora qualcuno ha inviato i dati di questo formulario pertanto ne valideremo i dati.
	
	if(isset($_POST['email']))
	{
		$tutto_OK=true;
		
		//Controlla se il nickname è corretto.
		$nick = $_POST['nick'];

		//controlliamo la lunghezza della stringa. 
		if((strlen($nick)<3) || (strlen($nick)>20))
		{
			$tutto_OK=false;
			$_SESSION['e_nick']="Il nickname deve contenere tra i 3 e i 20 caratteri.";
		}

		if(ctype_alnum($nick)==false)
		{
			$tutto_OK=false;
			$_SESSION['e_nick']="Il nickname può avere solo caratteri alfanumerici";
		}

		//controlla se la mail e corretta.
		//si occuperà anche di sanitizzare il codice
		//B = Bezpieczna

		$email = $_POST['email'];
		$emailB = filter_var($email,FILTER_SANITIZE_EMAIL);
		
		if((filter_var($emailB,FILTER_VALIDATE_EMAIL)==false) || ($emailB != $email))
		{
			$tutto_OK=false;
			$_SESSION['e_email']="Fornisci un indirizzo email valido";
		}

		//controlla se le password sono corrette

		$password1 = $_POST['password1'];
		$password2 = $_POST['password2'];

		if((strlen($password1)<8 ||(strlen($password1)>20)))
		{
			$tutto_OK=false;
			$_SESSION['e_password']="La password deve avere tra gli 8 e i 20 caratteri";
		}
		if($password1!=$password2)
		{
			$tutto_OK=false;
			$_SESSION['e_password2']="Le password devono coincidere";
		}

		$password_hash=password_hash($password1,PASSWORD_DEFAULT);

		if(!isset($_POST['regulamin']))
		{
			$tutto_OK=false;
			$_SESSION['e_regulamin']="Conferma l'accettazione del regolamento";
		} 

		$secret="LA_MIA_CHIAVE_SEGRETA";

		//recupera dal sito di google con un get il risultato del captcha. usa & per estrarre il valore di quello che probabilmente è un puntatore che ritorna

		$controlla = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);

		$risposta=json_decode($controlla);

		if($risposta->success==false)
		{
			{
				$tutto_OK=false;
				$_SESSION['e_bot']="conferma di non essere un bot";
		    }
		}

		//avevo dimenticato di salvare le variabili inserite nella sessione.

		$_SESSION['fr_nick'] = $nick;
		$_SESSION['fr_email'] = $email;
		$_SESSION['fr_password1'] = $password1;
		$_SESSION['fr_password2'] = $password2;
		if (isset($_POST['regulamin'])) $_SESSION['fr_regulamin'] = true;

		require_once "connect.php";
		mysqli_report(MYSQLI_REPORT_STRICT);

		//metodo try catch per la connessione NON FUNZIONA : fatal errors are uncatchable.

		try
		{
 			$connessione = new mysqli($host, $db_user, $db_password, $db_name);

 			if($connessione->connect_errno!=0)
			{
				throw new Exeption(mysqli_connect_errno());
			}
			else
			{
				//controlla se l'email già esiste
				$risultato = $connessione->query("SELECT id FROM users WHERE email='$email'");

				if(!$risultato) 
				{
					throw new Exeption($connessione->error);
				}

				$ile_takich_maili = $risultato->num_rows;
				if($ile_takich_maili>0)
				{
					{
						$tutto_OK=false;
						$_SESSION['e_email']="esiste già un account con questa mail";
		    		}
				}

				//controlla se il nick già esiste
				$risultato = $connessione->query("SELECT id FROM users WHERE user='$nick'");

				if(!$risultato) throw new Exeption($connessione->error);

				$ile_takich_nikow = $risultato->num_rows;
				if($ile_takich_nikow>0)
				{
					{
						$tutto_OK=false;
						$_SESSION['e_nick']="esiste già un account con questo nickname";
		    		}
				}
				//il codice accede a questo if ma non completa la condizione interna.
				if ($tutto_OK==true)
				{
					//tutti i test sono stati completati, aggiungo 	l'utente al database.

					//-> serve ad accedere ai campi di un oggetto.

					if($connessione->query("INSERT INTO users VALUES (NULL,'$nick','$password_hash','$email')"))
					{
						$_SESSION['registrazioneriuscita']=true;
						header('location: witamy.php');
					}
					else
					{
						echo "qualcosa non ha funzionato";

						//il problema nasce perchè si realizza questo else.

						//throw new Exeption($connessione->error);
					}
				}
				$connessione->close();
			}
		}
		catch(Exeption $e)
		{
			echo '<span style="color:red;">Errore del server, ci scusiamo per il disagio.</span>';
			echo '<br/>Informacja developerska'.$e;
		}

	}

?>
il problema si verifica dopo aver fatto tutti i controlli il programma entra nell'if (tutto_OK==true) tuttavia non si concretizza l'if interno che andrebbe ad aggiungere l'utente al database e si verifica l'else.

So che il codice è piuttosto lungo pertanto ringrazio di cuore chiunque sia disposto ad aiutarmi.

PS. la linea di codice incriminata si trova sul fondo dentro il sistema di controllo errori.

5 Risposte

  • Re: Problema form di registrazione

    Ciao, ho letto il codice e nel comando CATCH vedo un possibile errore, io uso PDO ma credo sia la stessa cosa, credo.
    Quando gestisco un try/catch devo indicare se voglio gestire un errore/eccezione di tipo generale o del PDO quindi uso per il
    PDO il comando CATCH(PDOException $e) in modo che l'oggetto $e sia l'errore PDO, credo quindi che per gestire la stessa cosa in MUSQLI serva il comando CATCH(mysqli_sql_exception $e)

    Se rendi disponibile il file html di input e la struttura della tabella posso fare dei test...
    Ciao
  • Re: Problema form di registrazione

    curzio.maria ha scritto:


    Ciao, ho letto il codice e nel comando CATCH vedo un possibile errore, io uso PDO ma credo sia la stessa cosa, credo.
    Quando gestisco un try/catch devo indicare se voglio gestire un errore/eccezione di tipo generale o del PDO quindi uso per il
    PDO il comando CATCH(PDOException $e) in modo che l'oggetto $e sia l'errore PDO, credo quindi che per gestire la stessa cosa in MUSQLI serva il comando CATCH(mysqli_sql_exception $e)

    Se rendi disponibile il file html di input e la struttura della tabella posso fare dei test...
    Ciao
    Ciao, per quanto riguarda l'errore nel catch può darsi dato che non mi gestiva a dovere gli errori, temo però che non è per questo che il codice non funziona, dato che il problema si verifica quando si va a verificare la condizione interna di tutto_OK, ti lascio comunque qui sotto il resto del codice,

    Registrati.php
    <?php
    
    	session_start();
    
    	//se questa variabile esiste allora qualcuno ha inviato i dati di questo formulario pertanto ne valideremo i dati.
    	
    	if(isset($_POST['email']))
    	{
    		$tutto_OK=true;
    		
    		//Controlla se il nickname è corretto.
    		$nick = $_POST['nick'];
    
    		//controlliamo la lunghezza della stringa. 
    		if((strlen($nick)<3) || (strlen($nick)>20))
    		{
    			$tutto_OK=false;
    			$_SESSION['e_nick']="Il nickname deve contenere tra i 3 e i 20 caratteri.";
    		}
    
    		if(ctype_alnum($nick)==false)
    		{
    			$tutto_OK=false;
    			$_SESSION['e_nick']="Il nickname può avere solo caratteri alfanumerici";
    		}
    
    		//controlla se la mail e corretta.
    		//si occuperà anche di sanitizzare il codice
    		//B = Bezpieczna
    
    		$email = $_POST['email'];
    		$emailB = filter_var($email,FILTER_SANITIZE_EMAIL);
    		
    		if((filter_var($emailB,FILTER_VALIDATE_EMAIL)==false) || ($emailB != $email))
    		{
    			$tutto_OK=false;
    			$_SESSION['e_email']="Fornisci un indirizzo email valido";
    		}
    
    		//controlla se le password sono corrette
    
    		$password1 = $_POST['password1'];
    		$password2 = $_POST['password2'];
    
    		if((strlen($password1)<8 ||(strlen($password1)>20)))
    		{
    			$tutto_OK=false;
    			$_SESSION['e_password']="La password deve avere tra gli 8 e i 20 caratteri";
    		}
    		if($password1!=$password2)
    		{
    			$tutto_OK=false;
    			$_SESSION['e_password2']="Le password devono coincidere";
    		}
    
    		$password_hash=password_hash($password1,PASSWORD_DEFAULT);
    
    		if(!isset($_POST['regulamin']))
    		{
    			$tutto_OK=false;
    			$_SESSION['e_regulamin']="Conferma l'accettazione del regolamento";
    		} 
    
    		$secret="LA_MIA_CHIAVE SEGRETA;
    
    		//recupera dal sito di google con un get il risultato del captcha. usa & per estrarre il valore di quello che probabilmente è un puntatore che ritorna
    
    		$controlla = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
    
    		$risposta=json_decode($controlla);
    
    		if($risposta->success==false)
    		{
    			{
    				$tutto_OK=false;
    				$_SESSION['e_bot']="conferma di non essere un bot";
    		    }
    		}
    
    		//avevo dimenticato di salvare le variabili inserite nella sessione.
    
    		$_SESSION['fr_nick'] = $nick;
    		$_SESSION['fr_email'] = $email;
    		$_SESSION['fr_password1'] = $password1;
    		$_SESSION['fr_password2'] = $password2;
    		if (isset($_POST['regulamin'])) $_SESSION['fr_regulamin'] = true;
    
    		require_once "connect.php";
    		mysqli_report(MYSQLI_REPORT_STRICT);
    
    		//metodo try catch per la connessione NON FUNZIONA : fatal errors are uncatchable.
    
    		try
    		{
     			$connessione = new mysqli($host, $db_user, $db_password, $db_name);
    
     			if($connessione->connect_errno!=0)
    			{
    				throw new Exeption(mysqli_connect_errno());
    			}
    			else
    			{
    				//controlla se l'email già esiste
    				$risultato = $connessione->query("SELECT id FROM users WHERE email='$email'");
    
    				if(!$risultato) 
    				{
    					throw new Exeption($connessione->error);
    				}
    
    				$ile_takich_maili = $risultato->num_rows;
    				if($ile_takich_maili>0)
    				{
    					{
    						$tutto_OK=false;
    						$_SESSION['e_email']="esiste già un account con questa mail";
    		    		}
    				}
    
    				//controlla se il nick già esiste
    				$risultato = $connessione->query("SELECT id FROM users WHERE user='$nick'");
    
    				if(!$risultato) throw new Exeption($connessione->error);
    
    				$ile_takich_nikow = $risultato->num_rows;
    				if($ile_takich_nikow>0)
    				{
    					{
    						$tutto_OK=false;
    						$_SESSION['e_nick']="esiste già un account con questo nickname";
    		    		}
    				}
    				//il codice accede a questo if ma non completa la condizione interna.
    				if ($tutto_OK==true)
    				{
    					//tutti i test sono stati completati, aggiungo 	l'utente al database.
    
    					//-> serve ad accedere ai campi di un oggetto.
    
    					if($connessione->query("INSERT INTO users VALUES (NULL,'$nick','$password_hash','$email')"))
    					{
    						$_SESSION['registrazioneriuscita']=true;
    						header('location: witamy.php');
    					}
    					else
    					{
    						echo "qualcosa non ha funzionato";
    
    						//il problema nasce perchè si realizza questo else.
    
    						//throw new Exeption($connessione->error);
    					}
    				}
    				$connessione->close();
    			}
    		}
    		catch(Exeption $e)
    		{
    			echo '<span style="color:red;">Errore del server, ci scusiamo per il disagio.</span>';
    			echo '<br/>Informacja developerska'.$e;
    		}
    
    	}
    
    ?>
    
    <!DOCTYPE html>
    <html>
    <head>
    	<link rel="stylesheet" type="text/css" href="styles.css"/>
    	<meta charset="utf-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1"/>
    	<title>Branco - registra un nuovo account</title>
    	<script src="https://www.google.com/recaptcha/api.js" async defer></script>
    
    	<style>
    		.error
    		{
    			color: red;
    			margin_top: 10px;
    			margin_bottom: 10px;
    		}
    	</style>
    </head>
    
    <body>
    		<div id = "container">
    			<header>
    				<div id = testata>
    				<h1>Stay N'Branco</h1>
    
    				<!--non ho inserito all'interno dei campi del form l'invio delle variabili. Vanno inserite all'interno di value-->
    
    				<form id = "registrati" method = "post">
    					Nickname: <br/> <input type='text' name='nick' value="<?php
    			if (isset($_SESSION['fr_nick']))
    			{
    				echo $_SESSION['fr_nick'];
    				unset($_SESSION['fr_nick']);
    			}
    		?>"/><br/>
    
    
    					<?php
    						if((isset($_SESSION['e_nick'])))
    						{
    							echo '<div class="error">'.$_SESSION['e_nick'].'</div>';
    							unset($_SESSION['e_nick']);
    						}
    					?>
    
    					Email: <br/> <input type='text' name='email' value="<?php
    			if (isset($_SESSION['fr_email']))
    			{
    				echo $_SESSION['fr_email'];
    				unset($_SESSION['fr_email']);
    			}
    		?>"/><br/>
    
    					<?php
    						if((isset($_SESSION['e_email'])))
    						{
    							echo '<div class="error">'.$_SESSION['e_email'].'</div>';
    							unset($_SESSION['e_email']);
    						}
    					?>
    
    					Password: <br/> <input type='password' name='password1' value="<?php
    			if (isset($_SESSION['fr_password1']))
    			{
    				echo $_SESSION['fr_password1'];
    				unset($_SESSION['fr_password1']);
    			}
    		?>"/><br/>
    
    					<?php
    						if((isset($_SESSION['e_password'])))
    						{
    							echo '<div class="error">'.$_SESSION['e_password'].'</div>';
    							unset($_SESSION['e_password']);
    						}
    					?>
    
    					Ripeti Password: <br/> <input type='password' name='password2' value="<?php
    			if (isset($_SESSION['fr_password2']))
    			{
    				echo $_SESSION['fr_password2'];
    				unset($_SESSION['fr_password2']);
    			}
    		?>"/><br/>
    
    					<?php
    						if((isset($_SESSION['e_password2'])))
    						{
    							echo '<div class="error">'.$_SESSION['e_password2'].'</div>';
    							unset($_SESSION['e_password2']);
    						}
    					?>
    					
    						<br/><input type="checkbox" name="regulamin"/> Akceptuje <a href="#">regulamin</a><br/>
    
    					<?php
    						if((isset($_SESSION['e_regulamin'])))
    						{
    							echo '<div class="error">'.$_SESSION['e_regulamin'].'</div>';
    							unset($_SESSION['e_regulamin']);
    						}
    					?>
    	
    					<br/><div class="g-recaptcha" data-sitekey="6Lcoqk4hAAAAAFJiEebIXx3LRerVOgVFwhDpSmah"></div>
    
    					<?php
    						if((isset($_SESSION['e_bot'])))
    						{
    							echo '<div class="error">'.$_SESSION['e_bot'].'</div>';
    							unset($_SESSION['e_bot']);
    						}
    					?>
         			
         				<input type="submit" value="Submit">
    
    				</form>
    		
    				</div>
    			</header>
    		</div>
    Connect.php
    <?php
    
    	$host = "localhost";
    	$db_user = "root";
    	$db_password = "";
    	$db_name = "branco";
    
    ?>
    Index.php
    <?php
    	session_start();
    
    	if ((isset($_SESSION['logged'])) && ($_SESSION['logged'] == true))
    	{
    		header('location: area_personale.php');
    		exit();
    
    	//exit non fa eseguire le linee di codice successive che normalmente verrebbero eseguite;
    		
    	}
    ?>
    
    <!DOCTYPE html>
    <html>
    <head>
    	<link rel="stylesheet" type="text/css" href="styles.css"/>
    	<meta charset="utf-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1"/>
    	<title>Stay N'Branco</title>
    </head>
    
    <body>
    		<div id = "container">
    			<header>
    				<div id = testata>
    				<h1>Stay N'Branco</h1>
    				<form id = "login" action="zaloguj.php" method="post">
    					Login: <br><input type="text" name="login"/>
    					Password: <br><input type="password" name="password"/>
    					<input type="submit" value="Zaloguj sie"/>
    				</form>
    				<a href="registrati.php"><p>Non hai un account? Registrati!</p></a>
    
    				<?php
    					if(isset($_SESSION['errore']))
    					{
    						echo $_SESSION['errore'];
    					} 
    				?>
    
    				</div>
    			</header>
    		</div>
    
    </body>
    
    </html>
    
    Witamy.php //pagina di reindirizzamento per registrazione riuscita
    <?php
    	session_start();
    
    	if(!isset($_SESSION['registrazioneriuscita']))
    	{
    		header('location: index.php');
    		exit();
    
    	//exit non fa eseguire le linee di codice successive che normalmente verrebbero eseguite;
    		
    	}
    	else
    	{
    		unset($_SESSION['registrazioneriuscita']);
    	}
    ?>
    
    <!DOCTYPE html>
    <html>
    <head>
    	<link rel="stylesheet" type="text/css" href="styles.css"/>
    	<meta charset="utf-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1"/>
    	<title>Stay N'Branco</title>
    </head>
    
    <body>
    	Grazie per esserti registrato al servizio! puoi accedere al tuo account.
    		
    		<a href="index.php">Loggati al tuo account!</a>
    
    				</div>
    			</header>
    		</div>
    
    </body>
    
    </html>
    Tabella mysql
    -- phpMyAdmin SQL Dump
    -- version 5.2.0
    -- https://www.phpmyadmin.net/
    --
    -- Host: localhost
    -- Creato il: Ago 08, 2022 alle 18:32
    -- Versione del server: 10.4.24-MariaDB
    -- Versione PHP: 8.1.6
    
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    START TRANSACTION;
    SET time_zone = "+00:00";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
    
    --
    -- Database: `branco`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Struttura della tabella `users`
    --
    
    CREATE TABLE `users` (
      `id` int(11) NOT NULL,
      `user` text NOT NULL,
      `password` text NOT NULL,
      `email` text NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    --
    -- Dump dei dati per la tabella `users`
    --
    
    INSERT INTO `users` (`id`, `user`, `password`, `email`) VALUES
    (1, 'adam', '$2y$10$qO2FJHA2TvFatRem7U0n0eNKKQR1Ktea5Qft17uDR7U2x86gRXVe.', 'adam@gmail.com');
    COMMIT;
    
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    non ho aggiunto la pagina del login o altre pagine superflue, grazie mille in anticipo
  • Re: Problema form di registrazione

    Ciao,
    l'errore, come ipotizzavo, era nella query di inserimento, per essere più precisi nella struttura della tabella user.
    Nella tua tabella il campo ID non aveva indice e non accettava di default valori NULL, nella tua query passavi un valore
    NULL per il campo.

    Premesso che non ha alcun senso un campo ID senza indice (PRYMARY KEY) se non vuoi passare ogni volta tu un valore
    UNIVOCO è sufficiente aggiungere la proprietà AUTO INCREMENTAL il database inserirà un valore automaticamente.

    Visto che hai scelto un INTEGER per questo campo quanto sopra pare indispensabile, anche perché senza indice non
    saresti comunque in grado di gestire nessun tipo di JOIN su questa tabella.

    Ciò premesso resta validissima la considerazione circa la necessità di gestire correttamente gli errori, utilizzando il
    CATCH come ti ho suggerito avresti ricevuto un messaggio di errore molto chiaro e saresti stato in grado di
    correggere l'errore rapidamente.

    La leggibilità del codice è importantissima, altrettanto importante è limitare le righe di codice duplicate, mi
    permetto due osservazioni, o suggerimenti :
    HTML5 consente una validazione degli input abbastanza valida, se per l'input della email utilizzi type="email" avrai la
    validazione dell'e-mail prima dell'invio del POST,idem per altri tipi di campo, inoltre HTML consente l'utilizzo delle
    REGEXP (espressioni regolari) per la validazione dei campi, le espressioni regolari sono un rompicapo ma per
    usi comuni ne trovi a bizzeffe già pronte es. codice fiscale cellulari italiani etc.

    Oltre a sanificare i POST è comunque INDISPENSABILE per qualsiasi operazione sul database utilizzare
    i PREPARED STATEMENT disponibili sia in PDO sia in MYSQLI, non utilizzarli è come partecipare a una
    sessione di roulette russa.

    Infine un consiglio, prova ad utilizzare PDO al posto di MYSQLI, è meglio sotto ogni punto di vista, ed è
    più facile da utilizzare.

    Ciao
  • Re: Problema form di registrazione

    Grazie mille della pazienza mi hai dato un aiuto enorme
  • Re: Problema form di registrazione

    E' stato un piacere
Devi accedere o registrarti per scrivere nel forum
5 risposte