Je suis en train de créé le menu de mon site web, dans celui ci j'y ait intégrer une bar de recherche.
Je souhaiterais que ce système de recherche soit asynchrone.
J'ai 3 fichiers :
- nav.php avec mon menu est ma bar de recherche.
- recherche.js avec mon système d'asynchrone.
- systeme-recherche.php avec le système de recherche (il va parcourir ma bdd et y retourne les résultats.
nav.php
<div class="search">
<div class="searchBar">
<form method="POST" id="searchForm">
<input type="search" id="searchInput" name="recherche" placeholder="Rechercher un Film, une Série..." />
<button type="submit" name="rechercher"><i class="fas fa-search"></i></button>
</form>
</div>
<div class="icon iconRegular iconSearch" id="iconSearch"></div>
</div>
<div class="searchBody">
<h1>Votre recherche</h1>
<div class="box littleSearchBox" id="littleSearchBox">
<!-- Je veux le résultât de ma recherche ici... -->
</div>
</div>
<script src="../../js/recherche/recherche.js"></script>
recherche.js
document.getElementById("searchForm").addEventListener("submit", function(e) {
e.preventDefault();
var searchInput = document.getElementById("searchInput").value;
var searchInput = searchInput.replace(' ', '+');
var xhr = new XMLHttpRequest();
xhr.oonreadystatechange = function() {
console.log(this);
if (this.readyState == 4 && this.status == 200) {
console.log(this.response);
} else if (this.readyState == 4) {
alert("Une erreur est survenue... (javascript)\nVeuillez réessayer.");
}
};
console.log(searchInput);
xhr.open("GET", "../../../php/recherche/systeme-recherche.php?query="+searchInput, true);
xhr.send();
return false;
})
systeme-recherche.php
<?php
$success = 0;
$msg = "Une erreur est survenue... (php)";
$redirect_log = 0;
if(file_exists("./main.php")) {
require_once("./main.php");
} else if(file_exists("../main.php")) {
require_once("../main.php");
} else if(file_exists("../../main.php")) {
require_once("../../main.php");
}
if(isset($_GET['query']) AND !empty($_GET['query'])) {
$success = 0;
$q = strip_tags(trim(htmlspecialchars($_GET['query'])));
$queryInfos = $dbco->query('SELECT * FROM article WHERE titre LIKE "%'.$q.'%" ORDER BY id DESC');
if($queryInfos->rowCount() == 0) {
$queryInfos = $dbco->query('SELECT * FROM article WHERE CONCAT(titre, date_de_sortie) LIKE "%'.$q.'%" ORDER BY id DESC');
$success = 1;
$msg = $q." trouver.";
}
} else {
$success = 0;
$msg = "Aucune entré valide !";
}
$res = ["success" => $success, "msg" => $msg];
echo json_encode($res);
?>
<div class="container littleSearchContnaire">
<?php if(isset($queryInfos) AND $queryInfos->rowCount() > 0) {
while($f = $queryInfos->fetch()) {?>
<div class="box littleSearchBox">
<div class="imgBx">
<img src="<?= $f['affiche'] ?>" alt="Affiche de l'article : <?= $f['titre'] ?>">
</div>
<div class="title">
<a href="../../article/<?= $f['url'] ?>">
<h3 id="title" title="Aller voir l'article"><?= $f['titre'] ?></h3>
</a>
</div>
</div>
<?php }} ?>
</div>
Au niveaux de la recherche, tous fonctionne.
le problème, c'est que je ne sais pas comment faire pour intégrer le fichier "systeme-recherche.php" dans le 'nav.php" pour afficher le résultât de la recherche et tous cela de manière asynchrone (sans que l'utilisateur ne recharge la page).
Bonjour je n'ai pas bien lu tout le code mais s'il s'agit simplement du retour des résultats je vous conseille de récupérer un fetchAll() avec le pdo en fetch_assoc en php puis de faire un echo json_encode de ce fait vous récupérer un json que vous pourrez gérer en js pour l'affichage.
D'ailleurs purement en php je vous conseille de changer votre requête en requête préparer
Si j'ai bien compris ce que vous m'avez conseillez pour mon "systeme-recherche.php" :
if(isset($_GET['query']) AND !empty($_GET['query'])) {
$q = strip_tags(trim(htmlspecialchars($_GET['query'])));
$table1Infos = $dbco->prepare('SELECT * FROM table1 WHERE titre LIKE ? ORDER BY id DESC');
$table1Infos->execute(["%$q%"]);
if($table1Infos->rowCount() == 0) {
$table1Infos = $dbco->prepare('SELECT * FROM table1 WHERE CONCAT(titre, date_de_sortie) LIKE ? ORDER BY id DESC');
$table1Infos->execute(["%$q%"]);
}
}
$resultTable1 = $table1Infos->fetchAll();
// print_r($resultTable1 ); echo json_encode($resultTable1);
Par contre j'ai pas compris pour le fetch_assoc.
Pour le js :
document.getElementById("searchForm").addEventListener("submit", function(e) {
e.preventDefault();
var searchInput = document.getElementById("searchInput").value;
var searchInput = searchInput.replace(' ', '+');
var xhr = new XMLHttpRequest();
xhr.onnreadystatechange = function() {
console.log(this);
if (this.readyState == 4 && this.status == 200) {
console.log(this.response);
// var reponse = JSON.parse(xhr.responseText);
// alert(reponse.id);
// console.log(reponse);
} else if (this.readyState == 4) {
alert("Une erreur est survenue... (javascript)\nVeuillez réessayer.");
}
};
console.log(searchInput);
xhr.open("GET", "../../../php/recherche/systeme-recherche.php?query="+searchInput, true);
xhr.responseType = 'json';
xhr.send();
return false;
})
Maintenant que j'ai le json dans la console, comment je fait pour transférer toutes les donnée en php ?
- Edité par </Normandie Dèv> 20 novembre 2021 à 23:42:11
Le fetch assoc se fait de la sorte si vous n'avez pas de soucis de namespace...
sur le fetchall vous faites
tata->fetchAll(PDO::FETCH_ASSOC)
car fetchall retourne un truc du style
0=>
0=>tata
id=> tata
1=> tititi
name =>tititi
fetch assoc va supprimer le 0 => tatata et le 1=>titi car on a deja l'info avec name et id
ensuite pour le json_encode il faut le recuperer en js pour le coup vu que vous utiliser ajax il faut récupérer le retour d'ajax qui sera sa ensuite pour bah vous avez un json en js sur lequel vous pourrez faire des boucles ect pour l'affichage dans votre html
ensuite pour le json_encode il faut le recuperer en js pour le coup vu que vous utiliser ajax il faut récupérer le retour d'ajax qui sera sa ensuite pour bah vous avez un json en js sur lequel vous pourrez faire des boucles ect pour l'affichage dans votre html
C'est bien sa pour le fetchAssoc, ensuite pour l'exemple voici j'ai fais quelque chose de vite fait que tu pourras tester mais il y a à modifier surtout au niveau de la requête js.
Donc j'ai deux pages une qui retournera les informations de ta base une qui les affiches .
J'ai créer un tableau qui va représenter le retour d'un fetchAll(PDO::FETCH_ASSOC) voici
Le gros de l'idée est là après ca reste à adapter.
Il faut vraiment qu'openclassroom corrige - j'ai fait des erreurs dans le js pour pouvoir envoyer le message il faudra les enlever - j'ai doubler la lettre du début des instructions
Voici ce que j'ai fait, par contre, j'ai ces erreur ci :
VM132:1 Uncaught SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at XMLHttpRequest.ShowResponse ((index):92)
at HTMLButtonElement.document.querySelector.onclick ((index):88)
ShowResponse @ (index):92
document.querySelector.onclick @ (index):88
VM133:1 Uncaught SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at XMLHttpRequest.ShowResponse ((index):92)
ShowResponse @ (index):92
XMLHttpRequest.send (asynchrone)
document.querySelector.onclick @ (index):90
comme indiqué ca vient du json.parse qui n'a pas reçu le bon type de données ,au lieu de faire le json parse fait directement un console.log de la reponse du xmlhttrequest voir si ca contient bien quelque chose.
VM2884:1 Uncaught SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at XMLHttpRequest.ShowResponse (recherche.js:35)
at HTMLButtonElement.document.querySelector.onclick (recherche.js:30)
et
VM2885:1 Uncaught SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at XMLHttpRequest.ShowResponse (recherche.js:35)
ShowResponse @ recherche.js:35
XMLHttpRequest.send (asynchrone)
document.querySelector.onclick @ recherche.js:32
et mon concole.log me renvoie deux fois ceci :
[{"title":"Titre de l'article 1","description":"Description de l'article 1"},{"title":"Titre de l'article 2","description":"Description de l'article 2"}]
c'est ce que j'avais aussi, pour cela que j'ai dis que c'est a adapter essayez de bien lire la doc de xmlhttprequest je ne l'ai fait que rapidement pour l'exemple
Cependant, je souhaiterais pour plus d'ergonomie et de facilité pour mes utilisateur que à chaque fois qu'il entre du texte, le formulaire d'envoie automatiquement.
Ex:
Utilisateur tape "A" => système renvoie les recherche de "A"
Utilisateur tape "B" => système renvoie les recherche de "B"
...
- Edité par </Normandie Dèv> 28 novembre 2021 à 18:18:44
dans ce cas il va te valoir utiliser l'event on input en javascript qui va recuperer la saisie l'envoyer en post a ta page php qui elle va faire ses manips et te rencoyer un json pareil ce qu'on a utilisé pour le premier soucis.
Si tout est ok n'oublies pas de mettre le sujet comme résolu ravis d'avoir ou t'aider
yasakani no magatama
[PHP & Js] systeme de recheche
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
</Normandie Dèv> - Développeur Web par passion !
yasakani no magatama
</Normandie Dèv> - Développeur Web par passion !
yasakani no magatama
</Normandie Dèv> - Développeur Web par passion !
yasakani no magatama
</Normandie Dèv> - Développeur Web par passion !
yasakani no magatama
</Normandie Dèv> - Développeur Web par passion !
yasakani no magatama
</Normandie Dèv> - Développeur Web par passion !
yasakani no magatama
</Normandie Dèv> - Développeur Web par passion !
yasakani no magatama
</Normandie Dèv> - Développeur Web par passion !
yasakani no magatama