Вместо строк 13 - 23 получайте сразу весь набор как $query->fetchAll(), который и отдавайте как JSON.
exit(json_encode($query->fetchAll()));
Если предполагается диалог либо JSON, либо текст, то каким образом клиент поймет что ему пришло, если ему не сообщаться это? Либо передавайте заголовки сообщающие тип данных и разбирайтесь. Либо всегда отдавайте json и заголовок для него, в этом случае на клиенте при получении массива будет объект, а при получении "Параметры не переданы", будет строка.
Данные полученные извне подставлять в запрос не фильтруя ни в коем случае нельзя! Либо сами обрабатывайте их, либо используйте подготовленные запросы драйвера SQL.