Moteur de recherche en php et concaténation requête SQL
Résolu
informatique790
Messages postés
9
Statut
Membre
-
jordane45 Messages postés 30651 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 30651 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
- Copernic moteur de recherche - Télécharger - Navigateurs
- Google moteur de recherche page d'accueil - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Le fichier pdf à télécharger est disponible avec le même nom sur le site de bell canada. mais vous ne le trouverez pas directement avec un moteur de recherche… quelle est l’url de ce fichier pdf sur le site web de bell canada ? - Forum Réseaux sociaux
- Copiez la ligne qui indique aux moteurs de recherche de ne pas référencer la page ✓ - Forum Référencement
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>