Bonjour,

Je souhaite mettre en place une recherche de mot clé dans plusieurs colonne de ma table.
La requête fonctionne bien, mais une fois que le premier élément de mon tableau fait il me lance une erreur de syntaxe SQL.

Voici le code

$query = "SELECT * FROM dbproduct";
        $params = [];

        if(!empty($_GET['field'])):
            $param = ['name', 'address', 'city'];
            foreach($param as $value):
            $query .= " WHERE {$value} LIKE :{$value}";
            $params[$value] = '%' . $_GET['field'] . '%';
            $req = $this->bdd->prepare($query);
            $req->execute($params);
            $datasearch = $req->fetchAll();

            var_dump($query, $params, $datasearch);

            endforeach;
        endif;

Le var_dump me renvoie les bonnes infos mais uniquement sur la première boucle. Dès qu'il entame la seconde, erreur de syntaxe.

Merci par avance pour votre aide.

6 réponses


Lartak
Réponse acceptée

Bonjour.
Tu as l'erreur, car tu ne peux pas avoir l'instruction WHERE qu'une seule fois, par conséquent il te faut donc par exemple remplacer par :

$query .= ' WHERE';
foreach($param as $k => $value):
    $query .= " {$value} LIKE :{$value}";
    if ($k < (count($param) - 1))
        $query .= ' OR';
endforeach;

Hello,

essai comme ça pour voir (pas testé de mon côté ;) )

 $query .= " WHERE dbproduct.name LIKE '%?%' OR dbproduct.adress  LIKE '%?%' OR  dbproduct.city LIKE '%?%' ";
 $req = $this->bdd->prepare($query);
 $req->execute(array($_GET['field']));

Rho Lartak tu veux te marier avec moi?
Ca fonctionne parfaitement.

Voici le code final, les recherches se font sur toutes les colonnes. YOUPI


$query = "SELECT * FROM dbproduct";
        $params = [];

        if(!empty($_GET['field'])):
            $param = ['id', 'name', 'price', 'address', 'city'];
            $query .= ' WHERE';
            foreach($param as $k => $value):
            $query .= " {$value} LIKE :{$value}";
                if ($k < (count($param) - 1))
                $query .= ' OR';
            $params[$value] = '%' . $_GET['field'] . '%';
            endforeach;
            $req = $this->bdd->prepare($query);
            $req->execute($params);
            $datasearch = $req->fetchAll();
        endif;

Tant mieux si j'ai pu t'aider.
Par contre, tu places l'initialisation, l'exécution et la récupération de ta requête SQL dans la mauvaise partie, il te faut les placer en dehors de la condition si tu veux que ta requête SQL soit toujours fonctionnelle.

Oui j'avais vu ça, j'ai corrigé pour que la boucle ne concerne que le contenu de la requête et non la requête en elle même.
Encore merci.

Bien que pour plus de logique, tu devrais utiliser soit la méthode prepare soit la méthode query selon le cas, par exemple:

$query = "SELECT * FROM dbproduct";
$isSearch = false;
if(!empty($_GET['field'])):
    $isSearch = true;
    $params = [];
    $_params = ['id', 'name', 'price', 'address', 'city'];
    $query .= ' WHERE';
    foreach($_params as $k => $value):
        $query .= " {$value} LIKE :{$value}";
        if ($k < (count($_params) - 1))
            $query .= ' OR';
        $params[$value] = '%' . $_GET['field'] . '%';
    endforeach;
    $req = $this->bdd->prepare($query);
    $req->execute($params);
else:
    $req = $this->bdd->query($query);
endif;
$products = $req->fetchAll();