Visualizzazione risultati 1 fino 11 di 11

Discussione: Malfunzionamento AUTO_INCREMENT

  1. #1
    talmonefabriano non è connesso Utente AlterBlog
    Data registrazione
    14-09-2019
    Messaggi
    16

    Predefinito Malfunzionamento AUTO_INCREMENT

    Buona sera, ho una problema con l'inserimento dati in una tabella: non riesco a capire il motivo per cui non funziona l'auto incremento sull'indice primario. Pensavo fosse un problema di script PHP, ma anche forzando manualmente il valore sulla casella AUTO_INCREMENT della scheda OPERAZIONI di phpMyadmin non funziona. Vi è mai successa una cosa del genere? Da cosa può dipendere?

    Grazie anticipato a tutti per l'eventuale collaborazione

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,543

    Predefinito

    Puoi incrementare (+1) solo dal valore più alto memorizzato nella tua tabella.
    Usi codice obsoleto (non significa necessariamente script che risiede da anni ma più probabilmente una volta era possibile mentre ora no) o la sintassi non è ciò che prevede mysql.
    Ultima modifica di darbula : 17-10-2021 alle ore 17.28.30

  3. #3
    talmonefabriano non è connesso Utente AlterBlog
    Data registrazione
    14-09-2019
    Messaggi
    16

    Predefinito

    Grazie per la sollecitudine nel rispondere, riguardo il codice obsoleto non saprei che dire, ho uploadato tutto (codice e tabelle del database) tre giorni fa: in locale su xampp funzionava tutto per benino. Boh

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,543

    Predefinito

    Puoi condividere la sintassi? Così ti dico cosa non va poiché non penso se ti cito il manuale mysql riesci a capire.

  5. #5
    talmonefabriano non è connesso Utente AlterBlog
    Data registrazione
    14-09-2019
    Messaggi
    16

    Predefinito

    Di seguito il codice PHP: non è farina del mio sacco, la struttura delle classi l'ho trovata già bell'è fatta, io l'ho solo adattata alle mie esigenze. Il primo script è il file register.php per la registrazione degli utenti: se l'utente non esiste viene creato nella tabella USER, se invece esiste viene solo aggiornato. Il problema in inserimento si presenta con il metodo register

    Codice PHP:
    <?php

    $nome 
    '';
    $cognome '';
    $email '';
    $password '';
    $confirm_password '';
    $street '';
    $city '';
    $cap '';
    $prov '';

    if (isset(
    $_POST['register'])) {
      
      global 
    $alertMsg;
      
    $errors false;

      
    $nome esc($_POST['nome']);
      
    $cognome esc($_POST['cognome']);
      
    $email esc($_POST['email']);
       
      
    $password stringa_random(8);
      
    $pw $password;
      
    $password hash("sha512"$password);


      
    $street esc($_POST['street']);
      
    $city esc($_POST['city']);
      
    $cap esc($_POST['cap']);
      
    $prov esc($_POST['prov']);

      if (
    $nome != '' AND $cognome != '' AND $email != '' AND $street != '' AND $city != '' AND $cap != '' ) {
        
    $userMgr = new UserManager();
        
        if(!
    $errors AND !$userMgr->isValidEmail($email)) {      
          
    $alertMsg 'Indirizzo mail non valido';
          
    $errors true;
        }     
        

        if(!
    $errors AND $userMgr->userExists($email)){
          
    $password stringa_random(8);
          
    $pw $password;

          
    $password hash("sha512"$password);
          
    $chiave = ['email' => $email];  
          
    $dettaglio = ['first_name'  => $nome
                        
    'last_name'   => $cognome
                        
    'password'    => $password];
          
    $tabella = new DatabaseTable($pdo'user'$chiave);
          
    $tabella->UpdateTable($chiave$dettaglio);

          
    $chiave = ['email' => $email];  
          
    $tabella = new DatabaseTable($pdo'user'$chiave);
          
    $utenti $tabella->SelectByKey($chiave);
          foreach(
    $utenti as $row):
            
    $id_user $row['id'];
          endforeach;

          
    $chiave = ['user_id' => $id_user];  
          
    $dettaglio = ['street'      => $street
                        
    'city'        => $city
                        
    'cap'         => $cap,
                        
    'prov'        => $prov];
          
    $tabella = new DatabaseTable($pdo'address'$chiave);
          
    $tabella->UpdateTable($chiave$dettaglio);
          
    $pw hash("sha512"$pw);
          
    $userObj $userMgr->login2($email);
          if (
    $userObj) {
            
    $_SESSION['user'] = serialize($userObj);
            if (isset(
    $_SESSION['client_id'])) {
              
    $chiave = ['client_id' => $_SESSION['client_id']];  
              
    $dettaglio = ['user_id' => $id_user];
              
    $tabella = new DatabaseTable($pdo'cart'$chiave);
              
    $tabella->UpdateTable($chiave$dettaglio);

              
    DeleteOldCart($pdo$id_user);
            }
            echo 
    "<script>location.href='".ROOT_URL."shop?page=cart';</script>";
            exit;
          } else {
            global 
    $alertMsg;
            
    $alertMsg 'login_err';
          }
        }else{
          if (!
    $errors ) {
            
    $userId $userMgr->register($nome$cognome$email$password);        
            if (
    $userId 0){
              
    $userMgr->createAddress($userId$street$city$cap$prov);          
               
    $userObj $userMgr->login($email$password);
               if (
    $userObj) {
                
    $_SESSION['user'] = serialize($userObj);
                if (isset(
    $_SESSION['client_id'])) {
                  
    $cartMgr = new CartManager();
                  
    $cartMgr->mergeCarts();
                }
                echo 
    "<script>location.href='".ROOT_URL."shop?page=cart';</script>";
                exit;
              } else {
                global 
    $alertMsg;
                
    $alertMsg 'login_err';
              }
            } else {
              
    $alertMsg 'Errore in fase di inserimento dati di spedizione - Contattare il Negozio';
              
    creaAvviso($alertMsg);
              
    ?>
              <h5 class="bg-warning text-center text-white"><?php mostraAvviso();  ?></h5>
              <?php
            
    }     
          }
        }
      }else{
        
    $alertMsg 'Compilare i campi obbligatori';
        
    creaAvviso($alertMsg);
        
    ?>
          <h5 class="bg-warning text-center text-white"><?php mostraAvviso();  ?></h5>
        <?php
      
    }
    }
    ?>

  6. #6
    talmonefabriano non è connesso Utente AlterBlog
    Data registrazione
    14-09-2019
    Messaggi
    16

    Predefinito

    Qui di seguito lo script della classe: quando viene eseguito il metodo register viene richiamata la funzione privata _createUser che crea (dovrebbe creare) il nuovo ID della tabella. Ho provato a mettere uno break-point e ho visto che il valore di ritorno è sempre -1.
    Comunque vada, grazie per la collaborazione

    Codice PHP:
    <?php

      
    class User {

        public 
    $id;
        public 
    $first_name;
        public 
    $last_name;
        public 
    $email;
        public 
    $user_type;
        public 
    $profile_id;

        public function 
    __construct($id$first_name$last_name$email$user_type$profile_id NULL) {
          
    $this->id = (int)$id;
          
    $this->first_name $first_name;
          
    $this->last_name $last_name;
          
    $this->email $email;
          
    $this->user_type $user_type;
          
    $this->profile_id $profile_id;
        }

        public static function 
    generatePassword(){
          return 
    "password";
        }
      }
      
      class 
    UserManager extends DBManager {
        
        public function 
    __construct(){
          
    parent::__construct();
          
    $this->tableName 'user';
          
    $this->columns = array('id''email''first_name''last_name''user_type''profile_id');
        }

        public function 
    guidExists($guid) {
          
    $result $this->db->query("
            SELECT id AS userId
            FROM user
            WHERE reset_link = '
    $guid';
          "
    );
          if (
    $result){
            return 
    $result[0]['userId'];
          }
          return 
    false;
        }

        public function 
    invalidateGuid($guid){
          
    $this->db->query("
            UPDATE user
            SET reset_link = NULL
            WHERE reset_link = '
    $guid';
          "
    );
        }

        public function 
    createResetLink($userId){
          
    $guid Utilities::guidv4();
          
    $this->db->query("
            UPDATE user
            SET reset_link = '
    $guid'
            WHERE id = '
    $userId';
          "
    );
          return 
    ROOT_URL "auth?page=reset-password&guid=$guid";
        }
        
        public function 
    register($first_name$last_name$email$password){
          
    $user = new User(0$first_name$last_name$email'regular');
          
    $userId $this->_createUser($user$password);
          return 
    $userId;
        }    

        public function 
    registerNew($pdo$first_name$last_name$email$password){
          
    $chiave = array();
          
    $record = ['first_name' => $first_name,
                     
    'last_name'  => $last_name,
                     
    'email'      => $email,
                     
    'password'   => $password,
                     
    'user_type'  => 'regular'];
          
    $tabella = new DatabaseTable($pdo'user'$chiave);
          
    $tabella->InsertTable($record);

          
    // RECUPERO L'ID DELL'ULTIMO USER INSERITO
          
    $chiave = array();
          
    $id_user 'id';
          
    $tabella = new DatabaseTable($pdo'user'$chiave);
          
    $lastrecord $tabella->LastRecord($id_user);
          foreach(
    $lastrecord as $row):
            
    $userId $row;
          endforeach;
          return 
    $userId;
        }    

        public function 
    login($email$password) {

          
    $user $this->_getUserByEmail($email);
          if (!
    $user){
            return 
    false;
          }
          
    $existingHashFromDb $this->_getPassword($user['id']);
          
    $isPasswordCorrect password_verify($password$existingHashFromDb);

          if (
    $isPasswordCorrect) {
            return new 
    User($user['id'], $user['first_name'], $user['last_name'], $user['email'], $user['user_type'], $user['profile_id']);
          } else {
            return 
    false;
          }
        }

        public function 
    loginNew($email$password) {
          
    $user $this->_getUserByEmail($email);
          if (!
    $user){
            return 
    false;
          }
          
    //$existingHashFromDb = $this->_getPassword($user['id']);
          //$isPasswordCorrect = password_verify($password, $existingHashFromDb);

          
    return new User($user['id'], $user['first_name'], $user['last_name'], $user['email'], $user['user_type'], $user['profile_id']);


          
    // if ($isPasswordCorrect) {
          //   return new User($user['id'], $user['first_name'], $user['last_name'], $user['email'], $user['user_type'], $user['profile_id']);
          // } else {
          //   return false;
          // }
        
    }


        public function 
    login2($email) {
          
    $user $this->_getUserByEmail($email);
          return new 
    User($user['id'], $user['first_name'], $user['last_name'], $user['email'], $user['user_type'], $user['profile_id']);
        }
        
        public function 
    isValidPassword($pwd){
          return 
    strlen($pwd) > 6;
        }
        
        public function 
    isValidEmail($email){
          return 
    filter_var($emailFILTER_VALIDATE_EMAIL);
        }
        
        public function 
    passwordsMatch($pwd1$pwd2){
          return 
    $pwd1 == $pwd2;
        }
        
        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 
    updatePassword($userId$password){
          
    $pwd $password $password User::generatePassword();
          
    $pwd password_hash($pwdPASSWORD_DEFAULT);
          
    $query "UPDATE $this->tableName SET password = '$pwd' where id = $userId";
          
    //var_dump($query); die;
          
    $this->db->query($query);
        }

        public function 
    createAddress($userId$street$city$cap$prov){
          
    $query "SELECT count(1) as has_address FROM address WHERE user_id = $userId"
          
    //var_dump($query); die;
          
    $result $this->db->query($query);
          
          if (
    $result[0]['has_address'] > 0) {
            
    $this->db->query("UPDATE address SET street = '$street', city = '$city', cap = '$cap' WHERE user_id = $userId");
          } else {
            
    $this->db->query("INSERT INTO address (user_id, street, city, cap, prov) VALUES ($userId, '$street', '$city', '$cap', '$prov' )");
          }
        }
        
        public function 
    getAddress($userId){
          
    $result $this->db->query("SELECT street, city, cap, prov  FROM address WHERE user_id = $userId");
          if(
    count($result) > 0){
            return 
    $result[0];
          }
        }

        public function 
    getUserByEmail($email){
          return 
    $this->_getUserByEmail($email);
        }

        public function 
    createUser($user$password){
          return 
    $this->_createUser($user$password);
        }

        
    /*
          Private Methods
        */

        
    private function _createUser($user$password){
          
    $id parent::create($user);
          
    $this->updatePassword($id$password);
          return 
    $id;
        }

        private function 
    _getPassword($userId) {
          
    $result =  $this->db->query("SELECT password FROM user WHERE id = $userId;");
          if (
    $result){
            return 
    $result[0]['password'];
          }
          return 
    null;
        }

        private function 
    _getUserByEmail($email){
          
    $email esc($email);      
          
    $query "SELECT id, email, first_name, last_name, user_type, profile_id FROM " $this->tableName " WHERE email = '$email';";
          
    $user $this->db->query($query);
          if (
    count($user) == 0) {
            return 
    null;
          }
          return 
    $user[0];
        }

        
    //private function _getUserById($id){
        
    public function getUserById($id){
          
    $id esc($id);      
          
    $query "SELECT id, email, first_name, last_name, user_type, profile_id FROM " $this->tableName " WHERE id = '$id';";
          
    $user $this->db->query($query);
          if (
    count($user) == 0) {
            return 
    null;
          }
          return 
    $user[0];
        }



      }

  7. #7
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,543

    Predefinito

    Non puoi usare l'intero 0 ma l'ultimo +1 id della tua tabella per le nuove registrazioni.
    Codice PHP:
    public function register($first_name$last_name$email$password){
          
    $user = new User(0$first_name$last_name$email'regular');
          
    $userId $this->_createUser($user$password);
          return 
    $userId;
        } 
    Codice obsoleto non è consentito da mysql.

  8. #8
    talmonefabriano non è connesso Utente AlterBlog
    Data registrazione
    14-09-2019
    Messaggi
    16

    Predefinito

    OK grazie, domani lo provo, poi ti aggiorno.

    Buona serata

  9. #9
    talmonefabriano non è connesso Utente AlterBlog
    Data registrazione
    14-09-2019
    Messaggi
    16

    Predefinito

    Buongiorno, niente da fare, non funziona. Ho creato un nuovo metodo (register2) in cui mi vado a prendere l'ultimo ID della tabella USER, sommo 1 e il valore lo passo come parametro alla funzione privata _createUser, ma il valore di ritorno è sempre -1.
    Ci sono due cose strane:
    1) in locale su XAMPP funziona (sia la versione vecchia che quella nuova)
    2) come dicevo ieri, se vado nella scheda OPERAZIONI di phpmyAdmin di XAMPP e incremento (o decremento) il valore nella relativa casella, il valore viene modificato, se invece faccio la stessa cosa su phpmAdmin del sito il valore non viene modificato.
    Di seguito il codice PHP dei metodi register2 e LastRecord per recuperere l'ultimo ID inserito.


    Codice PHP:
     public function register2($pdo$first_name$last_name$email$password){
          
    // RECUPERO L'ID DELL'ULTIMO USER INSERITO
          
    $chiave = array();
          
    $id_user 'id';
          
    $tabella = new DatabaseTable($pdo'user'$chiave);
          
    $lastrecord $tabella->LastRecord($id_user);
          foreach(
    $lastrecord as $row):
            
    $lastId $row;
          endforeach;
          
    //echo "ULTIMO ID::::::".$lastId.'<br>'; 
          
    $lastId++;
          
    //echo "ID DA CREARE::::::".$lastId.'<br>'; 
          
    $user = new User($lastId$first_name$last_name$email'regular');
          
    $userId $this->_createUser($user$password);
          
    //echo "CREATO ID::::::".$userId; die;
          
    return $userId;
        } 
    Codice PHP:
        public function LastRecord($campo){
            
    $query 'SELECT `' $campo .'`' ' FROM `' $this->tabella '`' ' ORDER BY `' $campo '`' ' DESC LIMIT 1';
            
    $query $this->query($query);
            
    $row $query->fetchAll();
            return 
    $row[0];
        } 

  10. #10
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,543

    Predefinito

    Lei non sta effettuando direttamente SQL ma usa "il tramite (phpMyAdmin)", mysql per AUTO_INCREMENT possiede molteplice regole.
    Ecco lo standard SQL
    Codice:
    CREATE TABLE IF NOT EXISTS animals (
         id MEDIUMINT NOT NULL AUTO_INCREMENT,
         name CHAR(30) NOT NULL,
         PRIMARY KEY (id)
    );
    
    INSERT INTO animals (name) VALUES
        ('dog'),('cat'),('penguin'),
        ('lax'),('whale'),('ostrich');
    
    SELECT LAST_INSERT_ID();
    in questo caso la prima esecuzione ritorna 1 (effettivamente però sono 6 valori e quindi almeno con id max 6).
    Penso che il codice che sta usando fù adatto nel 2011 ma adesso con versioni mysql aggiornate potrebbe cambiare qualcosa.
    Su mysql 5.6 puoi solamente creare l'ultimo +1 altrimenti verrà ignorato direttamente da mysql :)
    Se il suo id non raggiunge il punto massimo (o addirittura è senza segno) il -1 significa errore SQL. utilizza
    Codice PHP:
    <?php
    error_reporting
    (-1);
    Non è un malfunzionamento ma codice obsoleto della sua classe.
    Qui spiega quando è possibile usare 0 e altro https://dev.mysql.com/doc/refman/8.0...increment.html (comunque il nuovo id dovrà essere uguale o superiore a max id + 1).
    Ultima modifica di darbula : 22-10-2021 alle ore 02.53.58

  11. #11
    talmonefabriano non è connesso Utente AlterBlog
    Data registrazione
    14-09-2019
    Messaggi
    16

    Predefinito

    Salve, se ho capito, non dovrei usare la function LastRecord($campo); ma SELECT LAST_INSERT_ID(); per determinare l'ultimo ID?
    Domanda da ignorante: come lavora questa function SELECT LAST_INSERT_ID()? Cioè, come faccio a dire al programma la tabella dalla quale voglio estrarre l'ultimo id?
    Grazie

Regole di scrittura

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