web-dev-qa-db-fra.com

Créer une requête mysql dynamique en utilisant les variables php

J'ai une table HTML qui charge tout dans une table de base de données MySQL. J'ai des listes déroulantes relatives aux colonnes de cette table mySQL. Lorsque l'utilisateur sélectionne l'une des listes déroulantes, il utilise AJAX pour interroger la base de données.

Je dois comprendre comment construire la requête de manière dynamique car parfois les menus déroulants sont vides (c'est-à-dire qu'ils ne veulent pas filtrer en fonction de cette colonne).

Quelle est la meilleure façon de procéder?

Actuellement, j'ai quelque chose comme ça:

    $stationFilter = $_GET['station'];
    $verticalFilter = $_GET['vertical'];
    $creativeFilter = $_GET['creative'];
    $weekFilter = $_GET['week'];    

    $result = mysql_query("SELECT * FROM $tableName WHERE STATION_NETWORK = '$stationFilter' AND VERTICAL = '$verticalFilter' AND CREATIVE = '$creativeFilter'  AND WK = '$weekFilter'");   
    $data = array();
    while ($row = mysql_fetch_row($result) )
        {
        $data[] = $row;
        }   
    $finalarray['rowdata'] = $data;

Ce que vous pouvez imaginer ne fonctionne pas, car si l'un de ces champs est vide, la requête échoue (ou ne renvoie rien, au contraire).

Évidemment, créer une telle requête «statique» comme celle-ci rend la tâche difficile si certaines variables sont vides.

Quel est le meilleur moyen de créer dynamiquement cette requête afin que seules les entrées non vides soient ajoutées à la requête afin que celle-ci puisse être complétée et afficher les données appropriées?

10
Hanny

Il suffit de vérifier si les variables contiennent une valeur et si c'est le cas, construisez la requête comme suit:

unset($sql);

if ($stationFilter) {
    $sql[] = " STATION_NETWORK = '$stationFilter' ";
}
if ($verticalFilter) {
    $sql[] = " VERTICAL = '$verticalFilter' ";
}

$query = "SELECT * FROM $tableName";

if (!empty($sql)) {
    $query .= ' WHERE ' . implode(' AND ', $sql);
}

echo $query;
// mysql_query($query);
31
SeanWM
$filter = array();

if ($_GET['station'] != '')
{ $filter[] = 'STATION_NETWORK = '.$_GET['station'];}
if ($_GET['vertical'] != '')
{ $filter[] = 'VERTICAL = '.$_GET['vertical'];}
if ($_GET['creative'] != '')
{ $filter[] = 'CREATIVE  = '.$_GET['creative'];}
if ($_GET['week'] != '')
{ $filter[] = 'WK = '.$_GET['week'];}

$query = 'SELECT * FROM $tableName WHERE '.implode(' AND ', $filter);
$result = mysql_query($query);
... 

mais mieux si vous avez poussé dans GET le nom des lignes de la table; $ _ GET ['STATION_NETWORK'] --- certains aiment ceci;

then you make
foreach ($_GET as $key => $value)
{
    if ($value != '')
    { $filter[] = $key.' = '.$value;}
}

ou essayer

$filter = array('STANTION_NETWORK' => $_GET['station'],
                'VERTICAL' => $_GET['vertical'],
                 'CREATIVE'  => $_GET['creative'],
                 'WK' => $_GET['week']);
$query_array = array();

 foreach ($filter as $key => $value)
{
    if ($value != '')
    { $query_array[] = $key.' = '.$value;}
}
$query = 'SELECT * FROM $tableName WHERE '.implode(' AND ', $query_array);
$result = mysql_query($query);
0
CHORTik