Moteur de recherche en php et concaténation requête SQL
Résolu
informatique790
Messages postés
9
Statut
Membre
-
jordane45 Messages postés 40050 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 40050 Date d'inscription Statut Modérateur Dernière intervention -
Salut à tous,
J'essaie de faire un moteur de recherche pour mon site mais j'ai une erreur dans mon code que je n'ai pas su résoudre :
Apparemment l'erreur se trouve à la ligne 40 qui me dit que la variable "$sql" n'est pas défini pourtant je l'ai bien déclaré plus haut...
Quel peut être le problème à votre avis ?
Et est-ce cette façon de concaténer les requêtes est juste ?
PS : je débute à pein en PHP alors soyez indulgent
J'essaie de faire un moteur de recherche pour mon site mais j'ai une erreur dans mon code que je n'ai pas su résoudre :
<?php
$bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
//$articles = $bdd->query('SELECT nomDomaine FROM domaine ORDER BY id DESC');
if(isset($_GET['q']) AND !empty($GET['q'])){
//$q = htmlspecialchars($GET['q']);
//$articles = $bdd->query('SELECT * FROM domaine WHERE keywords LIKE "%'.$q.'%"ORDER BY id DESC');
$q = $_GET['q'];
$s = explode(" ", $q);
$sql = $bdd->query('SELECT * FROM domaine');
$i = 0;
foreach($s as $mot){
if(strlen($mot) > 3){
if($i==0){
$sql.=(' WHERE ');
}
else{
$sql.('" OR ');
}
$sql.=('keywords LIKE "%'.$mot.'%"');
$i++;
}
}
}
?>
<form method="GET">
<input type="search" name="q" placeholder="Recherche..."/>
<input type="submit" value="valider"/>
</form>
<ul>
<?php while($a = $sql->fetch()) { ?>
<li><?= $a['nomDomaine'] ?></li>
<?php }?>
</ul>
Apparemment l'erreur se trouve à la ligne 40 qui me dit que la variable "$sql" n'est pas défini pourtant je l'ai bien déclaré plus haut...
Quel peut être le problème à votre avis ?
Et est-ce cette façon de concaténer les requêtes est juste ?
PS : je débute à pein en PHP alors soyez indulgent
A voir également:
- Moteur de recherche en php et concaténation requête SQL
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Google moteur de recherche page d'accueil - Guide
- Recherche de pairs utorrent ✓ - Forum Téléchargement
- Copernic moteur de recherche - Télécharger - Utilitaires
- Pourquoi mon moteur de recherche change tout seul ✓ - Forum Virus
3 réponses
Bonjour,
Tu fais le QUERY ..; AVANT d'avoir construit ton WHERE...
Essaye ça :
edit: correction du $GET en $_GET
Cordialement,
Jordane
Tu fais le QUERY ..; AVANT d'avoir construit ton WHERE...
Essaye ça :
<?php
//activation des erreurs php
error_reporting(E_ALL);
ini_set('display-errors','on');
//connexion à la bdd en activant les erreurs PDO
try{
$bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
// Activation des erreurs PDO
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e){
echo "Erreur : ".$e->getMessage();
}
//récupération PROPRE des variables AVANT de les utiliser
$q = !empty($_GET['q']) ? $_GET['q'] : NULL;
if($q){
$s = explode(" ", $q);
$sql = 'SELECT * FROM domaine ';
$i = 0;
foreach($s as $mot){
if(strlen($mot) > 3){
if($i==0){
$sql.=(' WHERE ');
}
else{
$sql.('" OR ');
}
$sql.=('keywords LIKE "%'.$mot.'%"');
$i++;
}
}
//execution "propre" d'une requête
try{
$result = $bdd->query($sql);
}catch(Exception $e){
echo "Erreur dans la requête :" .$sql ." <br>".$e->getMessage();
}
}
?>
<form method="GET">
<input type="search" name="q" placeholder="Recherche..."/>
<input type="submit" value="valider"/>
</form>
<ul>
<?php
while($a = $result->fetch()) {
echo "<li>" .$a['nomDomaine'] ."</li>";
}?>
</ul>
edit: correction du $GET en $_GET
Cordialement,
Jordane
Ou une autre version utilisant un JOIN et un ARRAY temporaire
edit: correction du $GET en $_GET
Cordialement,
Jordane
<?php
//activation des erreurs php
error_reporting(E_ALL);
ini_set('display-errors','on');
//connexion à la bdd en activant les erreurs PDO
try{
$bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
// Activation des erreurs PDO
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e){
echo "Erreur : ".$e->getMessage();
}
//récupération PROPRE des variables AVANT de les utiliser
$q = !empty($_GET['q']) ? $_GET['q'] : NULL;
$strWhere ="";
if($q){
$s = explode(" ", $q);
if(count($s)>0){
$array_tmp = array();
foreach($s as $word){
$array_tmp[] = " keywords LIKE '%".$word."%'";
}
$strWhere = " WHERE " . join(' OR ',$array_tmp) ;
}
$sql = 'SELECT * FROM domaine strWhere';
//execution "propre" d'une requête
try{
$result = $bdd->query($sql);
}catch(Exception $e){
echo "Erreur dans la requête :" .$sql ." <br>".$e->getMessage();
}
}
?>
<form method="GET">
<input type="search" name="q" placeholder="Recherche..."/>
<input type="submit" value="valider"/>
</form>
<ul>
<?php
if(!empty($result)){
while($a = $result->fetch()) {
echo "<li>" .$a['nomDomaine'] ."</li>";
}
}
?>
</ul>
edit: correction du $GET en $_GET
Cordialement,
Jordane
En fait ... pour récupérer une variable GET .. c'est $_GET qu'il faut utiliser ( et non $GET ) que j'avais mal écrit....
Mais bon..
On va passer en ton code en $_POST.
Ensuite, on va ajouter l'action dans le FORM.
Et on va ajouter un peu de débugage.
Essaye ça :
Mais bon..
On va passer en ton code en $_POST.
Ensuite, on va ajouter l'action dans le FORM.
Et on va ajouter un peu de débugage.
Essaye ça :
<?php
//activation des erreurs php
error_reporting(E_ALL);
ini_set('display-errors','on');
//connexion à la bdd en activant les erreurs PDO
try{
$bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
// Activation des erreurs PDO
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (Exception $e){
echo "Erreur : ".$e->getMessage();
}
print_r($_POST);//le temps des tests
//récupération PROPRE des variables AVANT de les utiliser
$q = !empty($_POST['q']) ? $_POST['q'] : NULL;
print_r($q);//le temps des tests
if($q){
$s = explode(" ", $q);
print_r($s); //le temps des tests
$sql = ('SELECT * FROM domaine ');
$i = 0;
foreach($s as $mot){
if(strlen($mot) > 3){
if($i==0){
$sql.=(' WHERE ');
}
else{
$sql.('" OR ');
}
$sql.=('keywords LIKE "%'.$mot.'%"');
$i++;
}
}
//execution "propre" d'une requête
try{
echo $sql; //le temps des tests
$result = $bdd->query($sql);
}catch(Exception $e){
echo "Erreur dans la requête :" .$sql ." <br>".$e->getMessage();
}
}
?>
<form method="GET" action="">
<input type="search" name="q" placeholder="Recherche..."/>
<input type="submit" value="valider"/>
</form>
<ul>
<?php
if(!empty($result)){
while($a = $result->fetch()) {
echo "<li>" .$a['nomDomaine'] ."</li>";
}
}
?>
</ul>
j'ai essayé ce code mais maintenant j'ai l'erreur suivante :
Notice: Undefined variable: result in C:\Program Files (x86)\EasyPHP-12.1\www\ccm.php on line 56
Fatal error: Call to a member function fetch() on a non-object in C:\Program Files (x86)\EasyPHP-12.1\www\ccm.php on line 56
<?php //activation des erreurs php error_reporting(E_ALL); ini_set('display-errors','on'); //connexion à la bdd en activant les erreurs PDO try{ $bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root',''); // Activation des erreurs PDO $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch (Exception $e){ echo "Erreur : ".$e->getMessage(); } //récupération PROPRE des variables AVANT de les utiliser $q = !empty($GET['q']) ? $GET['q'] : NULL; if($q){ $s = explode(" ", $q); $sql = ('SELECT * FROM domaine '); $i = 0; foreach($s as $mot){ if(strlen($mot) > 3){ if($i==0){ $sql.=(' WHERE '); } else{ $sql.('" OR '); } $sql.=('keywords LIKE "%'.$mot.'%"'); $i++; } } //execution "propre" d'une requête try{ $result = $bdd->query($sql); }catch(Exception $e){ echo "Erreur dans la requête :" .$sql ." <br>".$e->getMessage(); } } ?> <form method="GET"> <input type="search" name="q" placeholder="Recherche..."/> <input type="submit" value="valider"/> </form> <ul> <?php while($a = $result->fetch()) { echo "<li>" .$a['nomDomaine'] ."</li>"; }?> </ul>Pour remédier à ça essaye :
<ul> <?php if(!empty($result)){ while($a = $result->fetch()) { echo "<li>" .$a['nomDomaine'] ."</li>"; } } ?> </ul>