Le problème est probablement que $this->phone est vide lorsque vous exécutez la requête.
Dans ce cas, la requête sera SELECT * FROM [...] OR WHERE phone LIKE '%%' qui renverra toujours tout.
Solution :omettez les critères de téléphone s'ils ne sont pas fournis ou (alerte de piratage ! ) utilisez une valeur qui n'apparaîtra jamais dans cette colonne.
Une autre façon de faire est de changer la requête en quelque chose comme
SELECT *
FROM directory
WHERE name LIKE :name
AND :name_provided = 1
OR phone LIKE :phone
AND :phone_provided = 1
Et puis liez :phone_provided à 1 si $this->phone est défini, 0 sinon. De même avec :name_provided .