sono contento che insieme siamo riusciti a venire a capo dei problemi,
per chi ci ha seguito, vorrei riepilogare gli oltre 120 post che nelle 3 discussioni, hanno portato a risolvere i diversi problemi,
http://forum.mrwebmaster.it/jquery/...tabase-tramite-query-lanciata-php-jquery.html
http://forum.mrwebmaster.it/ajax/41066-comportamento-anomalo-ie-9-10-a.html
http://forum.mrwebmaster.it/javascript/40581-errato-funzionamento-script-ie-10-ie-tester.html
l'obiettivo iniziale é stato quello di rendere più veloce la risposta del database, quando interrogato con una select con molte join
la struttura del database era ben definita ed é stato facile trovare la soluzione, in prima battuta creando una view che incorporasse le join
senza modifiche alla struttura del db, ottenendo un miglioramento della risposta e come secondo passo, inserendo gli elementi di ricerca della tabella principale,
in alcune tabelle usate come riferimento per guidare gli utenti nelle ricerche stesse,
in questo modo si rendevano disponibili i "puntatori" alla tabella principale che hanno permesso di eliminare le join
con la miglior performance possibile
nel contempo il codice è stato revisionato, migliorando la leggibilità e soprattutto sistemando i tag non perfettamente a posto della pagina html
il codice è stato sviluppato per utilizzare il metodo client/server ed é questa formulazione che ha comportato i maggiori problemi per un corretto funzionamento
nello specifico, alla scelta nei menu a tendina (di base, popolati al caricamento della pagina),
HTML:
<td>
Applicazione/Application:
<select id="applicazione" name="applicazione">
<?php echo $opt->ShowApplicazioni($lng); ?>
</select>
</td>
viene attivato il codice javascript con l'intento di popolare altri 8 menu a tendina e quindi, contare i record che verrebbero selezionati nel database con le scelte fatte
HTML:
<td height="50">
Diametro/Diameter: <label for="Diametro" name="Diametro2" id="Diametro2" > </label>
<select name="Diametro" id="Diametro">
<option value="0">scegli...</option>
</select>
</td>
uno script php é incaricato di recuperare le "option" dal database per popolare i menu a tendina
ed un secondo per il conteggio degli elementi, (il conteggio avviene per ogni scelta fatta nei menu a tendina)
problemi risolti in "questa esperienza",
il metodo POST, usato in origine, è stato sostituito con il metodo GET, perché GET sembra più affidabile,
i parametri vengono passati nell' URL anziché nella "SEND"
PHP:
xmlhttp.open("POST", "characteristics.php", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send
(
"funzione=" + funzione
+ "&id=" + applic
+ "&id2=" + comeR
+ "&lng=" + lang
);
PHP:
var xURL = "characteristics.php?funzione="+funzione+"&id="+applic+"&id2="+comeR+"&lng="+lang
xmlhttp.open("GET", xURL, true);
xmlhttp.send(null);
la cache restituiva lo stesso conteggio dei record pur con "option" diverse selezionate,
ovvero il server non vedendo variazioni della "chiamata", diceva al client di usare i valori presenti nella cache,
sono state aggiunte le ultime cifre del timer nel URL, per rendere la "chiamata" univoca
PHP:
var xURL = "elementscount.php?timestamp=" + (new Date().getTime())%100000
+ "&id=" + applic
+ "&id2=" + comeR
+ "&dmt=" + v_dmt
+ "&suppt=" + v_suppt ......
il conteggio deve avvenire dopo che tutti i menu a tendina sono stati popolati,
altrimenti non sono disponibili i parametri per la query,
ma il "browser" esegue il codice, in questo caso le chiamate Ajax (Asynchronous Javascript And Xml), nell'ordine che preferisce al momento
é stata utilizzata una soluzione semplice per controllare che il conteggio avvenisse al termine delle altre chiamate,
ovvero, vengono popolate le "<select>" con una riga "attendere" e quando si esegue la funzione di conteggio,
viene controllata la loro presenza per cui la funzione di conteggio viene rieseguita ma ritardata di 0,5 secondi,
con un limite di 15 volte per evitare il blocco/crash del browser (15 é un valore cautelativo)
PHP:
var attendere = '<option value="-1">Attendere...</option>';
$("select#"+form_tag).html(attendere);
function ContaRecords(i)
{
i++; if (i > 15) { alert('attenzione I > 15'); return false; }
if (
v_dmt==-1
|| v_suppt==-1
|| v_lamier==-1
|| v_pavt==-1
|| v_vol==-1
|| v_Ruot==-1
|| v_por==-1
|| v_seriesup==-1
) { setTimeout(function () { ContaRecords(i); }, 500); return false; };
ma il problema più consistente é stato capire che i test fatti in ambiente MS IIS 7.5 differivano dall'ambiente operativo (senza possibilità di accesso) gestito con Apache
ovvero IIS restituisce nelle chiamate client/server la "stringa", risultato dell'operazione
Apache restituisce un documento html, in questo secondo caso bisogna estrarre il risultato dal documento,
pena il mancato funzionamento dell'applicazione con browser IE diversi
certo poi la soluzione è semplicissima ... (grazie Antonio)
PHP:
var n1 = data.indexOf("<option");
var n2 = data.indexOf("</select>");
data = data.substring(n1, n2);
}
$(form_tag).html(data);
questo comportamento, farebbe pensare di inserire un tag "personale" di apertura e chiusura della stringa dei dati
in modo da estrarre la stringa correttamente, rendendo tutto indipendente dall'ambiente,
(esempio : #mytag# stringa da restiture #/mytag#)
tutto quanto descritto é riferibile a "questa esperienza", altre situazioni (configurazioni) potrebbero portare risultati diversi
ciao
Marino