Здесь две части, первая - скорее предложение: вместо того, чтобы иметь столбец для каждой даты, почему бы не настроить вашу таблицу регистров так, чтобы в ней были только столбец user_id и date.всякий раз, когда вам нужно отследить посещенную дату, вы просто добавляете новую строку в таблицу, чтобы можно было иметь несколько строк с одним и тем же user_id, а затем для подсчета все, что вам нужно сделать, это:
select count(user_id) as attendCount from register where user_id = :value2
Затем вы можете объединить его с таблицей пользователя в своем первом операторе и сделать только один запрос к базе данных для всего процесса.
Вторая часть, предполагая, что вышеприведенное не являетсяодним из вариантов будет цикл по всем столбцам даты и построение оператора sql, а затем один раз запустить его в цикле.что-то вроде этого:
$parts = array();
foreach ($Date as $item) {
$parts = "if( " . $item . " = 'Attended', 1, 0)";
}
$sql = 'SELECT (' . join(' + ', $parts) . ') as itemCount FROM register WHERE (user_id = :value2)';
$stmt = $db->prepare($sql);
$stmt->execute(array(':value2' => $row['ID']));
...
Этот запрос должен просто проверять каждый столбец на "Attended", если он там использует 1, в противном случае 0. Затем каждое из этих значений складывается, чтобы получить количество столбцов сстоимость посещенных.Приятно то, что вы выполняете только один запрос в цикле вместо одного запроса на имя столбца.