Некоторое время царапаю мне голову, но, надеюсь, кто-то может вести меня:
У меня есть таблица (стандарты) в моей базе данных, которая имеет разные внешние ключи (Grade, Subject, Branch). С пользовательской стороны пользователь может ввести ключевое слово и может дополнительно фильтровать на основе класса (1-го-12-го), предмета (математика, английский, наука) или ветки (зависит от выбора объекта). Эта дополнительная фильтрация - проблема, с которой я сталкиваюсь. Каков рекомендуемый подход для выбора данных из данных на основе сделанных выборов?
Вот что я имею, когда они не выбирают для фильтрации данных:
function generalResult($keyword, $connection){
$sql = "SELECT standards_eng.Standard FROM standards_eng WHERE standards_eng LIKE '%".$keyword."%' ";
$query = $connection->query($sql);
if ($query->num_rows > 0) {
while ($row = $query->fetch_assoc()) {
echo '<p>' .$row['Standard']. '</p>';
}
}
}
Единственное решение, которое я мог придумать, - это инструкции If/else, но этого было бы слишком много, чтобы считать. Например:
if(Grade!== "" AND SUBJECT == "" AND BRANCH =="") {
//Selects data where Standard is like keyword AND Grade_ID is equal to value selected
} Else if (Grade!== "" AND SUBJECT !== "" AND BRANCH == "") {
//Selects data where Standard is like keyword Grade_ID and Subject is equal to value selected
}Else if{
...
}Else if{...}
Я не совсем уверен, чего вы хотите, но если я прав, вы хотите, чтобы дополнительные фильтры были пустыми?
Что бы я сделал, это создать фильтр и добавить/объединить эту строку, если нужен дополнительный фильтр. см. ниже для примера.
$filter="WHERE standards_eng LIKE '%".keyword."%'";
if(Grade!==""){
$filter."AND Grade="value here";
}
if(SUBJECT!==""){
$filter."AND SUBJECT="value here";
}
if(BRANCH!==""){
$filter."AND BRACH="value here";
}
$sql = "SELECT standards_eng.Standard FROM standards_eng".$filter;
mysqli
вы должны использовать параметризованные запросы иbind_param
для добавления пользовательских данных в ваш запрос. НЕ используйте интерполяцию или конкатенацию строк для достижения этой цели, поскольку вы создали серьезную ошибку внедрения SQL . НИКОГДА не помещайте$_POST
,$_GET
или любые пользовательские данные непосредственно в запрос, это может быть очень вредно, если кто-то попытается использовать вашу ошибку.