La fecha que estás pasando a la función date por la variable $fecha está mal formateada, prueba haciendo echo de esa variable para que veas como está quedando. Si ves que cumple con el formato correcto de fecha intenta usando la función
mktime para generar la fecha en formato unix y ahí si se la pasas a date o puedes usar la función
strtotime para que generes la fecha unix a partir de un string como es tu caso y luego pasas ese valor a la función date.