|
Publicité | ||||||||||||||||||||||
|
|
#1 |
|
Nouveau membre du Club
![]() Date d'inscription: avril 2004
Messages: 59
|
Yop,
je suis en train de faire une petite api pour gérer un stock là où je travaille, et j'ai un petit soucis lors de l'appel à la BDD. En fait tout fonctionne bien. Pour vous expliquer voici le code: Code :
function ajax(num, arg) { var xhr=null; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } var ii = []; xhr.onreadystatechange = function() { if (xhr.readyState==4) { var docX = xhr.responseXML; var items = docX.getElementsByTagName("rep"); if (items.length != 0){ for (i=0;i<items.length;i++) { ii[i] = items[i].getAttribute("ii"); } } else {alert("rien trouvé");} } }; xhr.open("GET", "requete_mysql_xml.php?num=" + num + "&arg=" + arg, true); xhr.send(null); var i = 0; // while (ii.length == 0) {} return ii; } Le problème là dedans c'est que ça fait bugger le navigateur, et là en particulier il me demande à chaque fois si je veux arrêter le script gourmand. Donc voilà, j'aurais aimé savoir si vous connaissiez une parade à ça Merci d'avance A+ saipas |
|
|
|
|
|
#2 |
![]() Nom : Emmanuel REMY
Date d'inscription: novembre 2005
Localisation: Grand Perron des Encombres
Âge: 41
Messages: 2 466
|
Salut,
Ton code est correct, et ta requête AJAX est asynchrone, d'où la continuité d'exécution, et la fonction de rappel onreadystatechange. Ton souci c'est que ta variable ii est locale à ta fonction . Plutôt ce code::Code :
var ii = []; function ajax(num, arg) { var xhr=null; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.onreadystatechange = function() { if (xhr.readyState==4) { var docX = xhr.responseXML; var items = docX.getElementsByTagName("rep"); if (items.length != 0){ for (i=0;i<items.length;i++) { ii[i] = items[i].getAttribute("ii"); } } else {alert("rien trouvé");} } }; xhr.open("GET", "requete_mysql_xml.php?num=" + num + "&arg=" + arg, true); xhr.send(null); } ERE
__________________
Quand une tête pense seule, elle devient folle. |
|
|
|
|
#3 |
|
Nouveau membre du Club
![]() Date d'inscription: avril 2004
Messages: 59
|
Salut Emmanuel,
merci pour ta réponse. Je crois que ton astuce ne convient pas tout à fait au reste de mon code. En gros la fonction ajax (renommée fetchSQL depuis :p) se trouve dans un .js, et est appelée directement par la page (comme tu t'en doutes) avec un truc du genre : Code :
var rslt = fetchSQL(num, arg); for (i=0;i<rslt.length;i++) { nv = new Option(rslt[i]); document.getElementById('selectObj').options[document.getElementById('selectObj').length] = nv; } Encore merci pour ton aide |
|
|
|
|
|
#4 |
![]() Nom : Emmanuel REMY
Date d'inscription: novembre 2005
Localisation: Grand Perron des Encombres
Âge: 41
Messages: 2 466
|
Re,
Ce n'est pas une "astuce" mais la démarche normale dans le cadre d'un appel asynchrone: tu ne peux pas accéder de suite aux données car ton script ne bloque pas le navigateur le temps de l'appel AJAX. D'où la fonction de rappel Si tu souhaites faire ce que tu inscris, alors le code ressemblera - de base - à cela: Code :
//fctn est la fonction qui recevra le tableau des lignes récupérées
function fetchSQL(num, arg, fctn)
{
var xhr=null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.onreadystatechange = function() {
if (xhr.readyState==4)
{
var docX = xhr.responseXML;
var ii = [];
var items = docX.getElementsByTagName("rep");
if (items.length != 0){
for (i=0;i<items.length;i++)
{
ii[i] = items[i].getAttribute("ii");
}
if (fctn) fctn(ii);
}
else
{alert("rien trouvé");}
}
};
xhr.open("GET", "requete_mysql_xml.php?num=" + num + "&arg=" + arg, true);
xhr.send(null);
}
Code :
fetchSQL(num, arg, function(rslt ){ for (var i=0;i<rslt.length;i++) { nv = new Option(rslt[i]); document.getElementById('selectObj').options[ document.getElementById('selectObj').length ] = nv; } }); ERE
__________________
Quand une tête pense seule, elle devient folle. |
|
|
|
|
#5 |
|
Nouveau membre du Club
![]() Date d'inscription: avril 2004
Messages: 59
|
Wow, je t'avouerais que je ne comprends pas tout (voire rien) à ce que tu as fait, mais en tous cas ça marche nickel
Merci pour l'aide!! |
|
|
|
|
|
#6 |
|
Nouveau membre du Club
![]() Date d'inscription: avril 2004
Messages: 59
|
Lol, je reviens à l'attaque...
En fait j'utilise pas mal la fonction fetchSQL dans l'api (à chaque fois que je fais une requête vers la base) et j'aurais bien aimé avoir un appel à la fonction du style funct(param). C'est possible? J'ai essayé de reconstruire un autre tableau à partir de l'autre mais ça fonctionne pas.. je suppose que c'est dû au fait que je ne comprends pas ce que fait ta fonction Code :
//marche pas function fetchSQL2(num, arg) { var rslt2 = []; fetchSQL(num, arg, function(rslt) { for (i=0;i<rslt.length;i++) { rslt2[i] = rslt[i]; } }); return rslt2; } function fillin(num, arg){ var rslt = fetchSQL2(num, arg); for (i=0;i<rslt.length;i++) { nv = new Option(rslt[i]); document.getElementById('selectObj').options[document.getElementById('selectObj').length] = nv; } } |
|
|
|
|
|
#7 |
![]() Nom : Emmanuel REMY
Date d'inscription: novembre 2005
Localisation: Grand Perron des Encombres
Âge: 41
Messages: 2 466
|
Non, c'est toujours le même souci, le fait que la requête AJAX est asynchrone. Tu ne peux donc pas faire:
Code :
var rslt2 = []; fetchSQL(num, arg, function(rslt) { for (i=0;i<rslt.length;i++) { rslt2[i] = rslt[i]; } }); return rslt2; ![]() Et cela ne t'apporte pas grand chose... plutôt faire: Code :
function fillin(num, arg){ fetchSQL(num, arg, function(rslt) { for (i=0;i<rslt.length;i++) { nv = new Option(rslt[i]); document.getElementById('selectObj').options[document.getElementById('selectObj').length] = nv; } } } ERE
__________________
Quand une tête pense seule, elle devient folle. |
|
|
|
|
#8 |
|
Nouveau membre du Club
![]() Date d'inscription: avril 2004
Messages: 59
|
Ok merci pour la réponse.
Je fais ça parce qu'à côté j'ai un appel à la fonction fillin depuis un bouton. Là en l'occurence c'est une page test donc effectivement c'est pas folichon mais sur mes autres pages ça va chercher des valeurs de textbox puis fait une recherche dans la base. Voili voilou, merci encore |
|
|
|
|
|
#9 | |
![]() Nom : Emmanuel REMY
Date d'inscription: novembre 2005
Localisation: Grand Perron des Encombres
Âge: 41
Messages: 2 466
|
Citation:
Bon dev, ERE
__________________
Quand une tête pense seule, elle devient folle. |
|
|
|
|
|
#10 |
|
Nouveau membre du Club
![]() Date d'inscription: avril 2004
Messages: 59
|
Petite précision : j'ai dû modifier ça dans la fonction fetchSQL, sinon quand il n'y avait pas de résultat à la requête ça ne renvoyait rien du tout...
Code :
else { ii[0] = "Rien trouvé"; fctn(ii); } |
|
|
|
|
|
#11 |
![]() Nom : Emmanuel REMY
Date d'inscription: novembre 2005
Localisation: Grand Perron des Encombres
Âge: 41
Messages: 2 466
|
Plutôt:
Code :
var ii = [ "Rien trouvé" ]; if (items.length > 0){ for (i=0;i<items.length;i++) { ii[i] = items[i].getAttribute("ii"); } } fctn(ii); ERE
__________________
Quand une tête pense seule, elle devient folle. |
|
|
|
|
#12 |
|
Nouveau membre du Club
![]() Date d'inscription: avril 2004
Messages: 59
|
Adjugé vendu!
|
|
|
|
|
|
![]() |
||
Requête Access via PHP/XML
|
||
| Outils de la discussion | |
|
|