Вы упомянули два параметра (с одним и тем же именем) для оператора подготовки, но вы предоставляете значение только для первого параметра (в этом и была ошибка).
Не совсем уверен, как PDO внутренне решил проблему с именем с одним и тем же параметром, но вы всегда можете избежать этого.
Два возможных решения:
$sql = "select * from $table ".
"where "
"first_name like concat('%', :fname, '%') or ".
"last_name like concat('%', :lname, '%')";
$stmt= $DBH->prepare($sql);
$stmt->bindValue(':fname', $string, PDO::PARAM_STR);
$stmt->bindValue(':lname', $string, PDO::PARAM_STR);
$sql = "select * from $table ".
"where "
"first_name like concat('%', ?, '%') or ".
"last_name like concat('%', ?, '%')";
$stmt= $DBH->prepare($sql);
$stmt->bindValue(1, $string, PDO::PARAM_STR);
$stmt->bindValue(2, $string, PDO::PARAM_STR);
Кстати, у существующего способа все еще есть проблемы с внедрением SQL.