11486 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je viens vers vous car j’aimerais avoir quelques conseils et des explications au sujet de l’ajax.
J’apprends, doucement mais sûrement, à créer des pages internet mais j’ai toujours des soucis avec le javascript. En l’occurrence, je bloque particulièrement sur l’ajax et je ne parviens pas à comprendre ce qui coince, en dépit des tonnes de ressources, de cours et de conseils déjà présent sur le net. Smiley biggol


(Je vous prie de m'excuser pour la longueur mais j'aime autant être exhaustif. Je mets le code dont je parle ici en fin de pavé).

Enfin, passons. Je vous situe un peu le contexte :
Mon projet comporte quatre éléments : une page index.html, une page traitement.php, une page script.js et enfin une table au sein d’une base de donnée SQL.

L’enjeu est d’afficher un formulaire sur la page index.html qui permet d’effectuer une recherche dans la base de données et d’afficher sur cette même page le résultat de la recherche.

Ainsi, la recherche se fait via la page traitement.php qui reçoit les données du formulaire et sélectionne les joueurs qui correspondent au critère via une requête préparée. Une boucle while permet ensuite d’afficher le résultat de la requête.

Mais voilà ! Le résultat de la recherche s’affiche sur la page traitement.php et l’utilisateur est redirigé vers cette page pour consulter le résultat.

Or, j’aimerais que l’utilisateur ne soit pas redirigé vers cette page et qu’au contraire ce soit le résultat de la recherche qui soit injecté dans une div prévue à cet effet, dans la page index.html.
Je vous mets ce que j’ai pu écrire jusqu’à présent, peut-être que quelqu’un saura identifier le problème.

La page HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <!--<link rel="stylesheet" href="style.css">-->
    </head>
    <body>
     
<form action="traitement.php" method="GET" id="formulaire">
  
    <select name="categorie">
        <option value="Attaquant"></option>
        <option value="Defenseur"></option>
        <option value="Gardien"></option>
    </select>
   
    <input type="submit" value="Envoyer" id="envoyer">
</form>

<div id="affichage"></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script type="text/javascript" src="script.js"></script>
    </body>
</html>


La page PHP:

<?php
header('Content-Type: text/html; charset=utf-8');
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
 
if(isset($_GET['categorie']) && !empty($_GET['categorie'])){
$rep = $bdd->prepare('SELECT * FROM joueurs WHERE categorie = ?');
$rep->execute(array($_GET['categorie']));
    while ($donnees = $rep->fetch())
{
    echo $donnees['nom'];
}};
?>


Enfin, il y a la page JS (ici j’utilise jQuery) :

$("#envoyer").click(function(){
  event.preventDefault();

  $.ajax({
     url : 'traitement.php',
     type : 'GET',
     dataType : 'html',
     success : function(reponse, statut){
         $(reponse).appendTo('#div'); 
     },
     error : function(resultat, statut, erreur){
       alert('erreurJS');
     },
     complete : function(resultat, statut){
     }
  }); 
});


Notez que la ligne 2 : « event.preventDefault(); » empêche bien la redirection vers la page traitement.php.
Pour autant, les données ne transitent pas vers la div prévue à cet effet dans ma page index.html.
J'en conclue que c'est la partie contenue dans $.ajax() qui pose problème.

Qu’en pensez-vous ?
Comment pourrais-je modifier ce code pour que la recherche s'effectue comme je l'entends ?

Merci d’avance !
Modifié par redMonkey (19 Sep 2019 - 21:58)
Hello,
Plusieurs erreurs sont à l'origine de ton dysfonctionnement.
1 - tu dois avoir une erreur dans console du style "preventDefault not function on undefined..." car la variable "event" n'existe pas dans ta fonction callback de "click()". Il faut que tu passes en argument de la function une variable "event" :
$("#envoyer").click(function(event){
  event.preventDefault();
  ...
});


2 - ensuite, la manière dont tu fais ton appel ajax, renverra toujours une réponse vide car tu n'envoies pas de paramètre "categorie" dans ta requête. Pour récupérer la valeur d'un champ avec jQuery tu peux faire comme ça :
$('[name="categorie"]').val()

Et pour envoyer des paramètres GET avec $.ajax() tu peux faire comme ça :
$.ajax({
     url : 'traitement.php',
     type : 'GET',
     data: {categorie: $('[name="categorie"]').val()},
     dataType : 'html',
     success : function(reponse, statut){
         $(reponse).appendTo('#div'); 
     },
     error : function(resultat, statut, erreur){
       alert('erreurJS');
     },
     complete : function(resultat, statut){
     }
  }); 


3 - et pour finir, la sélection du container dans lequel tu veux ajouter ta réponse n'est pas bonne... Ce n'est pas
$(reponse).appendTo('#div'); 

mais plutôt
$(reponse).appendTo('#affichage'); 


Voilà, avec ça, tu devrais avoir un truc un peu mieux
Meilleure solution
Salut Mathieu,

Merci d'avoir pris le temps de te pencher là dessus.

Je n'avais pas du tout compris les choses de cette façon concernant le paramètre "data". mais effectivement, c'est logique ! Et la faute sur le nom de la div... j'ai honte Smiley biggrin

Du coup, j'ai corrigé tout ça. Je précise pour la postérité qui consulterait ce sujet à l'avenir que la console m'a tout de même affiché une erreur avec le code PHP tel que je l'ai écris plus haut.

"Error: Syntax error, unrecognized expression: ..."

Pour la correction du code: à la fin de la boucle php, echo envoie des donnes mais pas au bon "format".
Ainsi, puisque j'ai définit le paramètre "dataType: 'html'" dans mon script JS, il faut "enrober" la réponse dans des balises html:
    echo '<p>'.$donnees['nom'].'</p>';


(Edit: Et j'ai également mis une fonction qui attend la disponibilité du DOM au tout début du script JS).

Et là, ça fonctionne nickel !

Enfin quoi qu'il en soit, encore un grand merci ! J'y vois beaucoup plus clair =)

Une dernière chose: est-ce que tu as un site, un livre ou quelques documentations que ce soit à me recommander pour approfondir mes connaissances sur le javascript et jQ ?
J'ai le sentiment d'avoir bloqué sur des choses évidentes. Je crois que ma façon d'apprendre est à revoir ^^
Modifié par redMonkey (19 Sep 2019 - 23:38)
help j ai le meme truc à faire impossible de recup la liste des filmes par genre
Modifié par fleurH2O (17 Jan 2020 - 19:00)
  <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="foot.css">
    <link rel="stylesheet" href="cinema.sql">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <title>SQL</title>
</head>
<body>
    <h1>My Cinema Halima & co</h1>
<nav>
<form action="search.php" method="post">

<div id="Genre"> <label>Genre</label>

<select name="Genre"id="select" onchange="javascript:recherche.submit();">Genre
    <option value="horror">Horror</option>
    <option value="comedi">Comedie</option>
    <option value="romance">Romance</option>
    <option value="thriller">Policier</option>
    <option value="anime">Animés</option>
    <option value="dramatic comedy">dramatic comedy</option>
    <option value="science fiction">science fiction</option>
    <option value="drama">drama</option>
    <option value="documentary">documentary</option>
    <option value="animation">animation</option>
    <option value="comedy">comedy</option>
    <option value="fantasy">fantasy</option>
    <option value="action">action</option>
    <option value="thriller">thriller</option>
    <option value="adventure">adventure</option>
    <option value="various">various</option>
    <option value="historical">historical</option>
    <option value="romance">romance</option>
    <option value="western">western</option>
    <option value="music">music</option>
    <option value="musical">musical</option>
    <option value="war">war</option>
    <option value="detective">detective</option>
    <option value="unknow">unknow</option>
    <option value="spying'">spying</option>
    <option value="historical epic">historical epic</option>
    <option value="biography">biography</option>
    <option value="experimental">experimental</option>
    <option value="short film">short film</option>
    <option value="erotic">erotic</option>
    <option value="karate">karate</option>
    <option value="program">program</option>
    <option value="short film">short film</option>
    <option value="family">family</option>
<form method="post" action="cinema.sql">
                
<input type="submit" value="search" name="search">
</form>  
[
Modifié par fleurH2O (17 Jan 2020 - 19:02)

try
{
$pdo = new PDO('mysql:host=localhost;dbname=cinema;charset=utf8', 'root', '');	
}  
        $activite_selected=$_POST["Genre"];
	$select = "SELECT *  FROM film WHERE Genre = horror,comedy,detective,music,western,erotic ";	
	$sql_array = mysql_query($select);
        $rows = mysql_num_rows($sql_array);

	if(isset($rows))
	{  
	   while($data = mysql_fetch_array($sql_array))			   {
            $selected="";
             if ($data["Genre"]==$activite_selected){
               $selected=" selected=\"selected\"";
               }
	       echo "<option value=\"".$data["horror"]."\"".$selected.">".$data["horror"]."</option>\n";
	   }
	}
							
      ?>
</select>

ou du coup j ai test celui la



      <?php

header('Content-Type: text/html; charset=utf-8');
try
{
    $pdo = new PDO('mysql:host=localhost;dbname=cinema;charset=utf8', 'root', '');	
   
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
 
if(isset($_GET['genre']) && !empty($_GET['genre'])){
$rep = $dpo->prepare('SELECT * FROM film WHERE Genre = horror,comedy,music');
$rep->execute(array($_GET['genre']));
    while ($donnees = $rep->fetch())
{
    echo $donnees['nom'];
}};
?>