Problème RETURN fonction

Résolu
Utilisateur anonyme - 20 mai 2014 à 14:53
 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 !

11 réponses

YepoMax Messages postés 74 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 14 juin 2014 20
20 mai 2014 à 22:46
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 !
1
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
20 mai 2014 à 15:02
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 ?
0
Utilisateur anonyme
20 mai 2014 à 15:37
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 ...
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
20 mai 2014 à 16:06
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).


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
20 mai 2014 à 16:08
J'ai bien essayé de mettre le code dans le Success, mais j'ai le droit à une belle erreur ...

0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
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 ? )
0
Utilisateur anonyme
20 mai 2014 à 17:24
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 ...
0
Utilisateur anonyme
21 mai 2014 à 09:27
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);

0
YepoMax Messages postés 74 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 14 juin 2014 20
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 !
0
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 »
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
21 mai 2014 à 17:43
Bonjour,

Ce qui m'étonne... c'est que vous n'utilisez pas le :
onreadystatechange... ni le readyState .. ni .status.... qui permettent de connaitre l'état de la requête ajax en xmlhttprequest...

Autre point... [ Yepo pourra surement me le dire puisque c'est lui qui vous l'a proposé......] ... pourquoi passer par xmlhttprequest au lieux du AJAX (de Jquery)... qui font... exactement la même chose.... ??)

Sachant que par Ajax vous aviez trouvé la syntaxe pour obtenir le résultat... et qu'il ne vous restait plus qu'à manipuler l'objet json retourné par votre fonction..
Un truc du genre :

console.log(count.responseText);
0
Utilisateur anonyme
21 mai 2014 à 17:47
J'ai tenté le console.log(count.responseText); et j'obtient "undefined" ...
0
YepoMax Messages postés 74 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 14 juin 2014 20
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
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
21 mai 2014 à 23:03
0
YepoMax Messages postés 74 Date d'inscription samedi 8 décembre 2012 Statut Membre Dernière intervention 14 juin 2014 20
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 !)
0
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 »
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
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 ?
0
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 ^^
0
Utilisateur anonyme
22 mai 2014 à 10:15
Et merci ça fonctionne enfin :D
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
22 mai 2014 à 10:18
Tu penseras à mettre le sujet en résolu dans ce cas.
0
Utilisateur anonyme
22 mai 2014 à 10:19
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 :)
0
Utilisateur anonyme
22 mai 2014 à 15:03
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 :)
0
Rejoignez-nous