Ceci
...snip... ) LIKE '%' LOWER(:wildcard) '%' OR ...snip
est incorrect. Vous avez une chaîne ('%' ) suivi d'un appel de fonction (LOWER() ) suivi d'une autre chaîne, et ils sont juste assis là - pas de logique de connexion, pas de concaténation, bla bla bla .
Cela devrait être
... LIKE CONCAT('%', LOWER(:wildcard), '%') OR ...
Et par défaut, les comparaisons mysql SONT insensibles à la casse, sauf si vous forcez un binary comparaison, ou vous utilisez un classement sensible à la casse sur votre db/table.