0 && mb_strlen($value) > $maxLength) { $value = mb_substr($value, 0, $maxLength); } return $value; } function aprelik_get_pdo(): PDO { foreach (['pdo', 'db', 'database', 'conn'] as $name) { if (isset($GLOBALS[$name]) && $GLOBALS[$name] instanceof PDO) { return $GLOBALS[$name]; } } throw new RuntimeException('PDO connection not found in bootstrap_global.php'); } if ($_SERVER['REQUEST_METHOD'] !== 'POST') { aprelik_redirect('/aprelik.php'); } if (! empty($_POST['website'] ?? '')) { $_SESSION['aprelik_success'] = 'Спасибо. Форма отправлена.'; aprelik_redirect('/aprelik.php'); } $data = [ 'child_last_name' => aprelik_clean($_POST['child_last_name'] ?? '', 120), 'child_first_name' => aprelik_clean($_POST['child_first_name'] ?? '', 120), 'child_birthdate' => aprelik_clean($_POST['child_birthdate'] ?? '', 10), 'parent1_last_name' => aprelik_clean($_POST['parent1_last_name'] ?? '', 120), 'parent1_first_name' => aprelik_clean($_POST['parent1_first_name'] ?? '', 120), 'parent1_language' => aprelik_clean($_POST['parent1_language'] ?? '', 120), 'parent2_last_name' => aprelik_clean($_POST['parent2_last_name'] ?? '', 120), 'parent2_first_name' => aprelik_clean($_POST['parent2_first_name'] ?? '', 120), 'parent2_language' => aprelik_clean($_POST['parent2_language'] ?? '', 120), 'street_address' => aprelik_clean($_POST['street_address'] ?? '', 255), 'postal_code' => aprelik_clean($_POST['postal_code'] ?? '', 30), 'city' => aprelik_clean($_POST['city'] ?? '', 120), 'parent1_phone' => aprelik_clean($_POST['parent1_phone'] ?? '', 40), 'parent2_phone' => aprelik_clean($_POST['parent2_phone'] ?? '', 40), 'email' => aprelik_clean($_POST['email'] ?? '', 190), 'consent_rgpd' => ! empty($_POST['consent_rgpd']) ? 1 : 0, 'consent_email_diffusion' => ! empty($_POST['consent_email_diffusion']) ? 1 : 0, 'school_day_address' => aprelik_clean($_POST['school_day_address'] ?? '', 255), 'age_group' => aprelik_clean($_POST['age_group'] ?? '', 80), 'notes' => aprelik_clean($_POST['notes'] ?? '', 5000), ]; $errors = []; if ($data['child_last_name'] === '') { $errors[] = 'Укажите фамилию ребёнка.'; } if ($data['child_first_name'] === '') { $errors[] = 'Укажите имя ребёнка.'; } if ($data['child_birthdate'] === '') { $errors[] = 'Укажите дату рождения ребёнка.'; } else { $dt = DateTime::createFromFormat('Y-m-d', $data['child_birthdate']); if (! $dt || $dt->format('Y-m-d') !== $data['child_birthdate']) { $errors[] = 'Некорректная дата рождения.'; } } if ($data['parent1_last_name'] === '') { $errors[] = 'Укажите фамилию родителя 1.'; } if ($data['parent1_first_name'] === '') { $errors[] = 'Укажите имя родителя 1.'; } if ($data['parent1_language'] === '') { $errors[] = 'Укажите язык родителя 1.'; } if ($data['street_address'] === '') { $errors[] = 'Укажите адрес.'; } if ($data['postal_code'] === '') { $errors[] = 'Укажите индекс.'; } if ($data['city'] === '') { $errors[] = 'Укажите город.'; } if ($data['parent1_phone'] === '') { $errors[] = 'Укажите телефон родителя 1.'; } if ($data['email'] === '' || filter_var($data['email'], FILTER_VALIDATE_EMAIL) === false) { $errors[] = 'Укажите корректный email.'; } if ($data['school_day_address'] === '') { $errors[] = 'Выберите адрес занятий.'; } if ($data['age_group'] === '') { $errors[] = 'Выберите возрастную группу.'; } if ($data['consent_email_diffusion'] !== 1) { $errors[] = 'Нужно согласиться на информационную рассылку.'; } if ($data['consent_rgpd'] !== 1) { $errors[] = 'Нужно согласиться на обработку персональных данных.'; } if ($errors !== []) { $_SESSION['aprelik_errors'] = $errors; $_SESSION['aprelik_old'] = $data; aprelik_redirect('/aprelik.php'); } try { $pdo = aprelik_get_pdo(); $sql = " INSERT INTO aprelik ( child_last_name, child_first_name, child_birthdate, parent1_last_name, parent1_first_name, parent1_language, parent2_last_name, parent2_first_name, parent2_language, street_address, postal_code, city, parent1_phone, parent2_phone, email, consent_rgpd, consent_email_diffusion, ip_address, user_agent, school_day_address, age_group, notes ) VALUES ( :child_last_name, :child_first_name, :child_birthdate, :parent1_last_name, :parent1_first_name, :parent1_language, :parent2_last_name, :parent2_first_name, :parent2_language, :street_address, :postal_code, :city, :parent1_phone, :parent2_phone, :email, :consent_rgpd, :consent_email_diffusion, :ip_address, :user_agent, :school_day_address, :age_group, :notes ) ON DUPLICATE KEY UPDATE child_last_name = VALUES(child_last_name), child_first_name = VALUES(child_first_name), child_birthdate = VALUES(child_birthdate), parent1_last_name = VALUES(parent1_last_name), parent1_first_name = VALUES(parent1_first_name), parent1_language = VALUES(parent1_language), parent2_last_name = VALUES(parent2_last_name), parent2_first_name = VALUES(parent2_first_name), parent2_language = VALUES(parent2_language), street_address = VALUES(street_address), postal_code = VALUES(postal_code), city = VALUES(city), parent1_phone = VALUES(parent1_phone), parent2_phone = VALUES(parent2_phone), consent_rgpd = VALUES(consent_rgpd), consent_email_diffusion = VALUES(consent_email_diffusion), ip_address = VALUES(ip_address), user_agent = VALUES(user_agent), school_day_address = VALUES(school_day_address), age_group = VALUES(age_group), notes = VALUES(notes), updated_at = CURRENT_TIMESTAMP "; $stmt = $pdo->prepare($sql); $stmt->execute([ ':child_last_name' => $data['child_last_name'], ':child_first_name' => $data['child_first_name'], ':child_birthdate' => $data['child_birthdate'], ':parent1_last_name' => $data['parent1_last_name'], ':parent1_first_name' => $data['parent1_first_name'], ':parent1_language' => $data['parent1_language'], ':parent2_last_name' => $data['parent2_last_name'] !== '' ? $data['parent2_last_name'] : null, ':parent2_first_name' => $data['parent2_first_name'] !== '' ? $data['parent2_first_name'] : null, ':parent2_language' => $data['parent2_language'] !== '' ? $data['parent2_language'] : null, ':street_address' => $data['street_address'], ':postal_code' => $data['postal_code'], ':city' => $data['city'], ':parent1_phone' => $data['parent1_phone'], ':parent2_phone' => $data['parent2_phone'] !== '' ? $data['parent2_phone'] : null, ':email' => mb_strtolower($data['email']), ':consent_rgpd' => $data['consent_rgpd'], ':consent_email_diffusion' => $data['consent_email_diffusion'], ':ip_address' => substr((string) ($_SERVER['REMOTE_ADDR'] ?? ''), 0, 45) ?: null, ':user_agent' => substr((string) ($_SERVER['HTTP_USER_AGENT'] ?? ''), 0, 255) ?: null, ':school_day_address' => $data['school_day_address'], ':age_group' => $data['age_group'], ':notes' => $data['notes'] !== '' ? $data['notes'] : null, ]); $_SESSION['aprelik_success'] = 'Спасибо. Ваша заявка сохранена.'; aprelik_redirect('/aprelik.php'); } catch (Throwable $e) { $_SESSION['aprelik_errors'] = ['Произошла ошибка при сохранении формы.']; $_SESSION['aprelik_old'] = $data; aprelik_redirect('/aprelik.php'); }