* * root вашей проблемы заключается в том, что вы вообще не отправляете идентификатор инструмента при получении подкатегорий. Сначала вам нужно получить его в вашем обработчике, так как ваш select
имеет идентификатор, это просто:
$('#category_id').on('change', function(){
const categoryID = $(this).val(); // I changed var to const here, read more about it below
const instrumentID = $('#instrument_id').val(); // this line added
Здесь вы можете прочитать об использовании const
и let
более var
.
А затем вам нужно отправить его в AJAX data
:
// sending it as an object is more readable and PHP reads it just the same
data: {
category_id: categoryID,
instrument_id: instrumentID,
}
Теперь вам также нужно исправить свою сторону PHP. В настоящее время, если вы отправляете данные такого рода, ваша первая ветвь будет активирована, потому что идентификатор инструмента установлен в обоих случаях:
if (!empty($_POST["instrument_id"])) {
// get categories
} elseif(!empty($_POST["category_id"])) {
// get subcategories
}
Вместо этого вы должны проверить, если оба устанавливаются параметры (именно так вы определяете, что вам нужны подкатегории):
if (!empty($_POST["instrument_id"]) && !empty($_POST["category_id"])) {
// get subcategories
} elseif (!empty($_POST["category_id"]) && empty($_POST["instrument_id"])) {
// get categories
}
Но гораздо более чистым решением было бы просто иметь два PHP сценария, один для категорий и один для подкатегорий. Тогда вам не понадобится эта сложная if-elseif
структура, и ваши задачи будут логически разделены (в настоящее время вы используете файл с именем get_subcategories
, чтобы получить обе подкатегории и категорий, поэтому это не так. действительно удачно назван).
Еще одна вещь, которую вы должны избегать любой ценой, это создание запросов путем прямой вставки параметров:
$query = "SELECT * FROM subcategories WHERE category_id = ".$_POST['category_id']." AND instrument_id = ".$_POST['instrument_id']." ORDER BY name ASC";
Этот вид практики оставляет вас широко открытыми для SQL инъекция . Вместо этого вы должны использовать подготовленные заявления .