Примерно так:
1. еще до отправки проверяется заполнены ли необходимые поля.
Также, еще до отправки можно провести некоторые простые проверки, к примеру есть ли @ в email.
2. Данные отправляются на сервер ajax'ом, там проверяются, и возвращается ответ типа такого:
$response = [
'status': 'error', // или 'ok', тогда другие поля не указываются
// дальше статус по каждому из полей с ошибкой
'email': 'already_used', // или 'invalid' или еще какие-то ваши статусы
'phone': 'invalid'
];
return json_encode($response, $flags);
3. На клиенте проверяется статус. Если он не 'ok', то выводятся соответствующие ошибки. Каждому статусу ошибки соответствует заранее скрытый элемент с сообщением или в js сообщения прописаны.