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