Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problema php/mySql su count record

    Salve ragazzi, ho un problema quasi inspegabile con una semplice operazione di conteggio record e insert/update in base al risultato.

    Mi spiego commentando il codice che posto per essere più chiaro possibile nella speranza che qualcuno possa illuminarmi ed evitare di cambiare il sistema.

    Codice PHP:
    //Questo è commentato ho sostituito con la query successiva
    //$querySql_stats = "SELECT * FROM banner_stats WHERE id_banner = ".$id_banner."";
            //$result_stats = $dbConn->query($querySql_stats);
            //$rows_count_result = $dbConn->num_rows;
            
    //Qui faccio una query che conta i record in base ad un id_banner per verificare se già esiste il record nella tabella
    $querySql_stats "SELECT COUNT(id) FROM banner_stats WHERE id_banner = ".$id_banner."";
            
    $result_stats $dbConn->query($querySql_stats);
            
    $row_stats $result_stats->fetch_row();
            
    $row_cnt $row_stats[0];
            
    $rows_count_result $row_cnt;
            
            
    //echo "
    querySql_stats:".$querySql_stats;
            //echo "
    row_stats:".$row_stats;
            //echo "
    rows_count_result:".$rows_count_result;

    //Se il record già esiste faccio una update per conteggiare le impression, altrimenti procedo a fare insert.        
    if (
    $rows_count_result == 1) {
                while ((
    $row_data_stats = $result_stats->fetch_assoc()) !== NULL) {
                    
    $impression = $row_data_stats['impression'];
                    
    $count_impression = $impression + 1;
                    
                    
    $querySql_stats = "UPDATE banner_stats SET impression ".$count_impression." WHERE id_banner ".$id_banner."";
                    //
    $result = $dbConn->query($querySql_stats);
                };
            } elseif (
    $rows_count_result == 0) {
                if (
    $id_banner > 0) { 
                    
    $querySql_stats = "INSERT INTO banner_stats (id_banner,impression,click,dataVALUES ";
                    
    $querySql_stats .= "(".$id_banner.",1,0,".$serialDate.")";
                    //
    $result = $dbConn->query($querySql_stats);
                };    
            } else {
                
    $querySql_stats = "INSERT INTO banner_stats (id_banner,impression,click,dataVALUES ";
                
    $querySql_stats .= "(".$id_banner.",0,0,".$rows_count_result.")";
                //
    $result = $dbConn->query($querySql_stats);
            }; 
    Ebbene purtroppo anche se il record già esiste in tabella, a volte inspegabilmente entra nella insert e mi trovo record duplicati con lo stesso id_banner come di seguito riporto.

    id / id_banner / impression / click / data
    78 100 1 0 1309600162
    110 100 1 0 1309600181
    121 100 1 0 1309600182

    Escludendo un problema di concomitanza, infatti le date sono diverse. Cosa potrebbe essere ? Suggerimenti ? Grazie in anticipo....

  2. #2
    tu gli stai dicendo:

    - se è presente UN SOLO RECORD, fai l'update

    - se NON E' PRESENTE record, fai un insert

    - se SONO PRESENTI PIU' RECORD, fai una insert

    già questa sequenza di if ha poco senso, più che altro nel secondo else... se vuoi un solo record, bastano solo le prime due condizioni.. probabilmente ti duplica i record perchè magari una versione precedente dello script, per errore, ha inserito più di un record per il banner e quindi entra nel secondo else
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Magari il problema fosse quello.
    la terza condizione l'ho messa dopo per capire cosa succede in casi diversi da 1 o 0.
    Infatto a parte che è commentata poi vedi $querySql_stats .= "(".$id_banner.",0,0,".$rows_count_result.")";

    come impression ho messo 0 per riconoscerla e come data ho messo il valore della
    $rows_count_result.

    Il problema è che a volte entra proprio nella condizione
    elseif ($rows_count_result == 0) anche se in realtà ci sono dei record.

    Basta guardare i risultati.
    La tabella l'ho ripulita più volte, azzerata. Ma poi quando raccolgo i dati fa sempre la stessa cosa.

  4. #4
    controlla bene i risultati della query del count, anche perchè per come l'hai postata non dovrebbe funzionare essendoci alla fine due doppi apici. Fatti stampare la query e il row_count per assicurarti che i risultati siano corretti (testa le query direttamente in mysql se necessario). Cambia l'if in

    Codice PHP:

    if($rows_count_result){
    //faccio l'insert
    }else{
    //faccio l'update

    e magari controlla che $id_banner sia > 0 PRIMA di fare tutto il casino del count, non dentro l'else, ti eviti la query perchè sicuramente il select count(id) con id_banner = 0 ti darà sempre 0, se poi l'insert non devi farlo perchè id_banner = 0, a che serve fare la query? niente...
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    controlla bene i risultati della query del count, anche perchè per come l'hai postata non dovrebbe funzionare essendoci alla fine due doppi apici
    Funziona...senza apici o doppi apici provato già.

    Fatti stampare la query e il row_count per assicurarti che i risultati siano corretti (testa le query direttamente in mysql se necessario)
    Fatto già, mi faccio stampare e faccio anche inserire nel DB il valore del count proprio in quel else aggiuntivo ma adesso ho provato anche nel primo else e funziona.

    Provo a cambiare if come suggerito e faccio controllo su id_banner > 0 prima di tutto.
    Non avevo ancora ottimizzato perchè mi sto concentrando su questo inspegabile problema.

    Provo e posto. Ti ringrazio comunque già da adesso. Spero di risolvere.

  6. #6
    ma scusa

    codice:
    "SELECT COUNT(id) FROM banner_stats WHERE id_banner = ".$id_banner."";
    non ti da errore di compilazione php per via del doppio apice alla fine?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Originariamente inviato da Santino83_02
    ma scusa

    codice:
    "SELECT COUNT(id) FROM banner_stats WHERE id_banner = ".$id_banner."";
    non ti da errore di compilazione php per via del doppio apice alla fine?
    Non dovrebbe, e' solo un'inutile concatenazione di stringa vuota.

  8. #8
    Originariamente inviato da k.b
    Non dovrebbe, e' solo un'inutile concatenazione di stringa vuota.
    oddio che idiota scusate... 4 caffè stamattina non sono bastati
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  9. #9
    Figurati succede quando si ha la testa sempre nel codice.
    Comunque a parte tutti i consigli....il problema è sicuramente altrove e non nel codice postato. Commentato tutte le insert e svuotando la tabella...mi trovo dei record aggiunti.
    Si vede che da qualche altra parte c'è qualche query che scrive bypassando il controllo dei record e mi duplica le righe.
    Cerco di individuare....grazie

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.