Ma requête AJAX de JS vers PHP ne fonctionne pas

Résolu/Fermé
JC_8280 Messages postés 78 Date d'inscription jeudi 19 mars 2020 Statut Membre Dernière intervention 7 février 2021 - Modifié le 11 avril 2020 à 18:53
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 16 avril 2020 à 22:13
Bonjour,

Je débute en programmation et je suis en train de faire mon premier projet et je bloque sur une requête AJAX.

1°) J' ai affiché sur une page web un tableau de ma base de données MySQL, ensuite je veux le filtrer en ne gardant que des éléments déterminés dans un formulaires multicritères html.

J'ai testé la requête du PHP dans la table MySQL, ça marche.

Je pense que le problème se situe dans la requête JS ou bien la réception dans le PHP.

2°) Il faut aussi que j'inverse le résultat de ma requête, car pour l'instant j' efface les éléménts que je veux garder, je n'ai pas encore réfléchi à ce problème.

Merci par avance pour votre aide.

Le formulaire, le JS et le PHP sont dans 3 fichiers différents, mais je pense que cela ne gêne pas.

Le code ci-dessous
Formulaire HTML :

<!--  ******   FORMULAIRE RECHERCHER  ******  -->    
    <form id='idFormRechercher' action="" method="post">  


*
**
***
****
*****
******
*******
********
*********
**********
***********CRITERES de SELECTION***********  <!--  ****** BOUTONS RECHERCHE  ******  -->                             
<div class = "boutonsRecherche">  <!--  ****** BOUTON VALIDER RECHERCHE  ******  -->                 <input id = "idboutonValiderRecherche" class = 'classboutonValiderRecherche'                 type = "submit" value = "VALIDER"> 

CODE JAVA SCRIPT
//BOUTON VALIDER RECHERCHE    // reference www.w3schools.com -> JAVA SCRIPT / JSON PHP
let boutonValiderRecherche = document.getElementById('idboutonValiderRecherche');
boutonValiderRecherche.addEventListener('click',validerRecherche) ;function validerRecherche(){  
  var xmlhttp ="", resultRecherche = "", x ="", idRow ="" ;    xmlhttp = new XMLHttpRequest();   
 xmlhttp.onreadystatechange = function() {    
    if (this.readyState == 4 && this.status == 200) {           
 resultRecherche = JSON.parse(this.responseText);           
 for (x in resultRecherche) {   
             idRow = document.getElementById('x');                idRow.style.display = 'none';          
  }        
 }   
 };
xmlhttp.open("POST", "trouver.php", true);xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");xmlhttp.send();
}

FICHIER PHP

 header("Content-Type: application/json; charset=UTF-8");        
$_POST = json_decode($_POST["x"], false);                
$VR = []; 
 $VR0=$VR1=$VR2=$VR3=$VR4=$VR5=$VR6=$VR7=$VR8=$VR9=$VR10=$VR11=$VR12=        $VR13=$VR14=$VR15=$VR16=$VR17=$VR18=$VR19=$VR20=$VR21=$VR22=$VR23="";                    
$_POST["id"]="";     // à enlever lors des implementations dans recherche.php                                    
$_POST["RefMag"]=""; // à enlever        
$_POST["Caract2"]="";// à enlever 

 function cleanData($dataToClean){                $dataToClean = trim($dataToClean);                $dataToClean = stripslashes($dataToClean);                $dataCleaned = htmlspecialchars($dataToClean);                return $dataCleaned;            }                        $VR0 = cleanData($_POST["id"]);                                              $VR1 = cleanData($_POST["RefMag"]);            $VR2 = cleanData($_POST["familleOutil"]);            $VR3 = cleanData($_POST["SousFamille"]);            $VR4 = cleanData($_POST["Matiere"]);            $VR5 = cleanData($_POST["NbreZ"]);            $VR6 = cleanData($_POST["Dia1"]);            $VR7 = cleanData($_POST["Long1"]);            $VR8 = cleanData($_POST["Dia2"]);            $VR9 = cleanData($_POST["Dia3"]);            $VR10 = cleanData($_POST["LongUtile"]);            $VR11 = cleanData($_POST["LongTotale"]);            $VR12 = cleanData($_POST["Caract1"]);            $VR13 = cleanData($_POST["Caract2"]);            $VR14 = cleanData($_POST["Fournisseur"]);            $VR15 = cleanData($_POST["Ref_Fournisseur"]);            $VR16 = cleanData($_POST["Prix"]);            $VR17 = cleanData($_POST["QteMini"]);            $VR18 = cleanData($_POST["CasEmploi1"]);            $VR19 = cleanData($_POST["CasEmploi2"]);            $VR20 = cleanData($_POST["CasEmploi3"]);            $VR21 = cleanData($_POST["CasEmploi4"]);            $VR22 = cleanData($_POST["CasEmploi5"]);            $VR23 = cleanData($_POST["CasEmploi6"]);                         // colonne de la table            
 $VR = array ("id"=>"$VR0", "REF_MAG"=>"$VR1", "FAMILLE_OUTIL"=>"$VR2",              "SOUS_FAMILLE"=>"$VR3", "MATIERE_OUTIL"=>"$VR4", "NBRE_Z"=>"$VR5",               "DIA_1"=>"$VR6", "LONGUEUR_1"=>"$VR7", "DIA_2"=>"$VR8",                "DIA_3"=>"$VR9", "LONG_UTILE"=>"$VR10", "LONG_TOTALE"=>"$VR11",              "CARACT_1"=>"$VR12", "CARACT_2"=>"$VR13", "FOURNISSEUR"=>"$VR14",              "REF_FOURNISSEUR"=>"$VR15", "PRIX"=>"$VR16", "QTE_MINI"=>"$VR17",               "CAS_EMPLOI_1"=>"$VR18", "CAS_EMPLOI_2"=>"$VR19", "CAS_EMPLOI_3"=>"$VR20",                "CAS_EMPLOI_4"=>"$VR21", "CAS_EMPLOI_5"=>"$VR22", "CAS_EMPLOI_6"=>"$VR23");                                  $concat = "" ;                   foreach($VR as $VRn => $VRn_value){
            if($VRn_value !== ""){
              $concat = $concat. 'AND '.$VRn.' = \''.$VRn_value.'\' ';                          
          };
  }; 
 $condition = ltrim($concat,"AND");
   // echo 'Concat = ' .$concat;             //echo ' et Condition = '.$condition;          /*  *************************************************** *//*        
REQUETE                                       *//*  *************************************************** */   
 $serveur = "localhost";    $login = "root";    $pass = "";   
 try{                         
  $connexion = new PDO("mysql:host=$serveur;dbname=hydro", $login, $pass);              
  $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);          
  $requete = $connexion->query('SELECT id FROM cutting_tools_01
                     WHERE' . $condition );                                                                                       
     $resultat = $requete->fetchAll(PDO::FETCH_ASSOC); 
     echo json_encode($resultat);                         
 }  catch(PDOException $e){  
       echo 'ECHEC  : ' .$e->getMessage();    
}   
      


JC

EDIT : remise en forme partielle du code...
A voir également:

21 réponses

JC_8280 Messages postés 78 Date d'inscription jeudi 19 mars 2020 Statut Membre Dernière intervention 7 février 2021
16 avril 2020 à 18:17
Bonjour Jordane45,
J'ai encore un problème.

En fait, jusqu' à présent j' ai extrait de la table les éléménts que je voulais garder à l'affichage, et mon plan est de soustraire tous les autres de la table html, donc je veux soustraire cette liste d'une 2ème qui serait la liste du tableau complète. J'ai donc fait une deuxième requête de la liste complète, mais la soustraction me pose un problème.
Quelle fonction faut il utiliser car array_diff ne fonctionne pas, je ne comprends pas pourquoi.
Peut être que c'est parce que cene sont pas des arrays, mais des objets...

Peux tu aussi m'expliquer pourquoi tu utilise la variable $datas dans la requête?.

Cordialement.
JC

<?php
header("Content-Type: application/json; charset=UTF-8");

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


//--------------------------------------------------------------------------//
// fonctions diverses...
//--------------------------------------------------------------------------//
function cleanDataPOST($dataToClean=NULL,$defaultValue=""){
	$result = !empty($_POST[$dataToClean]) ? trim($_POST[$dataToClean]) : $defaultValue; 
	$result = stripslashes($result);
	return $result;
}

//--------------------------------------------------------------------------//
//connexion à la bdd
//--------------------------------------------------------------------------//
require_once "cnxbdd.php";


//--------------------------------------------------------------------------//
// Variables ..
//--------------------------------------------------------------------------//
$VR = array();
$resultat = array();    
$VR0 = cleanDataPOST("id");                                  
$VR1 = cleanDataPOST("RefMag");
$VR2 = cleanDataPOST("familleOutil");
$VR3 = cleanDataPOST("SousFamille");
$VR4 = cleanDataPOST("Matiere");
$VR5 = cleanDataPOST("NbreZ");
$VR6 = cleanDataPOST("Dia1");
$VR7 = cleanDataPOST("Long1");
$VR8 = cleanDataPOST("Dia2");
$VR9 = cleanDataPOST("Dia3");
$VR10 = cleanDataPOST("LongUtile");
$VR11 = cleanDataPOST("LongTotale");
$VR12 = cleanDataPOST("Caract1");
$VR13 = cleanDataPOST("Caract2");
$VR14 = cleanDataPOST("Fournisseur");
$VR15 = cleanDataPOST("Ref_Fournisseur");
$VR16 = cleanDataPOST("Prix");
$VR17 = cleanDataPOST("QteMini");
$VR18 = cleanDataPOST("CasEmploi1");
$VR19 = cleanDataPOST("CasEmploi2");
$VR20 = cleanDataPOST("CasEmploi3");
$VR21 = cleanDataPOST("CasEmploi4");
$VR22 = cleanDataPOST("CasEmploi5");
$VR23 = cleanDataPOST("CasEmploi6"); 
	
// colonne de la table
$VR = array ("id"=>$VR0, 
			"REF_MAG"=>$VR1, 
			"FAMILLE_OUTIL"=>$VR2,
			"SOUS_FAMILLE"=>$VR3,
			"MATIERE_OUTIL"=>$VR4, 
			"NBRE_Z"=>$VR5,
			"DIA_1"=>$VR6, 
			"LONGUEUR_1"=>$VR7, 
			"DIA_2"=>$VR8,
			"DIA_3"=>$VR9,
			"LONG_UTILE"=>$VR10,
			"LONG_TOTALE"=>$VR11, 
			"CARACT_1"=>$VR12,
			"CARACT_2"=>$VR13, 
			"FOURNISSEUR"=>$VR14,
			"REF_FOURNISSEUR"=>$VR15, 
			"PRIX"=>$VR16, 
			"QTE_MINI"=>$VR17,
			"CAS_EMPLOI_1"=>$VR18, 
			"CAS_EMPLOI_2"=>$VR19, 
			"CAS_EMPLOI_3"=>$VR20,
			"CAS_EMPLOI_4"=>$VR21, 
			"CAS_EMPLOI_5"=>$VR22, 
			"CAS_EMPLOI_6"=>$VR23
		);
			  
$concat = "" ; 
$datas = array();
foreach($VR as $VRn => $VRn_value){
	if($VRn_value !== ""){
	  $concat = $concat. 'AND '.$VRn. ' = :' .$VRn.' ';  
	  $datas[":" .$VRn] = $VRn_value;	
	};
};
$condition = ltrim($concat,"AND");
    

//--------------------------------------------------------------------------//
//  REQUETE                                       
//--------------------------------------------------------------------------//


$sql = 'SELECT id FROM cutting_tools_01 ';
$fullList = $sql;
$sql .= !empty($condition)? ' WHERE' . $condition : "";

try{             
	$requete1 = $connexion->prepare($sql); 
	$requete1->execute($datas);                                                                    
	$resultat1 = $requete1->fetchAll(PDO::FETCH_ASSOC);
    
    //echo $resultat2;
   
}catch(PDOException $e){
	echo 'ECHEC  : ' .$e->getMessage();
}

try{
    
    $requete2 = $connexion->prepare($fullList); 
	$requete2->execute();                                                                    
	$resultat2 = $requete2->fetchAll(PDO::FETCH_ASSOC);
    
    //echo $resultat2;
   
}catch(PDOException $e){
	echo 'ECHEC  : ' .$e->getMessage();
}

//--------------------------------------------------------------------------//
//calcul des éléments a retirer du tableau
//--------------------------------------------------------------------------//
$resultat=array_diff_assoc($resultat2,$resultat1);
// print_r ($resultat);
//   ,'resultat1'=>$resultat1,'resultat2'=>$resultat2
//--------------------------------------------------------------------------//
//on renvoi la réponse au script ajax au format json
//--------------------------------------------------------------------------//

//echo $result;
echo json_encode(array('resultat'=>$resultat,'sql'=>$sql,'datas'=>$datas));
            
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
16 avril 2020 à 22:13
Bonjour,
Je n'avais pas vu ta question... en effet, lorsqu'elle est marquée comme "résolue" je ne la surveille plus.

Quoi qu'il en soit, il est préférable, lorsqu'il s'agit d'une nouvelle question.. d'ouvrir une nouvelle discussion.

Cela permet plus facilement de retrouver les discussions dans le forum en cas de recherche.
Jet 'invite donc à ouvrir une nouvelle discussion pour ce nouveau souci.

Pense au passage à expliquer en détail ta "logique".
Je ne vois pas pourquoi tu veux soustraire ... alors qu'il serait plus simple de faire une requête "inverse".
Au lieu de chercher les lignes qui correspondent aux criètres.. tu ne prends que les lignes qui ne "correspondent" pas aux critères
0