cajka-d, Возможны разные варианты.
Убедитесь, что web-сервер не устанавливает заголовки принудительно.
Проверьте по логам, что до вызова функции header ничего не выводится. Если это не так, то в логе должно быть предупреждение "Headers already sent".
viktorross, Не так - список категорий через запятую в одном поле. Для связи многие-ко-многим надо использовать отдельную таблицу.
По ошибке - покажите пример с данными, запросом и ожидаемым ответом.
Не совсем. Ещё допускаются колонки, где в каждой группе остаётся только одно значение. При этом не обязательно, чтобы группировка шла по первичному индексу.
То есть, если в базе только Василии и Семёны, при этом все Василии - Алибабаевичи, а Семёны - Семёновичи, то при группировке по имени вполне можно выбрать отчество без агрегатной функции.
Вот только такая таблица уже не будет в нормальной форме, поскольку содержит функциональную зависимость от неключевого поля.
Действительно, фигню написал.
Предположим, что у пользователя 10 записей с completed == true.
id какой из этих записей вы рассчитываете получить в сгруппированной строке и почему именно этот id?
hikamurachi, Вопрос в том, что нет никакого смысла объединять преподавателей (teachers) и студентов (students) по их id в базе данных, даже если эти id и полностью совпадают.
Совпадение набора данных, особенно числовых, не означает совпадение смысла этих данных.
JOIN можно выполнить по любым наборам полей, вопрос лишь в полученном результате.
Как думаете, две таблицы teachers (id, name) и students (id, name) можно объединять по id, если там одинаковые данные?
Danila232, А что должно приходить по ошибке? У вас $status устанавливается, но никакого вывода для него не видно. И в JS-коде нет никакой обработки сообщений при ответе 200.
По умолчанию PHPMail не выбрасывает исключение. Он просто возвращает статус true/false.
Для работы с исключениями необходимо явно указать режим при создании экземпляра.
- $mail = new PHPMailer\PHPMailer\PHPMailer();
+ $mail = new PHPMailer\PHPMailer\PHPMailer(true);
Anton B, Если раздел отмечен как EFI и загрузчик соответствует ядру операционки, то система должна загрузиться, но монтирование в /boot/efi, возможно, придётся перенастроить в файле /etc/fstab.
При обновлении ядра лучше заново копировать содержимое /boot/efi.
Anton B, [SWAP] - это не точка монтирования, а тип раздела. Современные системы умеют использовать под свап одновременно разделы на разных дисках и место, выделенное в виде файлов на томах.
В точки / и /boot смонтированы соответственно md0 и vg0-root, которые система видит в виде отдельных устройств. То, что эти устройства собраны из разделов разных дисков, для системы неважно. mdraid и lvm скрывают от системы внутреннюю реализацию, представляя ей стандартные блочные устройства (диски).
С EFI такое не прокатывает, поскольку к разделу с загрузчиком EFI идёт обращение из UEFI ещё до загрузки каких-либо драйверов, в том числе и mdraid.
Убедитесь, что web-сервер не устанавливает заголовки принудительно.
Проверьте по логам, что до вызова функции header ничего не выводится. Если это не так, то в логе должно быть предупреждение "Headers already sent".