[PHP/AJAX] Recuperer des données

dmo95

Membre actif
24 Mai 2007
584
14
Bonjour,

Je souhaite récupérer des données stockées dans ma BD, par l'intermédiaire d'AJAX, en utilisant jQuery.

J'arrive parfaitement à récupérer mes données par l'intermédiaire d'AJAX, qui appel dans un premier temps un script PHP. Le script PHP traite la requête et initialise un tableau. A la fin de mon script PHP, j'utilise la fonction :

echo json_encode($myArray);

Ainsi je peux travailler, dans le retour de mon appel de fonction, en JavaScript.

Mon problème arrive maintenant, ma BD stock un bon nombre d'informations, et notamment du texte (en langue Française !!). Or la fonction json_encode, encode le tout en UTF-8.

Par conséquent je n'arrive pas correctement à traiter les champs ou il y a des charactères typiquement français, enfin tout du moins pas capable d'être encoder en UTF-8.

Quelle solution y a-t-il à mon problème ?

PS : Je pense que je peux également utiliser comme type de données de retour, le format XML, mais je ne sais pas vraiment comment faire ?!? Car je ne souhaite pas enregistrer de fichier à chaque appel de fonciton. Le type JSON me semble vraiment approprié à mon utilisation ! Et tellement simple à manipuler ;)

PS2 : En plus je viens de constater que la fonction json_encode() est une nouvelle fonctionnalité de PHP5. Alors que la plupart des hébergeurs sont encore sous PHP4... Une solution alternative peut-être ?
 

p4bl0

Membre expert
Club MacG
12 Juillet 2004
4 772
423
32
$PWD
p4bl0.net
Bonjour,

Je souhaite récupérer des données stockées dans ma BD, par l'intermédiaire d'AJAX, en utilisant jQuery.

J'arrive parfaitement à récupérer mes données par l'intermédiaire d'AJAX, qui appel dans un premier temps un script PHP. Le script PHP traite la requête et initialise un tableau. A la fin de mon script PHP, j'utilise la fonction :

echo json_encode($myArray);

Ainsi je peux travailler, dans le retour de mon appel de fonction, en JavaScript.

Mon problème arrive maintenant, ma BD stock un bon nombre d'informations, et notamment du texte (en langue Française !!). Or la fonction json_encode, encode le tout en UTF-8.

Par conséquent je n'arrive pas correctement à traiter les champs ou il y a des charactères typiquement français, enfin tout du moins pas capable d'être encoder en UTF-8.

Quelle solution y a-t-il à mon problème ?

PS : Je pense que je peux également utiliser comme type de données de retour, le format XML, mais je ne sais pas vraiment comment faire ?!? Car je ne souhaite pas enregistrer de fichier à chaque appel de fonciton. Le type JSON me semble vraiment approprié à mon utilisation ! Et tellement simple à manipuler ;)

PS2 : En plus je viens de constater que la fonction json_encode() est une nouvelle fonctionnalité de PHP5. Alors que la plupart des hébergeurs sont encore sous PHP4... Une solution alternative peut-être ?
Le UTF-8 est ce qu'il y a de plus universel, tout les caractères existant de la langue française y sont parfaitement bien représentés ;).

Tu devrais d'ailleurs encodé tes pages en UTF-8 et la base de données aussi comme ça tu n'a plus de problème.

Sinon c'est dommage tu perds vraiment en "pas-se-prendre-la-tête" mais essaye
Bloc de code:
echo utf8_decode(json_encode($yourArray));
 

p4bl0

Membre expert
Club MacG
12 Juillet 2004
4 772
423
32
$PWD
p4bl0.net
Le UTF-8 est ce qu'il y a de plus universel, tout les caractères existant de la langue française y sont parfaitement bien représentés ;).

Tu devrais d'ailleurs encodé tes pages en UTF-8 et la base de données aussi comme ça tu n'a plus de problème.

Sinon c'est dommage tu perds vraiment en "pas-se-prendre-la-tête" mais essaye
Bloc de code:
echo utf8_decode(json_encode($yourArray));
J'avais pas vu les PS.

Oui en JavaScript le JSON est carrément plus coule que du XML :).

Pour les hébergeur PHP4 (mais ça se fait de plus en plus rare), j'avais fait une classe exprès pour transformer un array en JSON, mais c'est bien moins rapide que la fonction intégré à PHP. http://pastie.org/pastes/266465

EDIT: houla le pastie est vieux et il manque un bout au début maintenant -_-' (enfin pas vraiment dans la source de la page il est là mais pastie fais du caca avec les > et < du coup mon browser l'affiche pas, j'espère que le tiens l'affichera :)).
 

dmo95

Membre actif
24 Mai 2007
584
14
Ok donc c'est déjà une bonne nouvelle !!

Alors je ne vois pas, d'ou provient mon problème. Par exemple, je demande les informations d'un article ("Très belle veste..."), dans ma fonction de retour, je fait un :

alert(data.information);

Le alert m'affiche "Tr" !! :eek:. Je viens de consulter la doc de json_encode() et effectivement cela ne fonctionne qu'avec les chaîne encodée en UTF-8. Je vais encapsuler le tout avec ta fonction je vais voir ce que cela me donne !!

Toujours le premier à me répondre !!! Tu gères ^^, je risque de solliciter encore ton savoir car je suis pas très callé et j'ai devant moi un petit projet assez conséquent :p
 

p4bl0

Membre expert
Club MacG
12 Juillet 2004
4 772
423
32
$PWD
p4bl0.net
Ok donc c'est déjà une bonne nouvelle !!

Alors je ne vois pas, d'ou provient mon problème. Par exemple, je demande les informations d'un article ("Très belle veste..."), dans ma fonction de retour, je fait un :

alert(data.information);

Le alert m'affiche "Tr" !! :eek:. Je viens de consulter la doc de json_encode() et effectivement cela ne fonctionne qu'avec les chaîne encodée en UTF-8. Je vais encapsuler le tout avec ta fonction je vais voir ce que cela me donne !!

dans ce cas essaye plutôt
Bloc de code:
echo json_encode(utf8_encode($arr));
ou même
Bloc de code:
echo utf8_decode(json_encode(utf8_encode($arr)));
mais voilà quoi ^^.


Pour le reste, je triche, je suis étudiant et là je suis en train de travailler tu vois :D
 

dmo95

Membre actif
24 Mai 2007
584
14
Me revoilà dans mon poste initial, l'intitulé principal correspond encore à peu près... mais !

Mon problème est un "ajaxo-javascript" ^^ Non je blague, en fait j'ajoute des éléments à ma page, à l'aide de JavaScript (notamment le superbe FrameWork jQuery), et ensuite je souhaite de nouveau récupérer les éléments venant d'être ajoutés. Alors qu'il ne sont pas dans le document puisque la page n'a pas été raffraichie...

Je voulais savoir si cela était possible en JavaScript ?
 

p4bl0

Membre expert
Club MacG
12 Juillet 2004
4 772
423
32
$PWD
p4bl0.net
Me revoilà dans mon poste initial, l'intitulé principal correspond encore à peu près... mais !

Mon problème est un "ajaxo-javascript" ^^ Non je blague, en fait j'ajoute des éléments à ma page, à l'aide de JavaScript (notamment le superbe FrameWork jQuery), et ensuite je souhaite de nouveau récupérer les éléments venant d'être ajoutés. Alors qu'il ne sont pas dans le document puisque la page n'a pas été raffraichie...

Je voulais savoir si cela était possible en JavaScript ?
Si tu ajoute des éléments avec jQuery, ils sont dans le DOM donc tu peux les récupérer avec jQuery aussi.

Par exemple
Bloc de code:
$('#truc').append('<div id="machin">Hello!</div>');
Après tu peux très bien faire
Bloc de code:
$('#machin');

à moins que je n'ai pas compris ta question non ? :nailbiting:
Qu'entends tu par "et ensuite je souhaite de nouveau récupérer les éléments venant d'être ajoutés" ?
 
  • J’aime
Réactions: dmo95

dmo95

Membre actif
24 Mai 2007
584
14
C'est exactement ça ma quéstion, mais visiblement cela ne fonctionne pas correctement chez moi...

Je vais insister mais peut-être que l'ajout ne se fait pas instantanément et que je ne peux récupérer $('#machin') qu'une fois le code/fonction complètement exécuté ?

Par ailleurs, je souhaiterais accéder à une variable lors de ma fonction de retour, passée en paramètre de la fonction initiale :

Bloc de code:
function loadArticle(scriptUrl, idArticle, idMarque){
        
    //var xmlDocument = [create xml document];
    $.ajax({
        type : "POST",
         url: scriptUrl,
        dataType: 'json',
        data : "id="+idArticle,
        beforeSend: panelEmpty(idMarque),
          success: function(data){ [B]
//J'ai tenté de le passé dans la signature mais ca ne marche pas[/B]
              
              alert(data.url_pic);
              
              //$(".panel").html(data);
              
          /*    $(".panel").append("<div id=\"fiche"+data.id+"\"><h3 id=\"titre"+data.id+"\"></h3><div id=\"pic"+data.id+"\"><img src=\""+data.url_pic+"\" alt=\"\" /></div></div>");
              
              $("#pic"+data.id).after("<div id=\"description"+data.id+"\"><span class=\"titleCat\">Déscription</span><br /><p id=\"info"+data.id+"\"></p><span class=\"titleCat\">Taille</span><br /><span class=\"titleCat\">Prix</span><br /></div>");*/    
              
              //Ajout du contenu dans les elements
              $(".marquep").html(data.marque);
              $(".modelp").html(data.model);
              $(".picp").html("<img src=\""+data.url_pic+"\" alt=\"\" />");
              $(".infop").html(data.info);
              
              [B]//Paramètre idMarque dont je veux accéder dans la fonction de retour
              //setTimeout('$(".panel"+idMarque).fadeOut("slow");', 1000);[/B]

              setTimeout('$(".fichep").fadeIn("fast");', 200);
        }
    });
}
Merci à toi ;)

PS : Tu as l'air vraiment calé, donc je me suis dispenser de détailler le code ^^
 

p4bl0

Membre expert
Club MacG
12 Juillet 2004
4 772
423
32
$PWD
p4bl0.net
C'est exactement ça ma quéstion, mais visiblement cela ne fonctionne pas correctement chez moi...

Je vais insister mais peut-être que l'ajout ne se fait pas instantanément et que je ne peux récupérer $('#machin') qu'une fois le code/fonction complètement exécuté ?

Par ailleurs, je souhaiterais accéder à une variable lors de ma fonction de retour, passée en paramètre de la fonction initiale :

Bloc de code:
function loadArticle(scriptUrl, idArticle, idMarque){
        
    //var xmlDocument = [create xml document];
    $.ajax({
        type : "POST",
         url: scriptUrl,
        dataType: 'json',
        data : "id="+idArticle,
        beforeSend: panelEmpty(idMarque),
          success: function(data){ [B]
//J'ai tenté de le passé dans la signature mais ca ne marche pas[/B]
              
              alert(data.url_pic);
              
              //$(".panel").html(data);
              
          /*    $(".panel").append("<div id=\"fiche"+data.id+"\"><h3 id=\"titre"+data.id+"\"></h3><div id=\"pic"+data.id+"\"><img src=\""+data.url_pic+"\" alt=\"\" /></div></div>");
              
              $("#pic"+data.id).after("<div id=\"description"+data.id+"\"><span class=\"titleCat\">Déscription</span><br /><p id=\"info"+data.id+"\"></p><span class=\"titleCat\">Taille</span><br /><span class=\"titleCat\">Prix</span><br /></div>");*/    
              
              //Ajout du contenu dans les elements
              $(".marquep").html(data.marque);
              $(".modelp").html(data.model);
              $(".picp").html("<img src=\""+data.url_pic+"\" alt=\"\" />");
              $(".infop").html(data.info);
              
              [B]//Paramètre idMarque dont je veux accéder dans la fonction de retour
              //setTimeout('$(".panel"+idMarque).fadeOut("slow");', 1000);[/B]

              setTimeout('$(".fichep").fadeIn("fast");', 200);
        }
    });
}
Merci à toi ;)

PS : Tu as l'air vraiment calé, donc je me suis dispenser de détailler le code ^^
je suis pas spécialement calé je sais juste utiliser Google et les documentation :p

En l'occurence la doc de jQurey (bienfoutue quand le site est pas down...) :
Bloc de code:
function (data, textStatus) {
  // data could be xmlDoc, jsonObj, html, text, etc...
  this; // the options for this ajax request
}

Dons si dans tes options (au même niveau que type, data, dataType, url... au passage tu devrait définir un error: au cas où si c'est pas prévu !) tu ajoutes un truc genre myData: { brand: idMarque } après tu dois pouvoir accéder à idMarque via this.myData.brand :)

Faut tester si ça marche mais à priori c'est comme ça qu'il faut faire.


Pour le récupérage de l'élément ajouté, oui ça peut prendre du temps l'ajout dans le DOM (la manipulation de xml c'pas bateau). Mais en général tu as des fonctions de callback dans jQuery qui sont executer une fois l'opération finite.
Par exemple si tu ajoute avec
Bloc de code:
$('#truc').load('/machin.php?bidule=foobar', { données: éventuelles });
Ben fais comme ça :
Bloc de code:
$('#truc').load('/machin.php?bidule=foobar', { données: éventuelles }, function(){
  // ton code qui accède aux éléments.
});



Enfin bref, toutes les infos sont là : http://docs.jquery.com/Ajax
 

dmo95

Membre actif
24 Mai 2007
584
14
Oui oui merci pour la doc, mais je l'ai consulter ainsi que celles de ces concurrents avant de me lancer. C'est d'ailleurs sur ce point principal sur lequel je me suis fixé dans le choix de mon framework.

Je vais tester, tous ce que tu as ajouté, merci encore.

PS : Je te contacté en MP, si éventuellement tu serais d'accord cela m'éviterais pas mal de POST inutile aux yeux des autres... quoi que jQuery est bien présent !! :p