Этот код должен вызываться каждый раз когда вы загружаете новый кусок.
$('ul.dropdown li a').on('click', function (e) {
e.preventDefault();
alert('do');
});
На пальцах, потому что этот код будучи вызаван срабатывает для уже имеющихся на странице (в dom-дереве), при появлении новых элементов, на них это не распространяется.
Тут есть два варианта:
1) Для этого нужен опять же конейнер который есть изначально на странице до подгрузки данных, и использовать
$('.existing_container').on('click', ''ul.dropdown li a', function () {});
2) С каждой загрузкой вызывать
$('ul.dropdown li a').off('click').on('click', function (e) {
e.preventDefault();
alert('do');
});
off() нужен для того чтоб обработчик клика не вызывался многократно на уже подгруженных ранее элементах.
Вообще инет на айфоне работает? В каком браузере не работает? Если это Сафари, работает ли в десктопном Сафари? Что если выполнить прямой get-запрос прямо из адресной строки, без JS?
Если значений param_id будет 3 или 4, то не только WHERE будет сложный, но и JOIN надо будет делать столько же раз.
Да, можно сделать декомпозицию на несколько запросов через WHERE IN. Но там могут быть просадки по производительности.
SELECT product_id FROM t AS t1
WHERE t1.param_id = 1 AND t1.product_id IN (SELECT product_id FROM t AS t2 WHERE t2.param_id = 2 AND t1.product_id IN (....) )
Получаются вложенные подзапросы. Но их можно развернуть в скрипте в цикл. например так:
SELECT product_id FROM t AS t1
WHERE t1.param_id = 1 AND t1.product_id IN (1, 3, 4, 7 )
А список 1, 3, 4, 7 формируется из результатов предыдущего запроса.
usort ( (array)$items, ....
Видимо $link->spec() возвращает какой-то итерабельный объект, а не просто массив.