Requete sql avec des conditions

Par gilles40, il y a 11 ans


Base de données MySQL

Bonjour,

Je cherche a faire une requete sql avec le nom d'une colonne qui passe dans le WHERE et qui provient d'un formulaire (select) et passer la valeur cherchée dans cette colonne dans un AND elle aussi provenant d'un formulaire, je vous dépose mon bout de code ci-dessous cela sera mieux .

if(isset($_POST'agence_id'])){
        $agence = $db->quote($_POST'agence_id']);
        $type_recherche = $db->quote($_POST'type_recherche']);//colonne que je doit mettre dans le WHERE
        $valeur = $db->quote($_POST'valeur']);//valeur à chercher dans la colonne qui passe dans le WHERE ou le AND
$select = $db->query("SELECT reglements.date_reglement, reglements.name AS client, reglements.ra, reglements.montant, agences.name AS agences, typereglements.name
                                            FROM ((reglements
                                            LEFT JOIN agences ON reglements.agence_id = agences.id)
                                            LEFT JOIN typereglements ON reglements.typereglement_id = typereglements.id)
                                            WHERE reglements.$type_recherche=$valeur//probleme de la requete
                                            ORDER BY ra ASC");
        $recherches = $select->fetchAll();
}

merci de votre aide

Gilles

12 réponses

Carouge10, il y a 11 ans

Bonjour,

Il vous faut utiliser les requêtes préparées.

$sth = $dbh->prepare('SELECT nom, couleur, calories FROM fruit WHERE calories < :calories AND couleur = :couleur');
$sth->execute(array(':calories' => 150, ':couleur' => 'red'));
$donnees = $sth->fetchAll();
....

Doc : Pdo prepare

gilles40, il y a 11 ans

tout d'abords merci pour ta reponse Carouge10,

mais le soucis est que je ne vois pas comment je peux changer le WHERE c'est a dire que dans mon formulaire j'ai un select qui a 3 possiblités qui representent 3 colonnes de ma table et je voudroi qu'en fonction de ca mon WHERE soit: WHERE ra ou WHERE montant ou bien WHERE name

J'ai regarder la doc de pdo prepare mais la je cale.

merci d'avance

Gilles

Carouge10, il y a 11 ans

Il suffit de crée la requête en amont.

$sql = "SELECT * FROM toto WHERE ";
if ($conditions === 'truc')
    $sql .= " id ";
elseif ($conditions === 'machin')
    $sql .= " nom ";
else
    $sql .= " prenom ";
$sql .= " = :bravo";
$sth = $dbh->prepare($sql);
gilles40, il y a 11 ans

j ai essayer mais cela ne me mets que la derniere possibilitée du if quelque soit le l option que je prennes!!!
ai je oublier quelque chose??
je mets le var_dump que me retourne le code:

object(PDOStatement)[38]
public 'queryString' => string 'SELECT * FROM reglements WHERE nom = :bravo' (length=45)

et le code qui va avec :

if(isset($_POST'agence_id'])){
    $agence = $db->quote($_POST'agence_id']);
    $type_recherche = $db->quote($_POST'type_recherche']);
    $valeur = $db->quote($_POST'valeur']);
    $conditions = $type_recherche;
    $sql = "SELECT * FROM reglements WHERE ";
        if ($conditions === 'ra'){
            $sql .= " ra ";
        }
        elseif ($conditions === 'montant'){
            $sql .= " montant ";
        }
        else{
            $sql .= " nom ";
        }
        $sql .= " = :bravo";
        $sth = $db->prepare($sql);
var_dump($sth);
die();
}
Carouge10, il y a 11 ans

Faites un echo de $conditions pour voir ça valeur.
Metter simplement des == au lieu des ===

gilles40, il y a 11 ans

Voila ce qu il sort:
avec l'echo:

'montant'

object(PDOStatement)[38]
public 'queryString' => string 'SELECT * FROM reglements WHERE nom = :bravo' (length=45)

Carouge10, il y a 11 ans

Pour être très précis et bien identifier le problème,
quand vous faites :

echo $conditions;

vous avez : 'montant' ?

gilles40, il y a 11 ans

oui c est ce que j envoie de mon formulaire

gilles40, il y a 11 ans

le pire c est quand je mets la donnée manuellement ca marche???

Carouge10, il y a 11 ans

Alors c'est normale.
Dans les conditions, vous cherchez 'montant' (avec ' ) à être comparé à quelque chose. Et donc, il ne trouve pas.

Avec

$db->quote()

vous ajouté des ' qui posent problèmes

Ceci devrait le résoudre

if(isset($_POST'agence_id'])){
    $agence = $_POST'agence_id'];
    $type_recherche = $_POST'type_recherche'];
    $valeur = $db->quote($_POST'valeur']);

    $conditions = $type_recherche;

    $sql = "SELECT * FROM reglements WHERE ";
        if ($conditions === 'ra'){
            $sql .= " ra ";
        }
        elseif ($conditions === 'montant'){
            $sql .= " montant ";
        }
        else{
            $sql .= " nom ";
        }

        $sql .= " = :bravo";
        $sth = $db->prepare($sql);

var_dump($sth);
die();

}
gilles40, il y a 11 ans

Un grand merci cela fonctionne!!
maintenant y a plus qu a executer et recuperer les donnees.

Carouge10, il y a 11 ans

Je vous en prie.
Oui, bonne continuation