Visualizzazione risultati 1 fino 10 di 10

Discussione: registrazione utente

  1. #1
    ik0yuo non è connesso Neofita
    Data registrazione
    17-10-2021
    Messaggi
    27

    Predefinito registrazione utente

    Salve chiedo scusa se chiedo di nuovo a voi per risolvere un'altro problema, ringrazio in anticipo.
    premetto che in locale la registrazione utente va a buon fine con successo ma quando carico i file nella cartella sul mio sito mi da errore, l'errore è questo


    Fatal error: Uncaught mysqli_sql_exception: Field 'password' doesn't have a default value in /membri/ilportalino/classes/DB.php:126 Stack trace: #0 /membri/ilportalino/classes/DB.php(126): mysqli_query(Object(mysqli), 'INSERT INTO use...') #1 /membri/ilportalino/classes/DB.php(162): DB->insert_one('user', Array) #2 /membri/ilportalino/classes/User.php(40): DBManager->create(Object(User)) #3 /membri/ilportalino/classes/User.php(78): UserManager->createUser(Object(User), 'Aa54321.') #4 /membri/ilportalino/auth/page/register.php(45): UserManager->register('KL0S', 'kl0s@arrl.net', 'Aa54321.') #5 /membri/ilportalino/auth/index.php(11): include('/membri/ilporta...') #6 {main} thrown in /membri/ilportalino/classes/DB.php on line 126

    questo è il file DB.php

    Codice PHP:

    <?php

    class DB {

    private
    $conn;
    public
    $pdo;

    public function
    __construct() {

    global
    $conn;
    $this->conn = $conn;
    if (
    mysqli_connect_errno()) {
    echo
    'Failed to connect to MySql ' . mysqli_connect_errno();
    }
    $this->pdo = new PDO('mysql:dbname='. DB_NAME .';host=' . DB_HOST, DB_USER, DB_PASS);
    }

    public function
    query($sql) {
    $q = $this->pdo->query($sql);
    if(!
    $q)
    {
    die(
    "Execute query error, because: ". print_r($this->pdo->errorInfo(),true) );
    }

    $data = $q->fetchAll();
    return
    $data;
    }

    public function
    select_all($tableName, $columns = array()) {

    $query = 'SELECT ';

    $strCol = '';
    //var_dump($columns); die;
    foreach($columns as $colName) {
    $strCol .= ' '. esc($colName) . ',';
    }
    $strCol = substr($strCol, 0, -1);

    $query .= $strCol . ' FROM ' . $tableName;

    $result = mysqli_query($this->conn, $query);
    $resultArray = mysqli_fetch_all($result, MYSQLI_ASSOC);

    mysqli_free_result($result);

    return
    $resultArray;
    }

    public function
    select_one($tableName, $columns = array(), $id) {

    $strCol = '';
    foreach(
    $columns as $colName) {
    $colName = esc($colName);
    $strCol .= ' ' . $colName . ',';
    }
    $strCol = substr($strCol, 0, -1);
    $id = esc($id);
    $query = "SELECT $strCol FROM $tableName WHERE id = $id";

    $result = mysqli_query($this->conn, $query);
    $resultArray = mysqli_fetch_assoc($result);

    mysqli_free_result($result);

    return
    $resultArray;
    }

    public function
    delete_one($tableName, $id) {

    $id = esc($id);
    $query = "DELETE FROM $tableName WHERE id = $id";

    if (
    mysqli_query($this->conn, $query)) {
    $rowsAffected = mysqli_affected_rows($this->conn);

    return
    $rowsAffected;
    } else {

    return -
    1;
    }
    }

    public function
    update_one($tableName, $columns = array(), $id) {

    $id = esc($id);
    $strCol = '';
    foreach(
    $columns as $colName => $colValue) {
    $colName = esc($colName);
    $strCol .= " " . $colName . " = '$colValue' ,";
    }
    $strCol = substr($strCol, 0, -1);

    $query = "UPDATE $tableName SET $strCol WHERE id = $id";

    if (
    mysqli_query($this->conn, $query)) {
    $rowsAffected = mysqli_affected_rows($this->conn);

    return
    $rowsAffected;
    } else {

    return -
    1;
    }
    }

    public function
    insert_one ($tableName, $columns = array()) {

    $strCol = '';
    foreach(
    $columns as $colName => $colValue) {
    $colName = esc($colName);
    $strCol .= ' ' . $colName . ',';
    }
    $strCol = substr($strCol, 0, -1);

    $strColValues = '';
    foreach(
    $columns as $colName => $colValue) {
    $colValue = esc($colValue);
    $strColValues .= " '" . $colValue . "' ,";
    }
    $strColValues = substr($strColValues, 0, -1);

    $query = "INSERT INTO $tableName ($strCol) VALUES ($strColValues)";

    //$query = "INSERT INTO `user`(nominativo, email, user_type, password) VALUES ($strColValues)";
    //var_dump($query); die;
    if (mysqli_query($this->conn, $query)) {
    $lastId = mysqli_insert_id($this->conn);

    return
    $lastId;
    } else {

    return -
    1;
    }
    }
    }

    class
    DBManager {

    protected
    $db;
    protected
    $columns;
    protected
    $tableName;

    public function
    __construct(){
    $this->db = new DB();
    }

    public function
    get($id) {
    $resultArr = $this->db->select_one($this->tableName, $this->columns, (int)$id);
    return (object)
    $resultArr;
    }

    public function
    getAll() {
    $results = $this->db->select_all($this->tableName, $this->columns);
    $objects = array();
    foreach(
    $results as $result) {
    array_push($objects, (object)$result);
    }
    return
    $objects;
    }

    public function
    create($obj) {
    $newId = $this->db->insert_one($this->tableName, (array) $obj);
    return
    $newId;
    }

    public function
    delete($id) {
    $rowsDeleted = $this->db->delete_one($this->tableName, (int)$id);
    return (int)
    $rowsDeleted;
    }

    public function
    update($obj, $id) {
    $rowsUpdated = $this->db->update_one($this->tableName, (array) $obj, (int)$id);
    return (int)
    $rowsUpdated;
    }
    }


    grazie in anticipo per il vostro aiuto

  2. #2
    ik0yuo non è connesso Neofita
    Data registrazione
    17-10-2021
    Messaggi
    27

    Predefinito

    questo è il file user.php

    Codice PHP:

    <?php

    class User {

    public
    $id;
    public
    $nominativo;
    public
    $email;
    public
    $user_type;

    public function
    __construct($id, $nominativo, $email, $user_type) {
    $this->id = (int)$id;
    $this->nominativo = $nominativo;
    $this->email = $email;
    $this->user_type = $user_type;
    }

    public static function
    generatePassword(){
    //return substr(md5(mt_rand()), 0, 20);
    return 'test123';
    }
    }

    class
    UserManager extends DBManager {

    public function
    __construct(){
    parent::__construct();
    $this->tableName = 'user';
    $this->columns = array('nominativo', 'email', 'user_type');
    }

    // public function create($user){
    // $id = parent::create($user);

    // $pwd = $password ? $password : User::generatePassword();
    // $this->db->query("UPDATE $this->tableName SET password = '$pwd' where id = $id");
    // return $id;
    // }

    public function createUser($user, $password){
    $id = parent::create($user);
    $this->updatePassword($id, $password);
    return
    $id;
    }

    public function
    updatePassword($userId, $password){
    $pwd = $password ? $password : User::generatePassword();
    $query = "UPDATE $this->tableName SET password = '$pwd' where id = $userId";
    //var_dump($query); die;
    $this->db->query($query);
    }

    public function
    isValidPassword($pwd){
    return
    strlen($pwd) > 6;
    }

    public function
    passwordsMatch($pwd1, $pwd2){
    return
    $pwd1 == $pwd2;
    }

    public function
    login($email, $password) {

    $email = esc($email);
    $password = esc($password);

    $query = "SELECT nominativo, email, user_type FROM " . $this->tableName . " WHERE email = '$email' AND password = '$password'";
    $user = $this->db->query($query);
    //var_dump( $query); die;
    if (count($user) > 0) {
    $user = $user[0];
    return new
    user($user['nominativo'], $user['email'], $user['user_type']);
    } else {
    return
    false;
    }
    }

    public function
    register($nominativo, $email, $password){
    $user = new user(0, $nominativo, $email, 'wait');
    $userId = $this->createUser($user, $password);
    return
    $userId;
    }

    public function
    userExists($email){
    $result = $this->db->query("SELECT count(id) as count FROM user WHERE email = '$email'");
    return
    $result[0]['count'] > 0;
    }

    public function
    isValidEmail($email){
    return
    filter_var($email, FILTER_VALIDATE_EMAIL);
    }
    }

    è questo è il file registre.php

    Codice PHP:
    <?php

    $nominativo
    = '';
    $email = '';
    $password = '';
    $confirm_password = '';


    if (isset(
    $_POST['register'])) {

    global
    $alertMsg;
    $errors = false;
    //var_dump($_POST); die;

    $nominativo = esc($_POST['nominativo']);;
    $email = esc($_POST['email']);
    $password = esc($_POST['password']);
    $confirm_password = esc($_POST['confirm_password']);

    if (
    $nominativo != '' AND $email != '' AND $password != '' AND $confirm_password != '' ) {

    $userMgr = new UserManager();

    if(!
    $errors AND !$userMgr->isValidEmail($email)) {
    $alertMsg = 'invalid_email';
    $errors = true;
    }

    if(!
    $errors AND !$userMgr->isValidPassword($password)) {
    $alertMsg = 'invalid_password';
    $errors = true;
    }

    if(!
    $errors AND !$userMgr->passwordsMatch($password, $confirm_password)){
    $alertMsg = 'passwords_not_match';
    $errors = true;
    }

    if(!
    $errors AND $userMgr->userExists($email)){
    $alertMsg = 'user_already_exists';
    $errors = true;
    }

    if (!
    $errors ) {
    $userId = $userMgr->register($nominativo, $email, $password);
    if (
    $userId > 0){
    echo
    "<script>location.href='".ROOT_URL."auth?page=login&msg=registered';</script>";
    exit;
    } else {
    $alertMsg = 'err';
    }
    }
    } else {
    $alertMsg = 'mandatory_fields';
    }
    }
    ?>

    <div class="card mb-3">
    <section class="section-padding gray-bg">
    <nav class="sb-topnav navbar navbar-expand bg-dark navbar-darkk" style="background-color: #7b8a8b;"></nav>
    <br>

    <h3 class="text-center">Registrazione</h3>
    <br>

    <form method="post" class="mb-4">
    <div class="form-group">
    <center><input name="nominativo" id="nominativo" style="width:400px;" placeholder="Nominativo" type="text" class="form-control" value="<?php echo esc_html($nominativo); ?>"></center>
    </div>
    <div class="form-group">
    <center><input name="email" id="email" style="width:400px;" placeholder="E-Mail" type="text" class="form-control" value="<?php echo esc_html($email); ?>"></center>
    </div>
    <div class="form-group">
    <center><input name="password" id="password" style="width:400px;" placeholder="Password" type="password" class="form-control" value="<?php echo esc_html($password); ?>"></center>
    </div>
    <div class="form-group">
    <center><input name="confirm_password" style="width:400px;" placeholder="Ripeti Password" id="confirm_password" type="password" class="form-control" value="<?php echo esc_html($confirm_password); ?>"></center>
    </div>

    <center><input class="btn btn-outline-primary" style="width:400px;" type="submit" value="registrati" name="register"></center>

    </form>
    </div>

  3. #3
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,965

    Predefinito

    Il messaggio di errore mi sembra molto esplicativo:
    Field 'password' doesn't have a default value
    Stai eseguendo una INSERT senza specificare tutti i campi che non hanno un campo "default": o specifichi anche la password, o aggiungi una password default durante la creazione delle tabelle.


    -----

    Altri suggerimenti:
    • echo "<script>location.href='".ROOT_URL."auth?page=logi n&msg=registered';</script>";
      Eviterei di fare un reidrect via javascript, sarebbe più generico un redirect html o anche direttamente modificando l'header della richiesta HTTP con header() [vedi ad esempio qui].
    • Il tag <center> non esiste più da una decina di anni, è obsoleto. Usa CSS per centrare gli elementi.
    • TUTTI gli input provenienti da fuori dello script che andranno dentro query devi controllarli. Ho visto che usi "esc()", assicurati che sia in grado di proteggerti da tutti gli attacchi sql injection.


    Ciao!
    Ultima modifica di alemoppo : 05-04-2025 alle ore 16.52.57

  4. #4
    ik0yuo non è connesso Neofita
    Data registrazione
    17-10-2021
    Messaggi
    27

    Predefinito

    Ciao alemoppo nel file DB.php la riga 123 $query = "INSERT INTO $tableName ($strCol) VALUES ($strColValues)"; ho provato a modificarla ma con nessun successo il file USER.php che ci sono tutti campi ma non so più come fare il locale va senza problemi hai suggerimenti ? grazie

  5. #5
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,965

    Predefinito

    Puoi stampare la query per vedere come è fatta? Intendo:
    Codice PHP:
    $query = "INSERT INTO $tableName ($strCol) VALUES ($strColValues)";
    echo
    $query;
    (va bene anche con var_dump($query))


    Ciao!

  6. #6
    ik0yuo non è connesso Neofita
    Data registrazione
    17-10-2021
    Messaggi
    27

    Predefinito

    allora aggiungendo echo $query; l'errore è questo



    INSERT INTO user ( id, nominativo, email, user_type) VALUES ( '0' , 'prova' , 'prova@gmail.com' , 'wait' )
    Fatal error: Uncaught mysqli_sql_exception: Field 'password' doesn't have a default value in /membri/ilportalino/classes/DB.php:127 Stack trace: #0 /membri/ilportalino/classes/DB.php(127): mysqli_query(Object(mysqli), 'INSERT INTO use...') #1 /membri/ilportalino/classes/DB.php(163): DB->insert_one('user', Array) #2 /membri/ilportalino/classes/User.php(40): DBManager->create(Object(User)) #3 /membri/ilportalino/classes/User.php(78): UserManager->createUser(Object(User), 'Prova71') #4 /membri/ilportalino/auth/page/register.php(45): UserManager->register('prova', 'prova@gmail.com', 'Prova71') #5 /membri/ilportalino/auth/index.php(11): include('/membri/ilporta...') #6 {main} thrown in /membri/ilportalino/classes/DB.php on line 127

  7. #7
    ik0yuo non è connesso Neofita
    Data registrazione
    17-10-2021
    Messaggi
    27

    Predefinito

    alemoppo allora ho fatto un tentativo ed ora va nel file User.php ho aggiunto nell'ultima riga $this->password = $password;



    class User {

    public $id;
    public $nominativo;
    public $email;
    public $user_type;

    public function __construct($id, $nominativo, $email, $user_type) {
    $this->id = (int)$id;
    $this->nominativo = $nominativo;
    $this->email = $email;
    $this->user_type = $user_type;
    Aggiunto
    $this->password = $password;
    }


    e ora va non da più errore, non so se è corretto ma l'errore nn lo da più grazie mille

  8. #8
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,965

    Predefinito

    Ok ma la variabile $password non è inizializzata! Così funziona ma ti inserisce una password vuota (?).

    Ciao!

  9. #9
    ik0yuo non è connesso Neofita
    Data registrazione
    17-10-2021
    Messaggi
    27

    Predefinito

    no inserisce tutti i dati correttamente nel database compresa la password, ho dato un'occhiata per i redirect dito
    <?php
    header('Location: http://ik0yuo.org/');
    ?>

    Ma mi da errore

  10. #10
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,965

    Predefinito

    Quale errore?

    Comunque header() modifica appunto l'header della richiesta HTTP, quindi per usarla NON occorre eseguire alcun output precedente (per intenderci, prima di usarla non devi aver usato echo o var_dump() o simili perché altrimenti si chiuderebbe la zona header della richiesta.

    Comunque è importante leggere l'errore che ricevi per capire il problema.

    Ciao!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •