Credo che il problema potrebbe tranquillamente essere risolto con una espressione regoalare, che però io non padroneggio ancora alla grande, quindi potrei sggerirti questa soluzione alternativa che prevede anche nomi composti
Codice PHP:
$str=$row['cognome'];
$split=explode(" "$str);

$count=count($split);

$cognome="";
for(
$i=0$i<$count$i++){
 
$split[$i]= ucwords(strtolower($split[$i]));
 
$cognome .=$split[$i];
}
$split=explode("'"$cognome);
$count=count($split);

$cognome="";
for(
$i=0$i<$count$i++){
 
$split[$i]= ucwords($split[$i]);
 
$cognome .=$split[$i];

Assolutamente improvvisata, e da provare..