Aiuto con php

di il
25 risposte

Aiuto con php

Volevo fare un form e quando completato i dati venivano salvati su un database e ieri funzionava, oggi ricontrollo se funziona e mi dice che non è settato un bottone submit ma non vedo errori, mi potreste aiutare?
https://drive.google.com/drive/folders/1q9iOYW-H4qVqyHWZ-XldOvcmGCsaOR9D?usp=sharing

25 Risposte

  • Re: Aiuto con php

    Ciao, premetto che sono tutt'altro che un esperto, ho notato che il form HTML chiama per l'elaborazione del POST un form php che hai chiamato index.php.

    In qualsiasi ambiente di PHP viene prima eseguito il form index quindi è normale che tu riceva il messaggio di POST non valorizzato.

    Io ho fatto una semplice prova, ho rinominato index.php in poldo.php (anche nel form HTML) e pare non ci siano problemi, dico pare perché non hai reso disponibile il file css e... non avevo voglia di creare la tabella in mysql.

    Se questo non è sufficiente a risolvere il tuo problema rendimi disponibile la tabella mysql e di sicuro troviamo la soluzione.

    Immagino che il tuo sorgente sia un semplice test dato che noto due problemi importanti :

    Anche se usi MYSQLI DEVI preventivamente filtrare i dati del POST con i comandi
    filter_var($_POST[nome-post], FILTER_SANITIZE_)
    Non ho mai utilizzato MYSQLI, e non lo conosco e quindi prendi quanto segue con beneficio d'inventario ,
    non credo che la gestione degli errori possa funzionare SENZA un costrutto TRY/CATCH.

    Per quanto di mia conoscenza solo TRY/CATCH gestisce gli errori, nel tuo caso, una email duplicata ( o qualsiasi campo duplicato con index unico) scatenerebbe un errore con crash.

    Scusa per la lunghezza della risposta.
  • Re: Aiuto con php

    Grazie per la risposta curzio.maria.
    Applicando i suggerimenti ditemi nel messaggio precedente non vedo nessun cambiamento, non è che potresti mandarmi i file modificati da te?
    Grazie in anticipo
  • Re: Aiuto con php

    Ciao, non capisco come sia possibile non ci siano cambiamenti, certo non funziona ma semplicemente cambiando index.php in xxx.php il form html deve per forza apparire a schermo.

    Funziona così, almeno nel tuo caso, il form signup.html ha un form per la raccolta dati, un pulsante di post che invia i dati raccolti al form xxx.php ( <form action="xxx.php" method="post">) e in questo form avviene la gestione dei dati con php.

    Gestione dei dati che di norma ( in modo molto, molto semplificato ) è la seguente :
    filtraggio e pulizia dei dati raccolti
    da qui con gestione errori ->
    connessione al database
    esecuzione della query (mysqli - PDO etc)
    -> chiusura gestione errori.

    Credo che il tuo problema sia la molto (molto) scarsa conoscenza di php, nulla di grave il mio skill è probabilmente solo di poco superiore al tuo quindi suggerisco quanto segue :
    posta il file css che utilizzi nel tuo script, e la struttura dati della tua tabella sql, io ricreo lo script e lo faccio funzionare, ovviamente prometto efficacia non efficienza, sono certo che la quasi totalità dei partecipanti al forum sia in grado di far molto meglio di me.

    Ciao

    In alternativa cerca su youtube questo filmato [IT] Sistema di autenticazione in php v1.2 #1.mp4 ( e quelli collegati) l'autore si chiama SCOCOZZA, è una LECTIO MAGISTRALIS su questo argomento.
  • Re: Aiuto con php

    Ok grazie per la risposta, quando compilo il form e clicco invia mi da questo errore: "Parse error: syntax error, unexpected variable "$lastname" in F:\Processi\xampp\htdocs\Project\ciao.php on line 15". Ti mando tutti i file e la struttura SQL.
    https://drive.google.com/drive/folders/1q9iOYW-H4qVqyHWZ-XldOvcmGCsaOR9D?usp=sharing
  • Re: Aiuto con php

    ... non hai postato il file js che 'pagina' il form, l'errore segnalato è causato dalla mancanza del ; alla riga indicata
  • Re: Aiuto con php

    Ok ho aggiornato il file php mettendo i punti e virgola alla fine e mi dice:"Submit button is not set". Ti ho pubblicato anche il file js del form
  • Re: Aiuto con php

    Ciao, l'errore submit button is not set l'ho visto e corretto, il controllo su $_POST è sbagliato.
    Aggiungo il file js e controllo l'insieme.
  • Re: Aiuto con php

    Buongiorno
    Dove hai aggiunto il file js corretto? Sulla cartella sul drive?
  • Re: Aiuto con php

    Buongiorno,
    ... Buongiorno
    Dove hai aggiunto il file js corretto? Sulla cartella sul drive?
    Intendevo dire che avrei spostato il file js nella cartella dell'applicazione sul mio PC.

    Adesso funziona, ecco cosa ho corretto :

    file ciao.php - prima riga -> if (isset($_POST['submit'])) {
    nel form il bottone di submit non ha nome e quindi $_POST['submit'] torna NULL o vuoto.
    Quindi ho dato un name al bottone di submit e 'l'ho controllato con if (isset($_POST['registra'])) { ...
    potevo anche lasciare senza name e controllare con if ($_POST) { ...
    era esattamente uguale.

    Secondo la query di inserimento è completamente sbagliata, hai scritto :
    $stmt->bind_param("ssssii",$username, $password, $gender, $email, $phoneCode, $phone, $firstname, $lastname);

    primo non hai una variabile $phoneCode ma $birth, secondo il primo parametro è di 6 caratteri, le variabili 8, non conosco
    MYSQLI ma sono certo che tipo campo e valore campo devono essere in numero uguale.

    Corretto quanto sopra registra correttamente gli utenti.

    Però osservo quanto segue :
    if (isset($_POST['username']) && isset($_POST['password']) &&
    isset($_POST['gender']) && isset($_POST['email']) &&
    isset($_POST['birth']) && isset($_POST['phone']) &&
    isset($_POST['FirstName']) && isset($_POST['LastName'])) {
    codice inutile se in HTML metti required
    Non hai filtrato i dati prima dell'inserimento nel database, usare i prepared statement NON E' SUFFICIENTE
    anche se in visualizzazione poi li filtri con HTMLSpecialChar o simili.



    Fammi sapere se con le correzioni indicate funziona anche a te
    Ciao
  • Re: Aiuto con php

    Ciao
    Ho sostituito le parti sbagliate del file e registra il tutto, ma non il FirstName e il LastName anche se io lo riempio. Ho provato a vedere e i nomi coincidono, come mai?
  • Re: Aiuto con php

    Ciao,

    Ho sostituito le parti sbagliate del file e registra il tutto, ma non il FirstName e il LastName
    anche se io lo riempio. Ho provato a vedere e i nomi coincidono, come mai?

    Io sono nato il 12 marzo, quanto peso ?
    Scherzi a parte è una domanda cui non posso rispondere senza vedere il tuo sorgente.
    A seguire il codice funzionante
    
    <?php
    // Se non setti   error_reporting(?)
    // l'applicazione invierà a schermo ad ogni errore e warning informazioni
    // che dovrebbero restare riservate, questo può andare bene in fase di
    // sviluppo ma è molto pericoloso in ambiente di produzione (installato sul server internet)
    // quindi in un file include (consigliato) o all'inizio di ogni script
    // php (...mai...) inserisci il comando :
    // in sviluppo ; error_reporting(E_ALL); mostra warning ed errori
    // in produzione : error_reporting(0); non mostra nulla, leggendo il manuale
    // vedrai le altre opzioni disponibili.
    // Mi sono creato io la tabella per questo test quindi controlla il nome
    // della tabella e correggi con quella che usi tu, idem per il nome dei campi,
    // inoltre per semplicità ho messo tutti i campi a tipo varchar, correggi secondo
    // le tue impostazioni la query
    //      $stmt->bind_param("xxxxxxxx",$username, $password, $gender, $email, $birth, $phone, $firstname, $lastname);
    // nella mia tabella ho, oltre ai tuoi 8 campi un campo ID PK AI, ma il codice non cambia
    if (isset($_POST['registra'])) {
    //   Se sei qui il POST è attivo altrimenti saresti ancora in signup.php
    //   questo controllo di solito si usa se parte php e parte html sono sullo stesso form
    //   così al carimento esegue o meno la parte POST
        if (isset($_POST['username']) && isset($_POST['password']) &&
            isset($_POST['gender']) && isset($_POST['email']) &&
            isset($_POST['birth']) && isset($_POST['phone']) &&
            isset($_POST['FirstName']) && isset($_POST['LastName'])) {
    // Di solito il controllo della valorizzazione dei singoli POST si esegue lato html
    //  semplicemente aggiungendo il parametro o attributo  required
    //  il controllo viene eseguito senza ricaricare la pagina e nel caso tu abbia
    //  molti campi eviti confusione e dimenticanze
    
            $username = $_POST['username'];
            $password = $_POST['password'];
            $gender = $_POST['gender'];
            $email = $_POST['email'];
            $birth = $_POST['birth'];
            $phone = $_POST['phone'];
            $firstname = $_POST['FirstName'];
            $lastname = $_POST['LastName'];
            $pippo=$username . $password . $gender.$email. $birth. $phone. $firstname. $lastname;
            $host = "localhost";
            $dbUsername = "root";
            $dbPassword = "";
            $dbName = "lectio";  <--- cambiare
    
    // In realtà è altamente consigliato, meglio obbligatorio, filtrare i dati del POST
    // quanto inserito dall'utente NON E' MAI SICURO
    // sotto un esempio di filtraggio, controlla il manuale per le varie opzioni
     $username= filter_var($_POST['username'], FILTER_SANITIZE_STRING);
     $phone= filter_var($_POST['phone'], FILTER_SANITIZE_NUMBER_INT);
     $numero_con_virgola= filter_var($_POST['conPmi'], FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);
    // Connessione, usare try/CATCH per gestire gli errori
     $conn = new mysqli($host, $dbUsername, $dbPassword, $dbName);
     if ($conn->connect_error) {
                die('Could not connect to the database.');
            }
     else {
               // Controllo esistenza email, non crea problemi ma perchè limit 1
               // se controlli l'inserimento avrai eventualmente solo una email
               // di ritorno, anche perchè immagino avrai messo un indice unique
               // sul campo ...immagino...
                $Select = "SELECT email FROM registrati WHERE email = ? LIMIT 1";
                $stmt = $conn->prepare($Select);
                $stmt->bind_param('s', $email);
                $stmt->execute();
                $stmt->bind_result($resultEmail);
                $stmt->store_result();
                $stmt->fetch();
                $rnum = $stmt->num_rows;
                if ($rnum == 0) {
                $stmt->close();
                $Insert = "INSERT INTO registrati  (username, password, gender, email, birth, phone, firstname,lastname) values(?, ?, ?, ?, ?, ?, ?, ?)";
                $stmt = $conn->prepare($Insert);
                $stmt->bind_param("ssssssss",$username, $password, $gender, $email, $birth, $phone, $firstname, $lastname);
                if ($stmt->execute()) {
                        echo "New record inserted sucessfully.";
                 }
                    else {
                        echo $stmt->error;
                    }
                }
                else {
                    echo "Someone already registers using this email.";
                }
                $stmt->close();
                $conn->close();
            }
        }
        else {
            echo "All field are required.";
            die();
        }
    }
    else {
        echo "Submit button is not set";
    }
    ?>
    
    Credo sia tutto, fammi sapere.
  • Re: Aiuto con php

    curzio.maria ha scritto:




    Secondo la query di inserimento è completamente sbagliata, hai scritto :
    $stmt->bind_param("ssssii",$username, $password, $gender, $email, $phoneCode, $phone, $firstname, $lastname);

    primo non hai una variabile $phoneCode ma $birth, secondo il primo parametro è di 6 caratteri, le variabili 8, non conosco
    MYSQLI ma sono certo che tipo campo e valore campo devono essere in numero uguale.

    Ciao
    Con il file tutto bene ora va una meraviglia, solo una domanda, cosa vuol dire ciò che hai scritto qui sopra citato, "il primo parametro è di 6 caratteri, le variabili 8, non conosco
    MYSQLI ma sono certo che tipo campo e valore campo devono essere in numero uguale.". Non ho capito in che senso, a cosa deve essere uguale?
    Grazie e scusa per le continue domande
  • Re: Aiuto con php

    Ciao,
    questa è la tua query originale :
      $stmt->bind_param("ssssii",$username, $password, $gender, $email, $phoneCode, $phone, $firstname, $lastname);

    non conosco MYSQI però sono abbastanza certo che le lettere della stringa corrispondano ai tipi (int varchar date) dei parametri indicati dopo la virgola.
    $username è stringa quindi s, $password è stringa quindi s, $geneder è stringa quindi s,
    $email è stringa quindi s, $phoneCode (avrebbe dovuto essere la data) ma hai indicato i cone integer,
    $phone è integer quindi i ....manca la s di $firstaname e òa s di $lastname.

    numero e tipo di parametro devono essere in numero uguale, di sicuro con PDO ma credo anche in MYSQLI.
    Infatti se guardi la query che ti ho inviato
    
         $stmt->bind_param("ssssssss",$username, $password, $gender, $email, $birth, $phone, $firstname, $lastname);
    
    hai 8 caratteri che indicano il tipo degli 8 parametri passati, in PDO puoi evitare di collegare il tipo del parametro passato,
    di norma assegna per default string che va bene con tutto ma in MYSQL non credo sia possibile, ma qualora sia possibile
    è buona norma abituarsi a passare sempre i dati nel modo più completo, un aggiornamento potrebbe cambiare le cose
    e .... dramma.

    Non preoccuparti per la quantità di domande, agli inizi (l'anno scorso) in molti mi hanno aiutato con le loro risposte ed ora, se posso, mi fa piacere dare una mano.

    Non ho capito però cosa stai facendo, ti stai esercitando con script generici o stai cercando di realizzare una tua applicazione ?

    Nel secondo caso potrei evitarti la scrittura del codice di login inviandoti il template che uso io, inizialmente copiato
    pari pari da internet e poi migliorato, la parte database è in PDO ma potrebbe essere utile per una migrazione
    indolore a questa interfaccia che ti assicuro è quella consigliata in ogni manuale di PHP
    Ciao
  • Re: Aiuto con php

    Sto facendo una pagina con due opzioni: sign in e sign up. La parte di registrazione l'ho fatta e funziona perfettamente, la parte di login non mi funziona. Se ti mando il tutto mi puoi dire che non va. Grazie mille

    https://www.filemail.com/d/lozyjtvpzfbckh questo è il link che contiene tutti e quattro i file
Devi accedere o registrarti per scrivere nel forum
25 risposte