Errore form registrazione

di il
10 risposte

Errore form registrazione

Buongiorno a tutti,

ho un form di registrazione con vari dati(identificativi del'Utente e a quale Ufficio fa parte) che alcuni dati (username, password, nome, email) andranno nella tabella myphp users e altri (codice_dip, username, titolo, nome, direzione, area, unita, ufficio, ruolo, posizione) andranno nella tabella posizione.

premetto che prima esisteva solo la prima tabella(users) e andava tutto, ora mi restituisce un errore nella pagina register.php che vi allego, ho provato ha togliere la password e l'errore si ripete.


vi ricopio l'errore:
Le Credenziali sono state inviate alla casella e-mail .
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /membri/arrigo/php/register.php:88 Stack trace: #0 /membri/arrigo/php/register.php(88): PDOStatement->bindParam(':password', '$2y$10$LuGTj3Po...', 2) #1 {main} thrown in /membri/arrigo/php/register.php on line 88

Vi allego i 2 codici:

register.html

<!DOCTYPE html>
<html>
    <head>
        <link rel="icon" href="images/logo.ico" />
        <title>Registrazione Utente</title>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans&display=swap">
        <link rel="stylesheet" href="css/style-registrazione.css">
    </head>
    <body>

    

        <form autocomplete="on" method="post" action="php/register.php">
            <h1>Registrazione Utente</h1>
			<input type="text" id="codice_dip" placeholder="Codice Dipendente"  name="codice_dip" >
            <input type="text" id="titolo" placeholder="Titolo"  name="titolo" >
            <input type="text" id="nome" placeholder="Nome"  name="nome" required>
            <input type="text" id="email" placeholder="E-mail"  name="email" required>
            <input type="text" id="username" placeholder="Username" name="username" maxlength="50" required>
            <input type="hidden" id="password" value="1234" name="password" required >

                <center>
               <p>Direzione </p>
            <select nome="direzione" id="direzione" size="5" required>
            	<option>Direzione Generale</option>
            	<option>Direzione Amministrativa</option>
                <option>Direzione Commerciale</option>
                <option>Direzione Risorse Umane ed Organizzazione</option>
                <option>Direzione Sistemi Infdormativi Digitali</option>
			</select>
            <br>
            <br>
            	</center>
            <input type="text" id="area" placeholder="Area"  name="area" >
            <input type="text" id="unita" placeholder="Unita'"  name="unita" >
            <input type="text" id="ufficio" placeholder="Ufficio"  name="ufficio">
            
            	<center>
               <p> Ruolo </p>
            <select nome="ruolo" id="ruolo" size="1">
            	<option>Amministrativo</option>
            	<option>Tecnico</option>
                <option>Funzionario</option>
                <option>Alta Professionalita'</option>
                <option>Dirigente</option>
                <option>Direttore</option>
                <option>Direttore Operativo</option>
			</select>

             <p> Posizione </p>
           		
            <select nome="posizione" id="posizione" size="1" >
            	<option>Amministrativo</option>
            	<option>Tecnico</option>
                <option>Funzionario</option>
                <option>Dirigente</option>
			</select>
            </center>
            <br>
            <br>
            <button type="submit" name="register">Crea</button>
        </form>
    </body>
</html>




register.php

<?php
require_once('database.php');

if (isset($_POST['register'])) {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    $nome = $_POST['nome'] ?? '';
    $email = $_POST['email'] ?? '';
    $codice_dip = $_POST['codice_dip'] ?? '';
    $titolo = $_POST['titolo'] ?? '';
    $direzione = $_POST['direzione'] ?? '';
    $area = $_POST['area'] ?? '';
    $unita = $_POST['unita'] ?? '';
    $ufficio = $_POST['ufficio'] ?? '';
    $ruolo = $_POST['ruolo'] ?? '';
    $posizione = $_POST['posizione'] ?? '';
    $isUsernameValid = filter_var(
        $username,
        FILTER_VALIDATE_REGEXP, [
            "options" => [
                "regexp" => "/^[a-z\d.]{3,20}$/i"
            ]
        ]
    );
    $pwdLenght = mb_strlen($password);
    
    if (empty($username) || empty($password)) {
        $msg = 'Compila tutti i campi %s';
    } elseif (false === $isUsernameValid) {
        $msg = 'Lo username non è valido. Sono ammessi solamente caratteri 
                alfanumerici e l\'underscore. Lunghezza minina 3 caratteri.
                Lunghezza massima 20 caratteri';
    } elseif ($pwdLenght < 3 || $pwdLenght > 20) {
        $msg = 'Lunghezza minima password 3 caratteri.
                Lunghezza massima 20 caratteri';
    } else {
        $password_hash = password_hash($password, PASSWORD_BCRYPT);
        $query = "
            SELECT id
            FROM users
            WHERE username = :username
        ";
        $testo_mail="Registrazione Utente:\r\n
        
        
					Credenziali Utente Registrato:\r\n
                    
                    
					Nome:$nome\r\n
 
					Username:$username\r\n
					Password:$password";

		/* creazione oggetto e testata mail */

		$mail_headers = "From: XXXXXXXX  <XXXXXXX@XXXXX.IT>\r\n";
		$mail_headers .= "Reply-To: " .  "XXXXXXXX@XXXXXXX.IT" . "\r\n";
		$oggetto="Credenziali Utente: $username";

		/* invio mail */
		if(mail($email, $oggetto, $testo_mail, $mail_headers))
         	{echo 'Le Credenziali sono state inviate alla casella e-mail ', $email, ".
            " ;}
		else  
         	{echo 'Problema riscontrato, E-mail non inviata.
            ';}

        $check = $pdo->prepare($query);
        $check->bindParam(':username', $username, PDO::PARAM_STR);
        $check->execute();
        
        $user = $check->fetchAll(PDO::FETCH_ASSOC);
        
        if (count($user) > 0) {
            $msg = 'Username già in uso %s';
        } else {
            $query = "
                INSERT INTO users
                VALUES (0, :username, :password, :nome, :email)
            "; 
            $query = "
                INSERT INTO posizione
                VALUES (:codice_dip, :username, :titolo, :nome, :direzione, :area, :unita, :ufficio, :ruolo, :posizione)
            ";
           
            $check = $pdo->prepare($query);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->bindParam(':password', $password_hash, PDO::PARAM_STR);
            $check->bindParam(':nome', $nome, PDO::PARAM_STR);
            $check->bindParam(':email', $email, PDO::PARAM_STR);
            $check->bindParam(':codice_dip', $codice_dip, PDO::PARAM_STR);
            $check->bindParam(':titolo', $titolo, PDO::PARAM_STR);
            $check->bindParam(':direzione', $direzione, PDO::PARAM_STR);
            $check->bindParam(':area', $area, PDO::PARAM_STR);
            $check->bindParam(':unita', $unita, PDO::PARAM_STR);
            $check->bindParam(':ufficio', $ufficio, PDO::PARAM_STR);
            $check->bindParam(':ruolo', $ruolo, PDO::PARAM_STR);
            $check->bindParam(':posizione', $posizione, PDO::PARAM_STR);
            
            $check->execute();
        
  
            if ($check->rowCount() > 0) {
                $msg = '
                		Registrazione eseguita con successo <a href="../login.html">Vai alla Pagina di accesso</a> <a href="../register.html">Registra un altro Utente</a>';
            } else {
                $msg = 'Problemi con l\'inserimento dei dati %s';
            }
        }
    }
    
    printf($msg, '<a href="../register.html">torna indietro</a>');
}

Vi ringrazio in anticipo.

10 Risposte

  • Re: Errore form registrazione

    Ciao,
    ti manca il parametro :password nella lista
    VALUES (:codice_dip, :username, :titolo, :nome, :direzione, :area, :unita, :ufficio, :ruolo, :posizione)
  • Re: Errore form registrazione

    Grazie della risposta,

    ma devo metterlo per forza....?

    io volevo che una parte di dati andassero in una tabella ed altri in un altra:

    - username, password, nome, email vorrei che andassero nella tabella users (come era già progettato in precedenza)

    - codice_dip, username, titolo, nome, direzione, area, unita, ufficio, ruolo, posizione vorrei che andassero nella tabelle posizione.
  • Re: Errore form registrazione

    Se lo indichi nel
    $check->bindParam(':password', $password_hash, PDO::PARAM_STR);
    certo che SI!
    Comunque il codice non ti funzionerà mai per fare quello che chiedi tu...
                $query = "
                    INSERT INTO users
                    VALUES (0, :username, :password, :nome, :email)
                "; 
                $query = "
                    INSERT INTO posizione
                    VALUES (:codice_dip, :username, :titolo, :nome, :direzione, :area, :unita, :ufficio, :ruolo, :posizione)
                ";
               
                $check = $pdo->prepare($query);
    cosi' facendo sovrascrivi la prima query in favore della seconda e non interesserai mai la tabella "users" ma sempre e solo la tabella "posizione".
  • Re: Errore form registrazione

    Aiuto!!!
    Ho messo insieme questi codici senza nemmeno capire che non andassero bene..

    Comunque esiste un modo per fare quello che voglio io?

    oppure mi conviene avere tutti questi dati in una singola tabella?

    grazie
  • Re: Errore form registrazione

    Esegui 2 query separate
    
                $query = "
                    INSERT INTO users
                    VALUES (0, :username, :password, :nome, :email)
                "; 
                $query2 = "
                    INSERT INTO posizione
                    VALUES (:codice_dip, :username, :titolo, :nome, :direzione, :area, :unita, :ufficio, :ruolo, :posizione)
                ";
               
                $check = $pdo->prepare($query);
                $check->bindParam(':username', $username, PDO::PARAM_STR);
                $check->bindParam(':password', $password_hash, PDO::PARAM_STR);
                $check->bindParam(':nome', $nome, PDO::PARAM_STR);
                $check->bindParam(':email', $email, PDO::PARAM_STR);
                $check->execute();
              
                $check = $pdo->prepare($query2);
                $check->bindParam(':username', $username, PDO::PARAM_STR);
                $check->bindParam(':nome', $nome, PDO::PARAM_STR);
                $check->bindParam(':email', $email, PDO::PARAM_STR);
                $check->bindParam(':codice_dip', $codice_dip, PDO::PARAM_STR);
                $check->bindParam(':titolo', $titolo, PDO::PARAM_STR);
                $check->bindParam(':direzione', $direzione, PDO::PARAM_STR);
                $check->bindParam(':area', $area, PDO::PARAM_STR);
                $check->bindParam(':unita', $unita, PDO::PARAM_STR);
                $check->bindParam(':ufficio', $ufficio, PDO::PARAM_STR);
                $check->bindParam(':ruolo', $ruolo, PDO::PARAM_STR);
                $check->bindParam(':posizione', $posizione, PDO::PARAM_STR);
                $check->execute();
    quando interessi 2 tabelle è consigliato utilizzare il beginTransaction() cosi in caso di errore in una delle 2 query i dati inseriti nella prima tabella vengono annullati
  • Re: Errore form registrazione

    Grazie mille, ci sono riuscito!

    ora ti chiede se riesci ad aiutarmi anche in questo...

    questo è login.php
    
    
    <?php
    session_start();
    require_once('database.php');
    
    if (isset($_SESSION['session_id'])) {
        header('Location: dashboard.php');
        exit;
    }
    
    if (isset($_POST['login'])) {
        $username = $_POST['username'] ?? '';
        $password = $_POST['password'] ?? '';
        $nome = $_POST['nome'] ?? '';
        $email = $_POST['email'] ?? '';
        $codice_dip = $_POST['codice_dip'] ?? '';
        $titolo = $_POST['titolo'] ?? '';
        $direzione = $_POST['direzione'] ?? '';
        $area = $_POST['area'] ?? '';
        $unita = $_POST['unita'] ?? '';
        $ufficio = $_POST['ufficio'] ?? '';
        $ruolo = $_POST['ruolo'] ?? '';
        $posizione = $_POST['posizione'] ?? '';
        
        if (empty($username) || empty($password)) {
            $msg = 'Inserisci username e password %s';
        } else {
            $query = "
                SELECT username, password, nome, email
                FROM users
                WHERE username = :username
            ";
            $query2 = "
                SELECT username, codice_dip, titolo, direzione, area, unita, ufficio, ruolo, posizione
                FROM posizione
                WHERE username = :username
            ";
    
            
            $check = $pdo->prepare($query);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->execute();
                    
            $check = $pdo->prepare($query2);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->execute();
           
            
            $user = $check->fetch(PDO::FETCH_ASSOC);
            
            if (!$user || password_verify($password, $user['password']) === false) {
                $msg = 'Credenziali utente errate %s';
            } else {
                session_regenerate_id();
                $_SESSION['session_id'] = session_id();
                $_SESSION['session_user'] = $user['username'];
                $_SESSION['session_nome'] = $user['nome'];
                $_SESSION['session_email'] = $user['email'];
                $_SESSION['session_titolo'] = $user['titolo'];
                $_SESSION['session_codice_dip'] = $user['codice_dip'];
                $_SESSION['session_direzione'] = $user['direzione'];
                $_SESSION['session_area'] = $user['area'];
                $_SESSION['session_unita'] = $user['unita'];
                $_SESSION['session_ufficio'] = $user['ufficio'];
                $_SESSION['session_ruolo'] = $user['ruolo'];
                $_SESSION['session_posizione'] = $user['posizione'];
                header('Location: dashboard.php');
                exit;
            }
        }
    
        
        printf($msg, '<a href="../login.html">torna indietro</a>');
    }

    dove sto sbagliando?

    ho inserito query2
    credo l'errore si crea qundo aggiungo questo:
    
            $check = $pdo->prepare($query2);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->execute();
            


    devo aggiungere tutti i dati di prima per poi richiamarli in una pagina privata del profilo.
  • Re: Errore form registrazione

    Davide, ma tu hai letto bene il codice che hai copiato/incollato un po' qui ed un po' li?
    Ok chiedere aiuto, siamo qui per aiutarci tutti, pero' le richieste devono comunque essere fatte con criterio e dopo averci studiato sopra.

    Ovviamente non ti accorgi nemmeno se si tratta di un errore di scrittura del codice oppure di un errore di semplice "logica" perchè non sai nemmeno tu quello che hai copiato ed incollato.

    Nello specifico:
    
           $query = "
                SELECT username, password, nome, email
                FROM users
                WHERE username = :username
            ";
            $query2 = "
                SELECT username, codice_dip, titolo, direzione, area, unita, ufficio, ruolo, posizione
                FROM posizione
                WHERE username = :username
            ";
    
            
            $check = $pdo->prepare($query);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->execute();
                    
            $check = $pdo->prepare($query2);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->execute();
           
            
            $user = $check->fetch(PDO::FETCH_ASSOC);
    
    esegui il $pdo->prepare prima sulla query 1 e poi sulla query2 ma assegni alla variabile $user solo il valore della seconda query..tradotto non hai salvato da nessuna parte i dati che prendi dalla prima query...quindi la variabile $user['password'] NON esiste perchè il campo password fa parte della prima query.
  • Re: Errore form registrazione

    Scusa... non ne capisco niente, i miei errori possono essere banalissimi come no, perchè vado a tentativi cerco i siti web, faccio di tutto ma anche cercare non è semplice...

    non capisco nemmeno dove ho assegnato la variabile $user alla query2 e come assegnarla alla query (1)
  • Re: Errore form registrazione

    davidedd ha scritto:


    non capisco nemmeno dove ho assegnato la variabile $user alla query2 e come assegnarla alla query (1)
    Bene ma non benissimo, crea una query unica ed hai risolto il problema.
    
    	$query = "
    	    SELECT users.username, users.password, users.nome, users.email, posizione.codice_dip, posizione.titolo, posizione.direzione, posizione.area, posizione.unita, posizione.ufficio, posizione.ruolo, posizione.posizione
                FROM users
                RIGHT JOIN posizione on posizione.username = users.username
                WHERE users.username = :username";
    
            
            $check = $pdo->prepare($query);
            $check->bindParam(':username', $username, PDO::PARAM_STR);
            $check->execute();
                            
            $user = $check->fetch(PDO::FETCH_ASSOC);
            
  • Re: Errore form registrazione

    tatino ha scritto:


    quando interessi 2 tabelle è consigliato utilizzare il beginTransaction() cosi in caso di errore in una delle 2 query i dati inseriti nella prima tabella vengono annullati
    Importantissimo in questo caso
Devi accedere o registrarti per scrivere nel forum
10 risposte