Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Problema inserimento dati db Mysql

    buongiorna a tutti, è il primo post in questo forum, ma il sito mi è sempre tornato molto utile!!!
    premetto che non sono espertissimo di php e ancora meno di interazione con database sql
    ho un problema con un form di registrazione,
    la base del codice è stata presa da un articolo su un sito che parla di php.
    nella versione originale il codice permette di inserire un nuovo record in un db sql, contente username email e password.
    la pagina in php ha i diversi input di testo e vengono passati a uno script php che li elabora e li inserisce nel db

    io ho la necessità di aggiungere altri campi, ma se li aggiungo alla query lo script non funziona, anzi mi blocca l'apertura anche della pagina di inserimento dati, trattandosi di un "include"

    il codice originale dello script che scrive nel db è il seguente:


    codice:
    <?php
    include_once 'db_connect.php';
    include_once 'psl-config.php';
     
    $error_msg = "";
     
    if (isset($_POST['username'], $_POST['email'], $_POST['p'])) {
        // Sanitize and validate the data passed in
        $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
        $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
        $email = filter_var($email, FILTER_VALIDATE_EMAIL);
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            // Not a valid email
            $error_msg .= '<p class="error">Indirizzo email non valido</p>';
        }
     
        $password = filter_input(INPUT_POST, 'p', FILTER_SANITIZE_STRING);
        if (strlen($password) != 128) {
            // The hashed pwd should be 128 characters long.
            // If it's not, something really odd has happened
            $error_msg .= '<p class="error">Configurazione password errata</p>';
        }
     
        // Username validity and password validity have been checked client side.
        // This should should be adequate as nobody gains any advantage from
        // breaking these rules.
        //
     
        $prep_stmt = "SELECT id FROM members WHERE email = ? LIMIT 1";
        $stmt = $mysqli->prepare($prep_stmt);
     
       // check existing email  
        if ($stmt) {
            $stmt->bind_param('s', $email);
            $stmt->execute();
            $stmt->store_result();
     
            if ($stmt->num_rows == 1) {
                // A user with this email address already exists
                $error_msg .= '<p class="error">L indirizzo email inserinto risulta registarto</p>';
                            $stmt->close();
            }
                    $stmt->close();
        } else {
            $error_msg .= '<p class="error">Database error Line 39</p>';
                    $stmt->close();
        }
     
        // check existing username
        $prep_stmt = "SELECT id FROM members WHERE username = ? LIMIT 1";
        $stmt = $mysqli->prepare($prep_stmt);
     
        if ($stmt) {
            $stmt->bind_param('s', $username);
            $stmt->execute();
            $stmt->store_result();
     
                    if ($stmt->num_rows == 1) {
                            // A user with this username already exists
                            $error_msg .= '<p class="error">Username non disponibile </p>';
                                                   
    $stmt->close();
                    }
                    $stmt->close();
            } else {
                    $error_msg .= '<p class="error">Database error line 55</p>';
                    $stmt->close();
            }
     
        // TODO: 
        // We'll also have to account for the situation where the user doesn't have
        // rights to do registration, by checking what type of user is attempting to
        // perform the operation.
     
        if (empty($error_msg)) {
            // Create a random salt
            //$random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE)); // Did not work
            $random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
     
            // Create salted password 
            $password = hash('sha512', $password . $random_salt);
     
            // Insert the new user into the database 
            if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)")) {
                $insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt);
                // Execute the prepared query.
                if (! $insert_stmt->execute()) {
                    header('Location: ../error.php?err=Registration failure: INSERT');
                }
            }
            header('Location: ./regSuccRed.php');
        }
    }


    Questo è il codice modificato con l'aggiunta degli altri dati (Carattere piu grande e sottolineato)


    codice:
    <?php
    include_once 'db_connect.php';
    include_once 'psl-config.php';
     
    $error_msg = "";
     
    if (isset($_POST['username'], $_POST['email'], $_POST['p'])) {
        // Sanitize and validate the data passed in
    $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
    $surname = filter_input(INPUT_POST, 'surname', FILTER_SANITIZE_STRING);
        $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
        $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
        $email = filter_var($email, FILTER_VALIDATE_EMAIL);
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            // Not a valid email
            $error_msg .= '<p class="error">Indirizzo email non valido</p>';
        }
     
        $password = filter_input(INPUT_POST, 'p', FILTER_SANITIZE_STRING);
        if (strlen($password) != 128) {
            // The hashed pwd should be 128 characters long.
            // If it's not, something really odd has happened
            $error_msg .= '<p class="error">Configurazione password errata</p>';
        }
     
        // Username validity and password validity have been checked client side.
        // This should should be adequate as nobody gains any advantage from
        // breaking these rules.
        //
     
        $prep_stmt = "SELECT id FROM members WHERE email = ? LIMIT 1";
        $stmt = $mysqli->prepare($prep_stmt);
     
       // check existing email  
        if ($stmt) {
            $stmt->bind_param('s', $email);
            $stmt->execute();
            $stmt->store_result();
     
            if ($stmt->num_rows == 1) {
                // A user with this email address already exists
                $error_msg .= '<p class="error">L indirizzo email inserinto risulta registarto</p>';
                            $stmt->close();
            }
                    $stmt->close();
        } else {
            $error_msg .= '<p class="error">Database error Line 39</p>';
                    $stmt->close();
        }
     
        // check existing username
        $prep_stmt = "SELECT id FROM members WHERE username = ? LIMIT 1";
        $stmt = $mysqli->prepare($prep_stmt);
     
        if ($stmt) {
            $stmt->bind_param('s', $username);
            $stmt->execute();
            $stmt->store_result();
     
                    if ($stmt->num_rows == 1) {
                            // A user with this username already exists
                            $error_msg .= '<p class="error">Username non disponibile </p>';
                                                   
    $stmt->close();
                    }
                    $stmt->close();
            } else {
                    $error_msg .= '<p class="error">Database error line 55</p>';
                    $stmt->close();
            }
     
        // TODO: 
        // We'll also have to account for the situation where the user doesn't have
        // rights to do registration, by checking what type of user is attempting to
        // perform the operation.
     
        if (empty($error_msg)) {
            // Create a random salt
            //$random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE)); // Did not work
            $random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
     
            // Create salted password 
            $password = hash('sha512', $password . $random_salt);
     
            // Insert the new user into the database 
            if ($insert_stmt = $mysqli->prepare("INSERT INTO members (name, surname, username, email, password, salt) VALUES (?, ?, ?, ?, ?, ?)")) {
                $insert_stmt->bind_param('ssss',$name, $surname, $username, $email, $password, $random_salt);
                // Execute the prepared query.
                if (! $insert_stmt->execute()) {
                    header('Location: ../error.php?err=Registration failure: INSERT');
                }
            }
            header('Location: ./regSuccRed.php');
        }
    }



    Naturalmene ho provveduto a modificare la struttura della tabella in questione aggiungendo i campi in pù, è ho chiamato i campi di input della pagina di registrazione nello stesso modo in cui vengono richiamati da questo script

    ho provato anche a fargli eseguire una query di update ma niente da fare, non ne vuole sapere.
    ne sto uscendo pazzo!!! non riesco a capire perchè se aggiungo altri dati non funziona.

    Grazie a tutti
    Pozzo

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Vuoi inserire 6 campi ma metti 7 valori nel bind.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Quote Originariamente inviata da badaze Visualizza il messaggio
    Vuoi inserire 6 campi ma metti 7 valori nel bind.
    grazie per la risposta
    Ma anche nel codice originale c'e un valore in piu 'ssss' che presumo vada sulla.colonna id che è a incremento automatico.il codice sopra funziona benissimo..se io aggiungo i miei 2 campi..non va
    Ultima modifica di pozzo1988; 24-07-2015 a 23:57

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Scrivi che lo script si ferma. Hai un messaggio di errore ?
    hai un error_reporting da qualche parte che impedirebbe la visualizzazione dell'errore ?
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    no nessun messaggio di errore, semplicemete se io apro la pagina con la parte grafica che hai campi di testo da compilare, la qualse ha un include con lo script scritto sopra, con il primo scipt funziona e inserisce i dati con l'altra non mi apre nemmeno la pagina.
    in teoria non niente che mi impedisce un error reporting, è come se ci fosse un errore nel codice e mi impedisce l'esecuzione anche della pagina principale..
    l'esecuzione dello script sopra avviene dopo la pressione di classico tasto registrati,
    i dati delle textbox passano a uno script java che controlla eventuali caratteri errari.
    se tutto ok esegue il post form e procede a scrivere nel db.
    dimmi se non sono stato chiaro

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    A questo punto dovresti riprendere lo script originale ed andare passo per passo. Fai la prima modifica e guardi se funziona; cioè che l'insert si fa (senza i due nuovi campi). Poi fai la seconda modifica aggiungendo nell'insert i nuovi campi. Cosi saprai da dove proviene il problema.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Grazie per il consiglio,
    sono ripartito dal codice originale di tutti gli script usati. effettivamente ho trovato degli errori come apici e doppie apici e virgole mancanti nel form di immissione dati.
    ora sono arrivato al punto che.. inserisco tutti i dati, per lui la quesy è andata a buon fine e mi rimanda alla pagina di avvenuta registrazione ma nel db non ha scritto proprio nulla..

  8. #8
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Secondo me devi aggiungere due esse a ssss.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  9. #9
    Esattamente quello che ho fatto stanotte alle 3.30 dopo un milione di tentativi...
    lo avrei scritto stamattina
    il mumero.di s deve essere uguale al numero di campi da scrivere.
    grazie per l'aiuto
    per gli admin potete chiudere

  10. #10
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Diciamo qualcosina, va.
    Quelli sono statement preparati per mysqli i quali, come immagino avrai imparato, devono corrispondere esattamente al numero di ? che metti nella query.
    Puoi specificare anche il tipo (essenzialmente s per stringhe e i per interi, più altri meno interessanti).

    Tuttavia, personalmente, ti consiglierei di usare PDO invece di mysqli, per il semplice motivo che è possibile nominare i parametri
    Grosso modo così

    codice:
        try 
            {
                $conn = new PDO(DB_DSN,DB_USER,DB_PASSWORD);
            } 
            
            catch (PDOException $e) 
            {
                echo "Fallimento per l'handle " . $e->getMessage() . "\n";
                exit;
            }
            
            try
            {
                $statement = $conn->prepare("INSERT INTO qualcosa
                    (id,tipo,estensione,path,nome,sizevera,data,ora,size,datafile,orafile,idwan,hash,idlink,chiave)   
                    VALUES 
                    (:id,:tipo,:estensione,:path,:nome,:sizevera,now(),now(),:size,:datafile,:orafile,:idwan,:hash,:idlink,conv(left(sha1(uuid()),13),16,10))");
            }
            catch (PDOException $e) 
            {
                exit;
            }
            
        
        
            $tipo='BOOOOH';
            $estensione=strtoupper(pathinfo($targetFile, PATHINFO_EXTENSION));
            
            $path=$targetFile;
            $path=pathinfo($targetFile, PATHINFO_DIRNAME);
            $path=str_replace('/','\\',$path);
            $path=$path.'\\';
            
            
            $nome=pathinfo($targetFile, PATHINFO_BASENAME);
            $sizevera=filesize($targetFile);
            $size=$sizevera / 1000;
            @$datafile=date('Y-m-d',filectime($targetFile));
            @$orafile=date('H:i:s',filectime($targetFile));
            $hash=strtoupper(sha1_file($targetFile));
            $idlink=sprintf('BOOOH_%03d_%d', $idwan,$id);
        
            $statement->bindParam(':id', $id);
            $statement->bindParam(':tipo', $tipo);
            $statement->bindParam(':estensione', $estensione);
            $statement->bindParam(':path', $path);
            $statement->bindParam(':nome', $nome);
            $statement->bindParam(':sizevera', $sizevera);
            $statement->bindParam(':size', $size);
            $statement->bindParam(':datafile', $datafile);
            $statement->bindParam(':orafile', $orafile);
            $statement->bindParam(':idwan', $idwan);
            $statement->bindParam(':hash', $hash);
            $statement->bindParam(':idlink', $idlink);
        
        
            try
            {
                $statement->execute();
        }
            catch (PDOException $e) 
            {
                exit;
            }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.