Visualizzazione risultati 1 fino 11 di 11

Discussione: Malfunzionamento AUTO_INCREMENT

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

    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,894

    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 16.28.30

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

    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,894

    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
    19

    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
    19

    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($email, FILTER_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($pwd, PASSWORD_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,894

    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
    19

    Predefinito

    OK grazie, domani lo provo, poi ti aggiorno.

    Buona serata

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

    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,894

    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 01.53.58

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

    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
  •