Il problema è probabilmente che $this->phone
è vuoto quando esegui la query.
In tal caso, la query sarà SELECT * FROM [...] OR WHERE phone LIKE '%%'
che restituirà sempre tutto.
Soluzione:tralasciare i criteri del telefono se non forniti o (avviso di hacking! ) utilizza un valore che non si verificherà mai in quella colonna.
Un altro modo per farlo è cambiare la query in qualcosa di simile a
SELECT *
FROM directory
WHERE name LIKE :name
AND :name_provided = 1
OR phone LIKE :phone
AND :phone_provided = 1
E poi vincola :phone_provided
a 1 se $this->phone
è definito, 0 altrimenti. Allo stesso modo con :name_provided
.