Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503

    Funziona tutto fino a 2, con 3 non va

    Bel titolo criptico eh?! Ma non sapevo che scriverci.

    Sto usando CodeIgniter per un sito.
    Nel DB ho una tabella con una colonna chiamata "banner" definita come
    int not null default 0

    Questa colonna va aggiornata man mano che si eseguono delle operazioni, questo è il codice che esegue l'update.
    Codice PHP:
    $set = array('banner' => $row['banner']+1); //$row['banner'] contiene il vecchio valore del campo banner
    $this->db->where('id',$row['id']);
    $this->db->update($table,$set);
    if ( 
    $this->db->affected_rows() == 1)
    {
        
    $inserzione['active_banner']--;
    }
    else 
    //update non eseguito
    {
        
    $this->db->trans_rollback();
        return 
    FALSE;

    Il problema è che finché $row['banner']+1 vale 1 o 2 il tutto funziona, quando vale 3 invece
    $this->db->affected_rows() vale 1 (ho provato a stamparlo), ma viene eseguito comunque il ramo else, come se invece non fosse 1.
    Ho provato a stampare l'sql generato per l'update ed è corretto, usandolo direttamente su phpmyadmin non da problemi, ma neanche dal sito dato che il valore di affected_rows è 1.

    Non riesco a capire perché si vada a finire nell'else.

    Qualche consiglio?

  2. #2

    Re: Funziona tutto fino a 2, con 3 non va

    Originariamente inviato da Alhazred
    $inserzione['active_banner']--;
    A che servono quei 2 trattini?

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453

    Re: Re: Funziona tutto fino a 2, con 3 non va

    Originariamente inviato da cris.calleo
    A che servono quei 2 trattini?
    Diminuiscono di 1 il valore numerico della variabile, il contrario di ++ per intenderci



    Comunque

    quando vale 3 invece
    $this->db->affected_rows() vale 1 (ho provato a stamparlo), ma viene eseguito comunque il ramo else, come se invece non fosse 1.
    Non la racconti giusta perché è teoricamente impossibile

  4. #4
    Ro Team,
    Secondo me é proprio quello.

    Se il valore é 2, ma lo decrementi con "--" ritorna 1:

    if ( $this->db->affected_rows() == 1)

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Originariamente inviato da cris.calleo
    Ro Team,
    Secondo me é proprio quello.

    Se il valore é 2, ma lo decrementi con "--" ritorna 1:

    if ( $this->db->affected_rows() == 1)
    Non ho capito il senso di questa frase , il valore viene decrementato quando la condizione
    è gia avvenuta, e poi come ha già detto il risultato è sempre 1 solo che non entra nell'if

  6. #6
    hai ragione

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503

    Re: Re: Re: Funziona tutto fino a 2, con 3 non va

    Originariamente inviato da RoTeam
    ...
    Non la racconti giusta perché è teoricamente impossibile
    Dal codice ho solo tolto uno switch che seglie su quale tabella intervenire, in pratica valorizza la variabile $table.

    Stampando query e valore di affected_rows in questo modo
    Codice PHP:
    echo $this->db->last_query()."
    "
    .$this->db->affected_rows(); 
    otengo:
    UPDATE `prodotti` SET `banner` = 3 WHERE `id` = '1-1344638814-2'
    1

    ma poi viene eseguito l'else.

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Ok, un passo avanti.
    Non bloccando l'esecuzione del codice dopo la stampa della query mi sono accorto di cosa succede.

    Il codice postato si trova dentro un while e si svolge in una transazione, ci metto anche quello
    Codice PHP:
    $this->db->trans_begin();
    while(
    $inserzione['active_banner'] > 0)
    {
        
    //selezione della tabella e riga su cui fare l'update che si conclude con
        
    $row $result->row_array(); //carica i dati della entry selezionata

        
    $set = array('banner' => $row['banner']+1); //$row['banner'] contiene il vecchio valore del campo banner
        
    $this->db->where('id',$row['id']);
        
    $this->db->update($table,$set);
        if ( 
    $this->db->affected_rows() == 1)
        {
            
    $inserzione['active_banner']--;
        }
        else 
    //update non eseguito
        
    {
            
    $this->db->trans_rollback();
            return 
    FALSE;
        }
    }
    if (
    $this->db->trans_status() !== FALSE)
    {
        
    $this->db->commit();
        return 
    TRUE;
    }
    else
    {
        
    $this->db->rollback();
        return 
    FALSE;

    il problema si presenta quando il cilco viene eseguito più di una volta e al secondo giro si seleziona di nuovo la stessa entry del primo ciclo.
    in tutti e 2 i cicli la query risulta
    UPDATE `prodotti` SET `banner` = 3 WHERE `id` = '1-1344638814-2'

    quindi la prima volta affected_rows() è 1, al secondo giro 0 perché il valore è già 3.

    In teoria dovrebbe succedere che:
    una entry viene presa e aggiornata, diciamo che da 2 passa a 3
    al secondo giro viene presa di nuovo la stessa entry, ma essendo in una transazione viene preso di nuovo il valore effettivamente salvato, ovvero 2 e non 3, quindi il +1 lo riporta a 3, ma l'update a 3 è già stato fatto.

    Mi sa che devo cambiare la logica degli update.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.