Как уже выше написали - у тебя, скорее всего, ошибка в запросе, но она никак не проявляет себя.
Чтобы быть в курсе ошибок SQL, их надо транслировать в ошибки РНР. Но вот как именно это делать никто правильно написать не смог.
Во-первых, выше написана ерунда: на самом деле НИКОГДА нельзя писать or die(что-нибудь)
. Причин этому много, об этом везде написано, я не буду повторяться. Если мы хотим получить ошибку, можно писать только or trigger_error(что-нибудь)
.
Во-вторых, в случае с mysqli даже этого не нужно. Можно один раз установить нужную настройку и ошибки mysqli начнут сами транслироваться в ошибки PHP. Перед коннектом достаточно написать вот эту одну строчку
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
и больше не придется проверять вручную результат ни одной функции mysqli - очень удобно.
Что характерно - я уже не раз приводил здесь этот простой код, но мы же ведь тут все писатели, а не читатели, и поэтому никто ничему не учится. И продолжает давать советы двадцатилетней давности.
В общем, пишешь эту строчку перед коннектом и сразу видишь все ошибки запросов.
Далее.
Это не относится к твоей проблеме напрямую, но имеет критическое значение для безопасности твоих скриптов: ты не должен использовать mysqli как есть. Тебя заставляли сменить расширение mysql не для того чтобы ты продолжал говнокодить в том же стиле, просто добавив буковку i к именам функций. А для того, чтобы ты начал использовать плейсхолдеры для подстановки значений в запрос. Но у mysqli плейсхолдеры практически неюзабельны до такой степени, что средний пхпшник в принципе не в состоянии освоить работу с ними. Плюс - вообще никогда нельзя работать с сырым API, а надо всегда использовать более высокоуровневую надстройку. Таких настроек много, но встроенная в РНР только одна - PDO. Поэтому ты должен начать использовать PDO вместо mysqli. Этим ты сделаешь свои скрипты неуязвимыми для SQL инъекций и сократишь количество кода.
Вот твой метод, переписанный на PDO:
private function getWorkoutId(){
$sql = "SELECT id FROM training WHERE user_id = ? AND day = ?";
$stm = $this->db->prepare($sql);
$stm->execute(array($this->userID, $this->day));
return $stm->fetchColumn();
}
тут все безопасно, и без лишнего кода.
Да. И если говорить об ошибках ООП, то класс Workout какой-то в целом бессмысленный. Класс, который состоит, по сути, из одного конструктора, должен быть методом, а не классом. Если это еще только заготовка, и методы будут дописываться - тогда ок. Но если это класс целиком, то я бы сделал его методом.