Autore |
Discussione |
|
Dragon83
Padawan
Regione: Puglia
Città: Foggia
|
Inserito il - 27/02/2010 : 16:44:40
|
vi spiego il problema. ho una tabella con 3 campi: id, nome, cognome e telefono
ogni tanto inserisco un elenco completo di persone e se ce n'è qualcuno già inserito, aggiorna solo il telefono.
memorizzo in una variabile testuale tutti i record così:
for($i=1;$i<=$tot_nomi;$i++)
{
if($i>1) $ins .= ',';
$ins .= "($nome,$cognome,$tel)";
}
INSERT elenco(nome, cognome, telefono) VALUES".$ins." ON DUPLICATE KEY UPDATE telefono = ????
in questo modo faccio un'unica query ma c'è un problema: come potete vedere ho messo i punti interrogativi. Come faccio a dire a mysql di aggiornare il campo telefono con l'ultimo dei 3 valori della insert corrispondente a quel record?
1) soluzione che ho trovato è fare più query ma è improponibile con centinaia di record. 2) ho provato con replace ma perderei i dati in un'altra tabella a causa delle foreign keys
|
|
noname
Utente medio
Regione: Puglia
Prov.: Bari
Città: Città dell'Ammmore
|
Inserito il - 27/02/2010 : 17:06:59
|
Non puoi fare due query (controllo e insert o update) per ogni inserzione invece di una sola? Su centinaia di record sono veramente poche... Potresti pure usare le prepared statement per migliorare le performance |
|
|
Dragon83
Padawan
Regione: Puglia
Città: Foggia
|
Inserito il - 27/02/2010 : 17:35:57
|
Citazione: Messaggio inserito da noname
Non puoi fare due query (controllo e insert o update) per ogni inserzione invece di una sola? Su centinaia di record sono veramente poche...
così devi comunque richiamare il db e occupare la tabella per centinaia di volte. Conta che ci sono anche gli accessi degli utenti; il db non è mirato ad un uso individuale come durante gli esami. Preferisco ottimizzare al massimo. Comunque alla fine ci sono riuscito.
si fa così:
Citazione: INSERT elenco(nome, cognome, telefono) VALUES".$ins." ON DUPLICATE KEY UPDATE telefono = VALUES(telefono)
l'ho trovato googoleggiando un po' perchè sul sito ufficiale mysql stranamente non ho trovato alcun riferimento chiaro. Se c'è, deve essere veramente imboscato.
grazie comunque per l'attenzione |
|
|
Dragon83
Padawan
Regione: Puglia
Città: Foggia
|
Inserito il - 27/02/2010 : 18:54:27
|
Citazione: Messaggio inserito da noname
Potresti pure usare le prepared statement per migliorare le performance
inizialmente pensavo ti riferissi alle stored procedure ma dopo aver approfondito devo dire che non le conoscevo.
Secondo te questi PS possono essere utilizzati anche in pagine php chiamate da AJAX? mi spiego: io inserisco nel db un valore alla volta tramite ajax cliccando su un pulsante a cui è associato un evento js. Nella pagina php che viene richiamata faccio una query ogni volta. In questo caso posso dichiarare un PS e associargli i valori ogni volta? Spero di essere stato chiaro |
|
|
noname
Utente medio
Regione: Puglia
Prov.: Bari
Città: Città dell'Ammmore
|
Inserito il - 28/02/2010 : 14:40:42
|
Bella soluzione, me la segno :)
Per l'ultima domanda, in genere una PS non sopravvive tra due richieste successive nelle applicazioni web. Per cui avresti che la PS viene interpretata e compilata ogni volta, con un peggioramento di performance rispetto alle semplici query. Per ottenere un guadagno (ma è sempre meglio appurarlo con un benchmark) dovresti usare la query molte volte all'interno dello stesso script. Quindi sarebbe meglio fare una chiamata AJAX che veicola tutti i dati da inserire. Tra l'altro se vuoi ottimizzare, questo è molto importante. Uno dei principali colli di bottiglia delle applicazioni web consiste nel numero di richieste HTTP. Ed è per questo che molte tecniche di ottimizzazione si basano sulla riduzione delle richieste, ad esempio fondere tutti i file js e i file css in un unico file js e css, usare gli sprite css (tipo qui: http://www.google.com/images/nav_logo7.png ), elaborare i dati in blocco, etc...
Se fai qualche benchmark fammi sapere ;) , l'argomento è molto interessante
|
|
|
Dragon83
Padawan
Regione: Puglia
Città: Foggia
|
Inserito il - 28/02/2010 : 19:40:51
|
gli sprite css non si usano solo con i rollover?
per quanto riguarda le PS hai ragione: con ajax forse sono meglio le stored. Tra l'altro ho tutto fatto con le funzioni mysql e non mysqli; e per giunta pure procedurali. Prima di usare le PS dovrei aggiornare tutto.
Anzi visto che mi trovo. Ci sono dei vantaggi ad usare una cosa tipo?:
$mysql->fetch_row($Recordset)...
anzichè
mysql_fetch_row($Recordset)...
Fin'ora ho usato sempre il secondo perchè il php l'ho imparato così. Le classi le ho scoperte da poco per necessità ma in questo caso non ne capisco l'utilità |
|
|
noname
Utente medio
Regione: Puglia
Prov.: Bari
Città: Città dell'Ammmore
|
Inserito il - 28/02/2010 : 23:17:39
|
Gli sprite si usano anche per velocizzare il caricamento delle pagine. Accorpi tutte le immagini in una e con i css regoli l'offset dello sfondo, in modo da visualizzare la parte che ti interessa. Oltre a guadagnare KB sull'immagine, riduci il numero di richieste e il tempo di caricamento, e le immmagini vengono renderizzate contemporaneamente sulla pagina.
Se usi le classi per interfacciarti con mysql, usi l'estensione mysqli, che mi sa è l'unica a prevedere anche un accesso object oriented. La differenza è nella libreria. In giro trovi vantaggi/svantaggi di usare le funzioni mysql o mysqli.
Volendo puoi mantenere lo stile procedurale, e forse te la puoi cavare anche con un search and replace, perchè la maggior parte dei nomi delle funzioni varia per la "i"
|
|
|
Dragon83
Padawan
Regione: Puglia
Città: Foggia
|
Inserito il - 01/03/2010 : 21:00:42
|
ho provato ad usare gli sprite ma non risco a caricare le immagini con repeat. Inoltre fanno un casino con la proprietà width. Praticamente io uso la stessa immagine larga 1px per disegnare i div, ma questi ultimi non sono tutti uguali; perciò succede un casino perchè imposta la larghezza di tutti i div con quella classe con la larghezza dell'immagine. A parte che ho notato un peggioramento nei caricamenti (in locale) ma comunque per usare questo sistema in tutto il sito devo modificare la struttura html attuale e ora non ho tempo.
Poi se mi spieghi come faccio a usare repeat-x e repeat-y con le sprite mi fai un fischio. Ho provato creando delle classi a parte con png separati per il verticale e orizzontale ma c'è sempre qualcosa che non va.
EDIT: sono vagamente OT |
Modificato da - Dragon83 in data 01/03/2010 21:02:10 |
|
|
noname
Utente medio
Regione: Puglia
Prov.: Bari
Città: Città dell'Ammmore
|
|
Dragon83
Padawan
Regione: Puglia
Città: Foggia
|
Inserito il - 03/03/2010 : 23:08:26
|
li avevo già letti entrambi. grazie lo stesso
si, gli sfondi a cui vorrei applicarli sono bordi verticali e orizzontatali. facendo un rapido conto potrei caricare 4 immagini orizzontali e 3 verticali (7 richieste) in 2 file sprite
ho provato anche a mettere tutto il css del sito in un unico file (beh quasi unico) e nonostante la grandezza sia passata da circa 300B ciascuno (7-8 file) a 13KB in uno solo, la velocità è aumentata tantissimo!!!. Secondo Firebug, quel file css, sta sui 90ms in locale e in totale ho guadagnato 1s passando da 2s circa a 1, ovviamente ricaricando la pagina, altrimenti sto su una media di 400ms a pagina. Se riesco a "spritare" anche le immagini ripetute i tempi dovrebbero abbassarsi ancora. |
|
|
noname
Utente medio
Regione: Puglia
Prov.: Bari
Città: Città dell'Ammmore
|
Inserito il - 04/03/2010 : 00:21:55
|
Bene!
Ma come è possibile che ti viene da 13KB se sono da 300b l'uno?
Se vuoi spingerti ancora oltre puoi lavorare anche sulle dimensioni dei file js e css. Ci sono dei tool che li comprimono e li ottimizzano ;) |
|
|
Dragon83
Padawan
Regione: Puglia
Città: Foggia
|
Inserito il - 04/03/2010 : 12:41:34
|
ammetto di aver fatto il conto vagamente a occhio :P
i tool minifier li conosco già; anzi, ho inserito il plugin Jsmin su Pspad. Peccato che non ci sia il corrispettivo per il css. |
|
|
|
Discussione |
|