Комбинация поиска полей с использованием PHP и MYSQL

Я работаю над заданием с использованием PHP и MYSQL.

одной из задач является поиск любой комбинации полей. Это включает в себя выпадающие окна, заполненные из базы данных. и текстовые поля.

t2ath содержит

ID SPORT COUNTRY GENDER FIRSTNAME LASTNAME Image 

Я работаю над этим кодом в течение недели, чтобы иметь возможность искать любую комбинацию без ошибок.

Мне интересно, есть ли еще более эффективный способ сделать это.

 $selectedSport = $_POST['sport']; $gender =$_POST['gender']; $fName =$_POST['fname']; $lName =$_POST['lname']; $country =$_POST['country']; $sql_fName=""; $sql_lName=""; $sql_gender=""; $sql_sport=""; $sql_country=""; $checkFiled=False; $where=""; $and=""; // if ( $selectedSport=="showAll") { !isset($selectedSport); } else { if (isset($selectedSport)) { if ($checkFiled==True) { $sql_sport = " AND t2ath.sport = '$selectedSport'" ; } else { $sql_sport = " t2ath.sport = '$selectedSport' " ; $checkFiled=True; } } else { $sql_sport = ""; } } // if ( $country =="showAll") { !isset($country); } else { if (isset($country)) { if ($checkFiled ==True) { $sql_country = " AND t2ath.country = '$country'" ; } else { $sql_country = " t2ath.country = '$country' " ; $checkFiled=True; } } else { $sql_country = ""; } } // if ( $gender=="Gender") { !isset($gender); } else { if (isset($gender)) { if ($checkFiled ==True) { $sql_gender = " AND t2ath.gender = '$gender'" ; } else { $sql_gender = " t2ath.gender = '$gender' " ; $checkFiled=True; } } else { $sql_gender = ""; } } // if ($fName =="") { !isset($fName); } else { if (isset($fName)) { if ($checkFiled==True) { $sql_fName = " AND t2ath.firstName = '$fName'" ; } else { $sql_fName = " t2ath.firstName = '$fName' " ; $checkFiled=True; } } else { $sql_fName = ""; } } // if ($lName =="") { !isset($lName); } else { if (isset($lName)) { if ($checkFiled==True) { $sql_lName = " AND t2ath.lastName = '$lName' " ; } else { $sql_lName = " t2ath.lastName = '$lName' " ; $checkFiled=True; } } else { $sql_lName = ""; } } if ($checkFiled == True) $where=" where "; $selectString = "SELECT t2ath.lastName,t2ath.firstName,t2ath.image,t2ath.sport,t2ath.gender,t2ath.country,t2country.flag FROM t2ath LEFT JOIN t2country ON t2ath.country = t2country.name $where $sql_sport $sql_country $sql_gender $sql_fName $sql_lName "; $result = mysql_query($selectString); , $selectedSport = $_POST['sport']; $gender =$_POST['gender']; $fName =$_POST['fname']; $lName =$_POST['lname']; $country =$_POST['country']; $sql_fName=""; $sql_lName=""; $sql_gender=""; $sql_sport=""; $sql_country=""; $checkFiled=False; $where=""; $and=""; // if ( $selectedSport=="showAll") { !isset($selectedSport); } else { if (isset($selectedSport)) { if ($checkFiled==True) { $sql_sport = " AND t2ath.sport = '$selectedSport'" ; } else { $sql_sport = " t2ath.sport = '$selectedSport' " ; $checkFiled=True; } } else { $sql_sport = ""; } } // if ( $country =="showAll") { !isset($country); } else { if (isset($country)) { if ($checkFiled ==True) { $sql_country = " AND t2ath.country = '$country'" ; } else { $sql_country = " t2ath.country = '$country' " ; $checkFiled=True; } } else { $sql_country = ""; } } // if ( $gender=="Gender") { !isset($gender); } else { if (isset($gender)) { if ($checkFiled ==True) { $sql_gender = " AND t2ath.gender = '$gender'" ; } else { $sql_gender = " t2ath.gender = '$gender' " ; $checkFiled=True; } } else { $sql_gender = ""; } } // if ($fName =="") { !isset($fName); } else { if (isset($fName)) { if ($checkFiled==True) { $sql_fName = " AND t2ath.firstName = '$fName'" ; } else { $sql_fName = " t2ath.firstName = '$fName' " ; $checkFiled=True; } } else { $sql_fName = ""; } } // if ($lName =="") { !isset($lName); } else { if (isset($lName)) { if ($checkFiled==True) { $sql_lName = " AND t2ath.lastName = '$lName' " ; } else { $sql_lName = " t2ath.lastName = '$lName' " ; $checkFiled=True; } } else { $sql_lName = ""; } } if ($checkFiled == True) $where=" where "; $selectString = "SELECT t2ath.lastName,t2ath.firstName,t2ath.image,t2ath.sport,t2ath.gender,t2ath.country,t2country.flag FROM t2ath LEFT JOIN t2country ON t2ath.country = t2country.name $where $sql_sport $sql_country $sql_gender $sql_fName $sql_lName "; $result = mysql_query($selectString); 

Вместо всех этих условностей о том, следует ли добавлять AND при конкатенации запроса, используйте массив и implode .

 $fields = array('sport' => 'sport', 'gender' => 'gender', 'fname' => 'firstName', 'lname' => 'lastName', 'country' => 'country'); $wheres = array(); foreach ($fields as $postfield => $dbfield) { if ($_POST[$postfield] != 'showAll') { $wheres[] = "$dbfield = '" . mysql_real_escape_string($_POST[$postfield]) . "'"; } } $selectString = "SELECT t2ath.lastName, t2ath.firstName, t2ath.image, t2ath.sport, t2ath.gender, t2ath.country, t2country.flag FROM t2ath LEFT JOIN t2country ON t2ath.country = t2country.name"; if (count($wheres) > 0) { $selectString .= " WHERE " . implode(" AND ", $wheres); } $result = mysql_query($selectString); 

Чтобы узнать, как это сделать, используя подготовленные заявления PDO, см. Мой ответ здесь: Какой подход кода позволит пользователям применять три необязательные переменные в PHP / MySQL?

В прошлом я сделал что-то подобное, где я проверил значение из разных полей, а затем добавил их в ряд массивов. Я создал массив для select, from, where, order. Вы можете сделать подобное для других наборов, таких как группа или лимит. Затем я запускал 'array_unique', вставлял их в строку SQL.

 $array_select = array('users.Id'); // SET SOME DEFAULTS SO THE QUERY WILL ALWAYS RUN $array_from = array('users'); $array_where = array(); $array_order = array(); if (isset($first_name)) { $array_select[] = 'First_Name'; $array_from[] = 'users'; } if (isset($city)) { $array_select[] = 'City'; $array_from[] = 'user_contact'; $array_where[] = 'users.Id = user_contact.City'; } if ($array_select) { $array_select = array_unique($array_select); $string_select = implode(', ', $array_select); } if ($array_where) { $array_where = array_unique($array_where); $string_where = 'WHERE '.implode(' AND ', $array_where); } // REPEAT FOR OTHERS ... // BUILD THE QUERY OUT $sql = 'SELECT '.$string_select.' FROM '.$string_from.' '.$string_where.' ... 

Почему бы не оценить вашу строку с каждым столбцом (это только руководство, я не строю свой код PHP там:

 SELECT * FROM table WHERE (ID = $id OR $id = 'showAll') AND (SPORT = $sport OR $sport = 'showAll') AND (COUNTRY = $country OR $country = 'showAll') AND (GENDER = $gender OR $gender = 'showAll') AND (FIRSTNAME = $firstname OR $firstname = 'showAll') 

Просто нужно убедиться, что переменная NVL соответствует соответствующему значению (будь то int или string)