2012-03-23 4 views
1

EDIT: Я нашел большой недостаток в своем исходном коде. Для моих выборок я использовал те же имена переменных для «full_name» и «city» (ошибка копирования и вставки). Но я все еще не уверен, как вводить операторы select для выбора строк на основе обоих выпадающих меню. Я разместил обе части моего кода ниже. Есть идеи? Благодаря!Multiple Drop Down Query Filter

выпадающим Box Код:

<select name="name"> 
<option value="">--</option> 
<?php 
$sql = "SELECT * FROM ".$SETTINGS["data_table"]." GROUP BY full_name ORDER BY full_name"; 
$sql_result = mysql_query ($sql, $connection) or die ('request "Could not execute SQL query" '.$sql); 
while ($row = mysql_fetch_assoc($sql_result)) { 
    echo "<option value='".$row["full_name"]."'".($row["full_name"]==$_REQUEST["full_name"] ? " selected" : "").">".$row["full_name"]." </option>"; 
} 
?> 
</select>&nbsp;&nbsp; 
<label>City</label> 
<select name="city"> 
<option value="">--</option> 
<?php 
$sql = "SELECT * FROM ".$SETTINGS["data_table"]." GROUP BY city ORDER BY city"; 
$sql_result = mysql_query ($sql, $connection) or die ('request "Could not execute SQL query" '.$sql); 
while ($row = mysql_fetch_assoc($sql_result)) { 
    echo "<option value='".$row["city"]."'".($row["city"]==$_REQUEST["city"] ? " selected" : "").">".$row["city"]."</option>"; 
} 
?> 
</select> 

И Select Ряды Код:

<?php 

if ($_REQUEST["city"]<>'') { 
$search_city = " WHERE city='".mysql_real_escape_string($_REQUEST["city"])."'"; 
} 
if ($_REQUEST["full_name"]<>'') { 
$search_full_name = " AND full_name='".mysql_real_escape_string($_REQUEST["full_name"])."'"; 
} 

if ($_REQUEST["from"]<>'') { 
$sql = "SELECT * FROM ".$SETTINGS["data_table"].$search_string.$search_city.$search_full_name; 
} else if ($_REQUEST["to"]<>'') { 
$sql = "SELECT * FROM ".$SETTINGS["data_table"].$search_string.$search_city.$search_full_name; 
} else { 
$sql = "SELECT * FROM ".$SETTINGS["data_table"].$search_string.$search_city.$search_full_name; 
} 

$sql_result = mysql_query ($sql, $connection) or die ('request "Could not execute SQL query" '.$sql); 
if (mysql_num_rows($sql_result)>0) { 
while ($row = mysql_fetch_assoc($sql_result)) { 
?> 

ответ

0

Похоже на первый взгляд вам просто нужно добавить строку

$search_city = ''; 
$search_full_name = ''; 

if ($_REQUEST["city"]<>'') { 
$search_city = " AND city='".mysql_real_escape_string($_REQUEST["city"])."'"; 
} 
if ($_REQUEST["full_name"]<>'') { 
$search_full_name = " AND full_name='".mysql_real_escape_string($_REQUEST["full_name"])."'";  
} 

if ($_REQUEST["from"]<>'') { 
$sql = "SELECT * FROM ".$SETTINGS["data_table"]." WHERE from_date >= '".mysql_real_escape_string($_REQUEST["from"])."'".$search_string.$search_city.$search_full_name; 
} else if ($_REQUEST["to"]<>'') { 
$sql = "SELECT * FROM ".$SETTINGS["data_table"]." WHERE to_date <= '".mysql_real_escape_string($_REQUEST["to"])."'".$search_string.$search_city.$search_full_name; 
} else { 
$sql = "SELECT * FROM ".$SETTINGS["data_table"]." WHERE id>0".$search_string.$search_city.$search_full_name; 
} 

$sql_result = mysql_query ($sql, $connection) or die ('request "Could not execute SQL query" '.$sql); 
if (mysql_num_rows($sql_result)>0) { 
while ($row = mysql_fetch_assoc($sql_result)) { 
+0

Я выбрал ваш метод, но только заметил фатальный недостаток в моем коде. Я использую ту же переменную для «full_name», что я сделал для «city», поэтому «full_name» перезаписывается? Я думаю. См. Мою версию выше. Я также хочу отключить from_date и to_date, чтобы немного упростить его. –

0

Вы могли бы использовать массив для динамического добавления критериев к запросу. Что-то вроде -

$criteria = array(); 

if ($_REQUEST['city'] <> '') { 
    $criteria['city'] = $_REQUEST['city']; 
} 

if ($_REQUEST['full_name'] <> '') { 
    $criteria['full_name'] = $_REQUEST['full_name']; 
} 

if ($_REQUEST['from'] <> '') { 
    $criteria['from_date'] = array($_REQUEST['from'], '>='); 
} 

if ($_REQUEST["to"]<>'') { 
    $criteria['to_date'] = array($_REQUEST['to'], '<='); 
} 

$sql = "SELECT * FROM $SETTINGS['data_table'] WHERE id > 0"; 

foreach ($criteria as $field => $filter) { 

    $comparator = is_array($filter) ? $filter[1] : '='; 
    $value = mysql_real_escape_string(is_array($filter) ? $filter[0] : $filter); 
    $sql .= " AND $field $comparator '$value'"; 

} 

$sql_result = mysql_query ($sql, $connection) or die ('request "Could not execute SQL query" '.$sql); 
if (mysql_num_rows($sql_result)>0) { 
    while ($row = mysql_fetch_assoc($sql_result)) { 
0

Имейте идти с этим кодом:

<?php 

// only process if the request is POST 
if (!empty($_POST)) { 
    // prepare the base select 
    $sql = 'SELECT * 
      FROM ' . $SETTINGS['data_table']; 

    // list of where conditions 
    $where = array(); 

    // map of POST => DB fields 
    $maps = array(
     'from'  => 'from_date', 
     'to'  => 'to_date', 
     'city'  => 'city', 
     'full_name' => 'full_name', 
    ); 

    // process all possible POST fields 
    foreach ($maps as $postName => $fieldName) { 
     if (!empty($_POST[$postName])) { 
      $where[] = sprintf('? = "?"', $fieldName, mysql_real_escape_string($_POST[$postName])); 
     } 
    } 

    // append the WHERE statement if required 
    if (!empty($where)) { 
     $sql .= ' WHERE ' . join(' AND ', $where); 
    } 

    // execute and process the query 
    $qry = mysql_query($sql, $connection); 
    if ($qry === false) { 
     throw new Exception(mysql_error(), mysql_errno()); 
    } 

    while ($row = mysql_fetch_assoc($qry)) { 
     // process the row 
    } 
} 
0

Наконец получил это работает! Я использовал это:

$whereClauses = array(); 
if (! empty($_POST['full_name'])) $whereClauses[] ="full_name='".mysql_real_escape_string($_POST['full_name'])."'"; 
if (! empty($_POST['city'])) $whereClauses[] ="city='".mysql_real_escape_string($_POST['city'])."'"; 
$where = ''; 
if (count($whereClauses) > 0) { $where = ' WHERE '.implode(' AND ',$whereClauses); } 
$sql = mysql_query("SELECT * FROM data".$where); 

Я попытался использовать это в другой пост сдался и начал его таким образом, дали по этому пути и пошел обратно к первому пути и получил это работает.