Решение, помеченное как хорошее, вернет только таблицы результатов. Но если вы выполните следующий запрос, он потерпит неудачу:
SELECT users.* FROM users, cats, dogs WHERE users.id = cats.user_id
Будет возвращать только пользователей , а не таблицы кошек и собак.
Лучшее решение - найти хороший парсер, другое решение - использовать запрос REGEX и EXPLAIN (подробнее по следующей ссылке):
Получение таблиц mysql в запросе
Но я думаю, что другим хорошим решением является перечисление всех таблиц и поиск их внутри запроса , вы можете кэшировать список таблиц.
РЕДАКТИРОВАТЬ : при поиске таблиц лучше использовать прег, например:
// (`|'|"| )table_name(\1|$)
if(preg_match('/(`|\'|"| )table_name(\1|$)/i', $query))
// found
Если нет, он может возвращать ложные срабатывания, например, "table_name2", "table_name3" ... table_name вернет FOUND два раза.