Problème RETURN fonction [Résolu]

Utilisateur anonyme - 20 mai 2014 à 14:53 - Dernière réponse :  Utilisateur anonyme
- 22 mai 2014 à 15:03
Bonjour,

Je viens de retravailler un petit code ...

Il me permet d'afficher un calendrier et les manifestations par date.

Quand la date est celle actuelle, il ma met en rouge. Sinon, en #666666. Et j'aimerais que dans il y ai des manifestations, il mette la date en vert.

function fUpdateCal(iYear, iMonth)
{
    myMonth = fBuildCal(iYear, iMonth);
    objPrevElement.bgColor = "";
    document.all.calSelectedDate.value = "";
     
    for (w = 1; w < 7; w++)
    {
        for (d = 0; d < 7; d++)
        {
            if (!isNaN(myMonth[w][d]))
            {
                var dNow = new Date();
                var jourNow = dNow.getDate();
                var moisNow = dNow.getMonth()+ 1;
                var anneeNow = dNow.getFullYear();
                var date = myMonth[w][d]+'-'+$('#mois').val()+'-'+$('#annee').val();;
                var count;
                 
                calDateText[((7*w)+d)-7].innerText = myMonth[w][d];
                 
                count = rechercheManifest(date);
                  
                if ($('#mois').val()==moisNow && $('#annee').val()==anneeNow && jourNow==myMonth[w][d])
                {
                    calDateText[((7*w)+d)-7].innerText = myMonth[w][d];
                     
                    if (count>0)
                    {
                        calDateText[((7*w)+d)-7].style.color  ='green';
                    }
                    else
                    {
                        calDateText[((7*w)+d)-7].style.color ='red';
                    }
                }
                else
                {
                    if (count>0)
                    {
                        calDateText[((7*w)+d)-7].style.color  ='green';
                    }
                    else
                    {
                        calDateText[((7*w)+d)-7].style.color ='#666666';
                    }
                }
                 
            }
            else
            {
                calDateText[((7*w)+d)-7].innerText = " ";
            }
        }
    }
}
 
function rechercheManifest(date)
{
    $.ajax({
       type: "GET",
       url: "controleur/c_manifestations.php",
       data:'compter='+date,   
        dataType:'json',
       success: function(data)
       {
            return data;
       }
     });
}


Seul problème, j'obtiens une variable indéfinie pour "count".

Pourquoi mon return data ne fonctionne pas ?

Merci d'avance !

PS : j'ai fais un console.log(data) dans la fonction rechercheManifest et la variable était tout à fait correcte !
Afficher la suite 

Votre réponse

23 réponses

YepoMax 75 Messages postés samedi 8 décembre 2012Date d'inscription 14 juin 2014 Dernière intervention - 20 mai 2014 à 22:46
+1
Utile
Bonjour, je viens juste de lire le topic, en effet l'erreur vient du fait que vous essayez de récupérer la valeur de rechercheManifest alors que la fonction est de type void.

Au fait plutôt que de se casser la tête avec Ajax (qui est en asynchrone pour rappel, càd que "success" est un callback exécuté lorsque la requête a abouti), pourquoi ne pas utiliser XMLHTTPRequest ?

En gardant votre code ORIGINAL (celui posté dans la question), remplacez "rechercheManifest" par :

function rechercheManifest(date)
{
    var req = new XMLHTTPRequest();
    req.open("GET", "controleur/c_manifestations.php?compter=" + date);
    req.send();
    return req.responseText;
}
// Et voilà, lorsque vous ferez count = rechercheManifest(date), count prendra la valeur appropriée plutot que 'undefined'.


Pour plus de renseignements/explications sur XMLHTTPRequest : https://developer.mozilla.org/fr/docs/XMLHttpRequest

Bien à vous !
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de YepoMax
jordane45 21098 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 mai 2018 Dernière intervention - 20 mai 2014 à 15:02
0
Utile
Bonjour,

1 ] Peux tu tester :
 var count = rechercheManifest(date);
 console.log(count);



2 ] - Quelle(s) donnée(s) récupères tu via ton ajax ?
- Sous quelle forme ?

3 ] Via ton debogger de script... à quelle(s) ligne(s) obtiens tu l'erreur ?
Commenter la réponse de jordane45
Utilisateur anonyme - 20 mai 2014 à 15:37
0
Utile
1) J'obtient undefined
2) Je récupère juste un chiffre, 0 ou plus (data renvoie directement "0" ou un chiffre)

Le code de c_manifestations
$date = strtotime($_GET['compter']);
$compter = Manifestation::compterManifestations ($date);
echo json_encode($compter);


3) Justement, j'ai aucune erreur sur le debogger ...
Commenter la réponse de Utilisateur anonyme
jordane45 21098 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 mai 2018 Dernière intervention - 20 mai 2014 à 16:06
0
Utile
De mémoire...

Soit tu mets le traitement ( le code qui a besoin de DATA) directement dans ta fonction SUCCESS... soit tu utilises une fonction de "callback" '(qui contiendra le code à réaliser à partir de DATA).


Commenter la réponse de jordane45
Utilisateur anonyme - 20 mai 2014 à 16:08
0
Utile
J'ai bien essayé de mettre le code dans le Success, mais j'ai le droit à une belle erreur ...

jordane45 21098 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 mai 2018 Dernière intervention - 20 mai 2014 à 16:16
C'est pourtant la "meilleur" solution.

Pour ce qui est du message d'erreur...et ben... quel est il ?
(et comment avez-vous écrit le code ? )
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 20 mai 2014 à 17:24
0
Utile
Alors :)
J'ai enfin réussi à obtenir quelque chose ...
Mais sous forme d'objet ...

var count = $.ajax({
					"url": 'controleur/c_manifestations.php',
					"data": 'compter='+date,	
					"type": 'GET',
					"dataType": 'json',
					"jsonpCallback": 'callback'
				});
					
					console.log(count);


Résultat :


Object {readyState: 1, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function...}
abort: function ( statusText ) {
always: function () {
complete: function () {
done: function () {
error: function () {
fail: function () {
getAllResponseHeaders: function () {
getResponseHeader: function ( key ) {
overrideMimeType: function ( type ) {
pipe: function ( /* fnDone, fnFail, fnProgress */ ) {
progress: function () {
promise: function ( obj ) {
readyState: 4
responseJSON: 0
responseText: " 0"
setRequestHeader: function ( name, value ) {
state: function () {
status: 200
statusCode: function ( map ) {
statusText: "OK"
success: function () {
then: function ( /* fnDone, fnFail, fnProgress */ ) {
__proto__: Object


J'aimerais récupérer le responseText, comment m'y prendre ?
console.log(count['responseText']) ne fonctionne pas ...
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 21 mai 2014 à 09:27
0
Utile
Merci beaucoup YepoMax.

Seul problème, ça ne me retourne rien ...
J'ai copié exactement votre fonction et je l'ai appelé comme vous le disiez.

Je n'obtiens pas d'erreur, juste du vide.

Mon c_manifestation.php est de la sorte

$date = strtotime($_GET['compter']);
$compter = Manifestation::compterManifestations ($date);
echo json_encode($compter);

YepoMax 75 Messages postés samedi 8 décembre 2012Date d'inscription 14 juin 2014 Dernière intervention - 21 mai 2014 à 12:48
Si la fonction que j'ai écrite ne rend pas ce que vous attendez ça peut être pour les raisons suivantes :
- la date passée n'est pas au bon format pour le php
- l'url de la page php n'est pas bonne
- la page php ne rends pas le bon résultat (Manifestation::compterManifestations fonctionne correctement ?)

A mon avis le problème est dans le format de la date. Les formats valides se trouvent ici :http://www.php.net/manual/fr/datetime.formats.date.php

En général, quand on veut passer une date à une page php, on utilise directement un timestamp car on est alors certain qu'aucune erreur n'apparaîtra à cause de la date.

Votre php deviendrait :

$compter = Manifestation::compterManifestations ( intval($_GET['compter']) );
echo json_encode($compter);


Et le Javascript devient :

/* Votre code original :
var date = myMonth[w][d]+'-'+$('#mois').val()+'-'+$('#annee').val();
var count = rechercheManifest(date);
*/

// Devient :
var date = new Date();
date.setDate(myMonth[w][d]);
date.setMonth($('#mois').val());
date.setYear($('#annee').val());

var count = rechercheManifest(date.getTime()); // .getTime retourne le timestamp



Quoiqu'il en soit, n'hésitez pas à utiliser la console pour voir ce que la fonction rechercheManifest retourne, et n'hésitez pas à aller sur votre page php controleur/c_manifestations.php?compter=1400668863687 pour mieux visualiser !
Commenter la réponse de Utilisateur anonyme
0
Utile
Bon c'est de pire en pire :v
Format de "date" dans ma base de donnée : timestamp

Mon code PHP
/**
  * Compter les manifestations par date
  *
  * @return    Nombre de manifestations
  */
 public static function compterManifestations ($date)
 {
  global $bdd;
  
  try
  { 
   $req = $bdd ->prepare("SELECT * FROM manifestations WHERE date='$date'");
   $req->execute();
   $manifestations = $req->fetchAll();
   
   nouveauLog (date("Y-m-d H:i:s"), "OK", "","fonction compterManifestations");
  }
  catch(Exception $e)
  {
   die (nouveauLog (date("Y-m-d H:i:s"), "NOK", $e->getMessage() ,"fonction compterManifestations"));
  }
  
  return count($manifestations);
 } 


$compter = Manifestation::compterManifestations ( intval($_GET['compter']) );
echo json_encode($compter);


JS
function rechercheManifest(date)
{
 var req = new XMLHTTPRequest();
    req.open("GET", "controleur/c_manifestations.php?compter=" + date);
    req.send();
    return req.responseText;
} 


var date = new Date();
    date.setDate(myMonth[w][d]);
    date.setMonth($('#mois').val());
    date.setYear($('#annee').val());

    var count = rechercheManifest(date.getTime()); // .getTime retourne le timestamp

    
    console.log(count);


Au secours :'(

AsrahZarh
« L'avenir appartient à ceux qui se lèvent tôt »
Utilisateur anonyme - 21 mai 2014 à 17:47
J'ai tenté le console.log(count.responseText); et j'obtient "undefined" ...
YepoMax 75 Messages postés samedi 8 décembre 2012Date d'inscription 14 juin 2014 Dernière intervention - 21 mai 2014 à 22:54
@ jordane45

Dans le code original, AsrahZarh utilisais rechercheManifest comme une fonction synchrone alors que sa requête Ajax était en asynchrone.
Lorsque je n'ai pas besoin d'asynchrone, j'utilise XMLHttpRequest qui, rappelons le est BUILT-IN ! (et un 'W3C standard' qui plus est)
Pourquoi utiliser onreadystatechange (on aurait une fonction asynchrone), readyState ou status ?

@ AsrahZarh

Toutes mes excuses, j'ai fais une faute de frappe, ce n'est pas XMLHTTPRequest mais XMLHttpRequest !!

Pour le php je ne sais pas vous aider car vous utilisez une fonction que je ne connais pas : nouveauLog
jordane45 21098 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 mai 2018 Dernière intervention - 21 mai 2014 à 23:03
YepoMax 75 Messages postés samedi 8 décembre 2012Date d'inscription 14 juin 2014 Dernière intervention - 21 mai 2014 à 23:09
Je n'ai pas dit qu'Ajax ne fait rien en synchrone ^^ Ajax fait tout. Ce qu'on ne sait pas c'est que XMLHttpRequest fait tout aussi sans avoir besoin d'Ajax. La différence :
- dans la plupart des cas Ajax s'écrit en bien moins de lignes (ça c'est cool !)
- XMLHttpRequest est built-in (ça c'est cool !)
jordane45 21098 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 mai 2018 Dernière intervention - 22 mai 2014 à 00:24
Ajax (de jquery) utilises xmlhttprequest....
après tout... jquery n'est rien de plus qu'une "librairie" de fonctions javascript..

L'avantage comme tu le soulignes c'est en effet ça syntaxe simplifiée...
Sans parler du fait qu'un très grand nombre de choses y sont déjà codées... (en fonction du type de navigateur par exemple)...
Bref... Vu la "différence" de temps de réponse entre les deux (après tout c'est à peu près le seul avantage d'ecrire en "pure" javascript) il n'y a pas photo.... si on a jquery sous la main... autant l'utiliser.

Pour ce qui est de :
Pour le php je ne sais pas vous aider car vous utilisez une fonction que je ne connais pas : nouveauLog
nouveauLog est très certainement une fonction personnalisée du demandeur qui permet de stocker dans un fichier des Logs...

Et pour finir...
Vu que le demandeur encode en JSON dans son script php (ajax)... il faut manipuler en retour " l'objet" json.
http://www.mkyong.com/javascript/how-to-access-json-object-in-javascript/
Commenter la réponse de Utilisateur anonyme
0
Utile
Alors ... merci pour l'aide apportée, déjà.
Mais je dois vraiment être blonde.
Je n'y arrive toujours pas alors que ça me parait simple.

Alors ...
Le résultat obtenu est le suivant : http://www.zimagez.com/full/2a1359178c0f83921c7dc60fb549e4251e4265d004d68114986a0985820ed9052467a924c27267a94971d233858c160f72f3e63771007ae1a3949f47d751b21f66a0e19491256013.php

Et j'aimerais retourner "ResponseText" (ou ResponseJSON car c'est la "même chose" du point de vue valeur) ...

J'ai essayé : console.log(count["ResponseText"]);
Qui m'affiche : undefined

Donc je suis toujours aussi perdue :s

AsrahZarh
« L'avenir appartient à ceux qui se lèvent tôt »
jordane45 21098 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 mai 2018 Dernière intervention - 22 mai 2014 à 10:07
Reprenons tout de puis le début.

Peux tu essayer cette syntaxe :
[ en remplaçant par tes données..]
var string = 'default';
$.ajaxSetup({async: false});
$.get('controleur/c_manifestations.php?compter=" + date)',
  function(data){
    string = data;
  }
);
alert(string);

Puis nous dire ce que l' alert te retourne ?
Utilisateur anonyme - 22 mai 2014 à 10:12
L'alerte me retourne 0. Même quand il s'agit que ça ma retourne 2 ... :s

EDIT : non c'est bon ça me retourne les bons résultats ^^
Utilisateur anonyme - 22 mai 2014 à 10:15
Et merci ça fonctionne enfin :D
jordane45 21098 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 22 mai 2018 Dernière intervention - 22 mai 2014 à 10:18
Tu penseras à mettre le sujet en résolu dans ce cas.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 22 mai 2014 à 10:19
0
Utile
Pour ceux que ça intéresse, je récapitule :)

JS
var date = myMonth[w][d]+'-'+$('#mois').val()+'-'+$('#annee').val();;
var count;
$.ajaxSetup({async: false});
$.get('controleur/c_manifestations.php?compter='+date,
 function(data)
{
	count = data;
 }
); 


PHP (c_manifestations.php)
$date = strtotime($_GET['compter']);
$compter = Manifestation::compterManifestations ($date);
echo json_encode($compter);


Merci encore à Jordane45 et YepoMax :)
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 22 mai 2014 à 15:03
0
Utile
Je reviens vers vous, car j'ai un autre soucis.

J'aimerais coder le plus possible avec Jquery.
Certaines méthodes, j'arrive à les convertir de JS en Jquery ...

Mais il y en a une qui me pose problème ...

calDateText[((7*w)+d)-7].innerText = myMonth[w][d];

calDateText est l'id de l'élément, et le nombre entre crochet est défini par la boucle de cette manière :

for (w = 1; w < 7; w++)
    {
        for (d = 0; d < 7; d++)
        {

innerText pour ajouter le texte dans l'élément, et myMonth[w][d] est évidemment le texte ajouté :)

Je cherche à le traduire car ce que j'aimerais (ou alors c'est aussi possible comme ça mais j'ai du mal) :

- CalDateText est fils (<font id="caldatetext" ...>) de calCell (<td id="calCell " ...>), j'avais pensé faire un :

CaseEnCours.parent().css( "background-color", 'red');

mais il faudrait pour cela que je récupère l'élément pour le mettre dans "caseEnCours" ...

Je ne sais pas si c'est simple à comprendre ... :s

var CaseEnCours = calDateText[((7*w)+d)-7];
// NE FONCTIONNE PAS

Pour vous aider, voici la fonction complète ...

function fUpdateCal(iYear, iMonth)
{
    myMonth = fBuildCal(iYear, iMonth);
    objPrevElement.bgColor = "";
    document.all.calSelectedDate.value = "";
     
    for (w = 1; w < 7; w++)
    {
        for (d = 0; d < 7; d++)
        {          
            if (!isNaN(myMonth[w][d]))
            {
                var dNow = new Date();
                var jourNow = dNow.getDate();
                var moisNow = dNow.getMonth()+ 1;
                var anneeNow = dNow.getFullYear();
                 
                var date = myMonth[w][d]+'-'+$('#mois').val()+'-'+$('#annee').val();
                var count;
                var suiteD;
                     
                $.ajaxSetup({async: false});
                $.get('controleur/c_manifestations.php?compter='+date,
                  function(data)
                  {
                    count = data;
                  }
                );
                 
                if (count>0)
                {
                    var textDecoration  = 'underline';
                    var styleBG  = '#99CCF7';
                }
                else
                {
                    var textDecoration  = 'none';
                    var styleBG  = 'white';
                }
                  
                calDateText[((7*w)+d)-7].innerText = myMonth[w][d];
                 
                var CaseEnCours = calDateText[((7*w)+d)-7];
                alert(((7*w)+d)-7);
                  
                if ($('#mois').val()==moisNow && $('#annee').val()==anneeNow && jourNow==myMonth[w][d])
                {
                    calDateText[((7*w)+d)-7].style.color ='red';
                }
                else
                {
                    calDateText[((7*w)+d)-7].style.color ='#666666';
                }
                 
                 
                calDateText[((7*w)+d)-7].style.textDecoration  = textDecoration;
                //CaseEnCours.parent().css( "background-color", styleBG );
                //calDateText[((7*w)+d)-7].parent().style.bgcolor  = styleBG;
                 
                 
            }
            else
            {
                calDateText[((7*w)+d)-7].innerText = " ";
            }
        }
    }
}


Merci d'avance :)
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.