2013-04-03 6 views
8

Mam tabelę html ładującą wszystko w tabeli bazy danych mySQL. Mam listy rozwijane, które odnoszą się do kolumn tej tabeli mySQL - gdy użytkownik wybierze jedno z menu rozwijanych, używa AJAX do wysyłania zapytań do bazy danych.Tworzenie dynamicznego zapytania mysql przy użyciu zmiennych php

Potrzebuję dowiedzieć się, jak zbudować zapytanie dynamicznie, ponieważ czasami listy rozwijane będą puste (tj. Nie chcą filtrować według tej kolumny).

Jaki jest najlepszy sposób na zrobienie tego?

Obecnie mam coś takiego:

$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; 

które można sobie wyobrazić nie działa, ponieważ jeśli którykolwiek z tych pól jest pusta - kwerenda nie powiedzie się (lub zwraca nic, raczej).

Oczywiście tworzenie takich "statycznych" zapytań, jak to naprawdę utrudnia, jeśli niektóre zmienne są puste.

Jaki jest najlepszy sposób dynamicznego utworzenia tego zapytania, aby zawierał tylko te, które nie są puste, zostały dodane do zapytania, aby można było pomyślnie ukończyć i wyświetlić odpowiednie dane?

+0

Dlaczego nie echo zapytanie, aby zobaczyć co jest nie tak, gdy rozwijana jest pusta? –

+1

Nie używaj mysql_query, jest przestarzałe. Jesteś również podatny na zastrzyki sql. – Jonast92

+0

W tej chwili jestem po prostu zainteresowany jego uruchomieniem. Jest to po prostu dla intranetu i aby działało. Nigdy nie zobaczy zewnętrznego świata. Dziękuję za troskę, jest to coś, czego jestem świadomy, ale chcę zobaczyć, czy mogę po prostu to zadziałać. – Hanny

Odpowiedz

29

Wystarczy sprawdzić, czy zmienne zawierają wartości, a jeśli to robią, zbudować kwerendę tak:

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); 
+0

Rozważałem coś takiego - ale co z GDZIE? Znaczenie instrukcji musi zawierać GDZIE dla pierwszego - ale ORAZ dla wszystkich kolejnych. Najlepszy sposób to zrobić? – Hanny

+0

Sprawdź, czy '$ sql' zawiera cokolwiek. Jeśli tak, użyj go, ale dodaj słowo "WHERE" przed użyciem '$ sql' – SeanWM

+0

Sprawdź moją edycję .. – SeanWM

0
$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); 
... 

ale lepiej, jeśli w cię popchnął nazwy tabel wierszy; $ _GET ['STATION_NETWORK'] --- niektóre takie jak to;

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

lub spróbuj

$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); 
Powiązane problemy