Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    Codice MySQL semplice ma poco performante

    Salve a tutti, sono anni che uso XHTML, CSS e PHP ma solo da ieri MySQL...


    ho creato questo semplice script che mi aggiorna i valori di un database come risultato di un form, ma non mi soddisfa molto in quanto a performance... ho un tabella di due righe per farci i testi eppure sarà la connessione ma va abbastanza lento.. non è che ho fatto qualche errore banale ma che non riuscirei mai a trovare da solo?

    codice:
    <?php
    
     $DBhost = "XXX";
    $DBuser = "XXX";
    $DBpass = "XXXX";
    $DBName = "XXX";
    
    $connessione = mysql_connect($DBhost,$DBuser,$DBpass) or die("Impossibile collegarsi al server");
    mysql_select_db($DBName,$connessione) or die("Errore nella selezione del database");
    
    $post_autore = $_POST['ID_autore']; //hidden
    echo "ID autore che ha compilato: ".$post_autore ."
    
    ";
    
    $st=mysql_query("SELECT COUNT(*) AS totale FROM db_domande") or die(mysql_error());
    $count_domande=mysql_fetch_assoc($st);
    echo $count_domande['totale'];
    
    for ($domanda = 1; $domanda<=$count_domande['totale']; ++$domanda) { 
    
    	$id_risposta = $post_autore.'_'.$domanda;
    
    	$query = "REPLACE INTO db_risposte (id_risposta, id_autore, id_domanda, risposta, confid, nota) VALUES ('".$id_risposta."', '".	$post_autore."',  '".$domanda."', '".$_POST[$domanda.'_r']."', '".$_POST[$domanda.'_c']."', '".$_POST[$domanda.'_txt']."' )";
    	
    	echo "REPLACE INTO db_risposte (id_risposta, id_autore, id_domanda, risposta, confid, nota) VALUES ('".$id_risposta."', '".	$post_autore."',  '".$domanda."', '".$_POST[$domanda.'_r']."', '".$_POST[$domanda.'_c']."', '".$_POST[$domanda.'_txt']."' )";
    	$data_autori = mysql_query($query) or die (mysql_error());  
    
    }
    
    mysql_close($connessione);
    
    header("Location: poll.php?hash=XXX");
    
    ?>

  2. #2
    Utente bannato
    Registrato dal
    Nov 2011
    Messaggi
    150
    fai una singola update

  3. #3
    Ok grazie del suggerimento..cercherò di capire come fare

  4. #4
    Ok, ma quindi per fare una singola query da

    Codice PHP:
    $st=mysql_query("SELECT COUNT(*) AS totale FROM db_domande") or die(mysql_error());
    $count_domande=mysql_fetch_assoc($st);

    for (
    $domanda 1$domanda<=$count_domande['totale']; ++$domanda) { 

        
    $id_risposta $post_autore.'_'.$domanda;

        
    $query "REPLACE INTO db_risposte (id_risposta, id_autore, id_domanda, risposta, confid,
     nota) VALUES ('"
    .$id_risposta."', '".    $post_autore."',  '".$domanda."', 
    '"
    .$_POST[$domanda.'_r']."', '".$_POST[$domanda.'_c']."', '".$_POST[$domanda.'_txt']."' )";

        
    mysql_query($query) or die (mysql_error());  
    }

    mysql_close($connessione); 
    devo forse creare prima un array con tutte le query da passare a SQL?

    Con questo codice a volte il processamento non va a buon fine e rimango con la pagina bianca (devo fare refresh + Invia di nuovo i dati)

  5. #5
    direi che hai un errore di base. La query count(*) rende un solo record con il numero delle ricorrenze trovate. Quindi quel for a che ti servirebbe? E poi perche' mai usare replace quando esiste UPDATE?

    REPLACE nel caso il record non esistesse (chiave primaria o unica) ne crea uno nuovo, Altrimenti cancella, rinumera e reinserisce. Hai voglia che la cosa non sia performante.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  6. #6
    Originariamente inviato da piero.mac
    direi che hai un errore di base. La query count(*) rende un solo record con il numero delle ricorrenze trovate. Quindi quel for a che ti servirebbe? E poi perche' mai usare replace quando esiste UPDATE?

    REPLACE nel caso il record non esistesse (chiave primaria o unica) ne crea uno nuovo, Altrimenti cancella, rinumera e reinserisce. Hai voglia che la cosa non sia performante.
    Spiego brevemente la logica dietro il codice:

    Ho un database di risposte (chiave unica: "IDautore_IDdomanda") che viene aggiornato a seguito del completamento di un form.

    Questo form, a sua volta (da qui non si vede), auto-riempie le risposte già fornite dall'autore in passato (periodicamente aggiungerò domande) consentendone la modifica se desiderato.

    Questo vuol dire che mentre alcune risposte potrebbero dover essere inserite ex-novo, tutte le altre vanno solo aggiornate (perché magari sono state modificate). Da qui il REPLACE... ho sbagliato?


    Per quanto riguarda il FOR, semplicemente è la prima cosa che mi è venuta in mente.. visto che a rigor di logica bisogna fare una query per ciascuna domanda, ho pensato di contare le domande e passare al db una risposta per ciascuna iterazione..

  7. #7
    Risposte inserite ex-novo che significa? Che prima erano assenti cioe' campi vuoti? Se si, usa l'update. Se i campi sono identici non viene effettuata alcuna modifica, se sono diversi (o vuoti) verranno aggiornati.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Originariamente inviato da piero.mac
    Risposte inserite ex-novo che significa? Che prima erano assenti cioe' campi vuoti? Se si, usa l'update. Se i campi sono identici non viene effettuata alcuna modifica, se sono diversi (o vuoti) verranno aggiornati.
    Si, che prima non c'erano nel questionari, quindi il database di risposte non ne ha le risposte... dici di fare un check preliminare e passargli un UPDATE o un INSERT a seconda che ci siano le relative chiavi univoche nel db?

  9. #9
    Originariamente inviato da WarriorXP
    Si, che prima non c'erano nel questionari, quindi il database di risposte non ne ha le risposte... dici di fare un check preliminare e passargli un UPDATE o un INSERT a seconda che ci siano le relative chiavi univoche nel db?
    faresti a mano quello che la replace fa in automatico...

  10. #10
    update e replace sono un po' diversi.

    Quello che mi suona male e' quel che dici sul database senza le risposte. Il database ha dei campi in cui vengono inserite delle risposte. Se la risposta e' una modifica allora update, se la risposta richiede un campo nuovo allora insert.

    replace inserisce un nuovo record se la chiave primaria o univoca non esiste, ma, il replace non modifica il record, il replace CANCELLA e riscrive il record con quello che ne puo' conseguire con possibili relazioni con altre tabelle. Ma giocarsi il record su un campo "varchar" UNIVOCO dove un errore di ortografia, uno spazio o altro potrebbero far credere di essere in presenza di un record nuovo personalmente lo considero un azzardo.

    Senza contare che le chiavi della tabella verranno riscritte per la cancellazione e poi riscritte per l'inserimento. Ovviamente tu sai di che si tratta nel tuo progetto e quindi fai come meglio ti pare.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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