From 1ed05ab42cd37372545812a2810f56a98492e9f9 Mon Sep 17 00:00:00 2001 From: Furkan YILDIRIM Date: Tue, 12 Nov 2024 00:14:36 +0300 Subject: [PATCH] hotfix --- src/modules/profile/edit.php | 325 +++++++++++++++++++--------------- src/modules/profile/setup.php | 74 ++++++-- 2 files changed, 244 insertions(+), 155 deletions(-) diff --git a/src/modules/profile/edit.php b/src/modules/profile/edit.php index 30de885..01fbf07 100644 --- a/src/modules/profile/edit.php +++ b/src/modules/profile/edit.php @@ -8,25 +8,34 @@ $error = ''; $success = ''; +$profile = []; +$healthConditions = []; +$userData = []; try { $db = new Database(); $conn = $db->getConnection(); - // Mevcut kullanıcı bilgilerini çek - $stmt = $conn->prepare(" - SELECT u.*, up.* - FROM users u - LEFT JOIN user_profiles up ON u.id = up.user_id - WHERE u.id = ? - "); + // Kullanıcı bilgilerini çek + $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$_SESSION['user_id']]); - $user = $stmt->fetch(PDO::FETCH_ASSOC); + $userData = $stmt->fetch(PDO::FETCH_ASSOC); + + // Mevcut profil bilgilerini çek + $stmt = $conn->prepare("SELECT * FROM user_profiles WHERE user_id = ?"); + $stmt->execute([$_SESSION['user_id']]); + $profile = $stmt->fetch(PDO::FETCH_ASSOC); + + if(!$profile) { + redirect('/modules/profile/setup.php'); + } + + // Sağlık durumlarını çek + $stmt = $conn->prepare("SELECT condition_name FROM health_conditions WHERE user_id = ?"); + $stmt->execute([$_SESSION['user_id']]); + $healthConditions = $stmt->fetchAll(PDO::FETCH_COLUMN); if ($_SERVER['REQUEST_METHOD'] == 'POST') { - // Form verilerini al - $name = clean($_POST['name']); - $email = clean($_POST['email']); $age = clean($_POST['age']); $gender = clean($_POST['gender']); $height = clean($_POST['height']); @@ -37,96 +46,132 @@ $health_conditions = isset($_POST['health_conditions']) ? $_POST['health_conditions'] : []; // Validasyon - if(empty($name) || empty($email)) { - $error = 'Ad ve email alanları zorunludur.'; - } elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)) { - $error = 'Geçerli bir email adresi girin.'; + if(empty($age) || empty($gender) || empty($height) || empty($current_weight) || empty($target_weight)) { + $error = 'Lütfen tüm zorunlu alanları doldurun.'; + } elseif($age < 15 || $age > 100) { + $error = 'Geçerli bir yaş girin.'; + } elseif($height < 100 || $height > 250) { + $error = 'Geçerli bir boy girin.'; + } elseif($current_weight < 30 || $current_weight > 300) { + $error = 'Geçerli bir kilo girin.'; + } elseif($target_weight < 30 || $target_weight > 300) { + $error = 'Geçerli bir hedef kilo girin.'; } else { - // Email değişikliği varsa, başka kullanıcıda kullanılıyor mu kontrol et - if($email !== $user['email']) { - $stmt = $conn->prepare("SELECT id FROM users WHERE email = ? AND id != ?"); - $stmt->execute([$email, $_SESSION['user_id']]); - if($stmt->fetch()) { - $error = 'Bu email adresi başka bir kullanıcı tarafından kullanılıyor.'; + // OpenAI'dan kalori hesaplaması + $prompt = "Lütfen şu bilgilere göre günlük kalori ihtiyacını hesapla ve sadece sayısal değer ver: + Yaş: {$age}, + Cinsiyet: " . ($gender == 'male' ? 'erkek' : 'kadın') . ", + Kilo: {$current_weight} kg, + Boy: {$height} cm, + Aktivite seviyesi: " . ($activity_level == 'sedentary' ? 'hareketsiz' : + ($activity_level == 'lightly_active' ? 'az hareketli' : + ($activity_level == 'moderately_active' ? 'orta hareketli' : 'çok hareketli'))) . " + Hedef: " . ($target_weight < $current_weight ? 'kilo vermek' : + ($target_weight > $current_weight ? 'kilo almak' : 'kiloyu korumak')) . " + + Lütfen sadece günlük kalori ihtiyacını rakam olarak ver. Örnek: 2000"; + + try { + $response = askOpenAI($prompt); + + // Yanıttan sadece sayıyı çıkar + preg_match('/\d+/', $response['choices'][0]['message']['content'], $matches); + $daily_calorie = isset($matches[0]) ? intval($matches[0]) : 2000; + + // Mantıklı bir aralıkta olup olmadığını kontrol et + if ($daily_calorie < 1200 || $daily_calorie > 4000) { + $daily_calorie = 2000; } - } - if(empty($error)) { - // Kullanıcı tablosunu güncelle - $stmt = $conn->prepare(" - UPDATE users - SET name = ?, email = ? - WHERE id = ? - "); - $stmt->execute([$name, $email, $_SESSION['user_id']]); + // Hedef kiloya göre kalori ayarlaması + if ($target_weight < $current_weight) { + // Kilo vermek için günlük 500 kalori azalt + $daily_calorie = max(1200, $daily_calorie - 500); + } elseif ($target_weight > $current_weight) { + // Kilo almak için günlük 500 kalori ekle + $daily_calorie = min(4000, $daily_calorie + 500); + } - // Profil tablosunu güncelle - $stmt = $conn->prepare(" - INSERT INTO user_profiles ( - user_id, age, gender, height, current_weight, - target_weight, activity_level, diet_type - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) - ON DUPLICATE KEY UPDATE - age = VALUES(age), - gender = VALUES(gender), - height = VALUES(height), - current_weight = VALUES(current_weight), - target_weight = VALUES(target_weight), - activity_level = VALUES(activity_level), - diet_type = VALUES(diet_type) - "); - $stmt->execute([ - $_SESSION['user_id'], $age, $gender, $height, - $current_weight, $target_weight, $activity_level, $diet_type - ]); - - // Sağlık durumlarını güncelle - $stmt = $conn->prepare("DELETE FROM health_conditions WHERE user_id = ?"); - $stmt->execute([$_SESSION['user_id']]); - - if(!empty($health_conditions)) { - $stmt = $conn->prepare(" - INSERT INTO health_conditions (user_id, condition_name) - VALUES (?, ?) - "); - foreach($health_conditions as $condition) { - $stmt->execute([$_SESSION['user_id'], $condition]); - } + } catch (Exception $e) { + // Hata durumunda Harris-Benedict formülü ile hesapla + if ($gender == 'male') { + $bmr = 88.362 + (13.397 * $current_weight) + (4.799 * $height) - (5.677 * $age); + } else { + $bmr = 447.593 + (9.247 * $current_weight) + (3.098 * $height) - (4.330 * $age); } - // Kalori limitini OpenAI ile hesapla - $prompt = "Lütfen şu bilgilere göre günlük kalori ihtiyacını hesapla: - Yaş: $age, - Cinsiyet: $gender, - Kilo: $current_weight kg, - Boy: $height cm, - Aktivite seviyesi: $activity_level. - Sadece sayısal değeri ver."; + // Aktivite faktörü + $activity_factors = [ + 'sedentary' => 1.2, + 'lightly_active' => 1.375, + 'moderately_active' => 1.55, + 'very_active' => 1.725 + ]; - $response = askOpenAI($prompt); - $daily_calorie = intval($response['choices'][0]['message']['content']); + $daily_calorie = round($bmr * ($activity_factors[$activity_level] ?? 1.2)); + + // Hedef kiloya göre ayarlama + if ($target_weight < $current_weight) { + $daily_calorie = max(1200, $daily_calorie - 500); + } elseif ($target_weight > $current_weight) { + $daily_calorie = min(4000, $daily_calorie + 500); + } + } + + // Profili güncelle + $stmt = $conn->prepare(" + UPDATE user_profiles + SET age = ?, + gender = ?, + height = ?, + current_weight = ?, + target_weight = ?, + activity_level = ?, + diet_type = ?, + daily_calorie_limit = ? + WHERE user_id = ? + "); + + $stmt->execute([ + $age, + $gender, + $height, + $current_weight, + $target_weight, + $activity_level, + $diet_type, + $daily_calorie, + $_SESSION['user_id'] + ]); - // Kalori limitini güncelle + // Sağlık durumlarını güncelle + $stmt = $conn->prepare("DELETE FROM health_conditions WHERE user_id = ?"); + $stmt->execute([$_SESSION['user_id']]); + + if(!empty($health_conditions)) { $stmt = $conn->prepare(" - UPDATE user_profiles - SET daily_calorie_limit = ? - WHERE user_id = ? + INSERT INTO health_conditions (user_id, condition_name) + VALUES (?, ?) "); - $stmt->execute([$daily_calorie, $_SESSION['user_id']]); - - $success = 'Profil bilgileriniz başarıyla güncellendi.'; + foreach($health_conditions as $condition) { + $stmt->execute([$_SESSION['user_id'], $condition]); + } + } - // Session'daki kullanıcı adını güncelle - $_SESSION['user_name'] = $name; + // Kilo değişimi olduysa weight_tracking tablosuna ekle + if($current_weight != $profile['current_weight']) { + $stmt = $conn->prepare(" + INSERT INTO weight_tracking (user_id, weight, date) + VALUES (?, ?, CURRENT_DATE) + "); + $stmt->execute([$_SESSION['user_id'], $current_weight]); } + + $success = 'Profil bilgileriniz başarıyla güncellendi.'; + header("refresh:2;url=" . SITE_URL . "/modules/profile/view.php"); } } - // Mevcut sağlık durumlarını çek - $stmt = $conn->prepare("SELECT condition_name FROM health_conditions WHERE user_id = ?"); - $stmt->execute([$_SESSION['user_id']]); - $health_conditions = $stmt->fetchAll(PDO::FETCH_COLUMN); - } catch (PDOException $e) { error_log("Profile Edit Error: " . $e->getMessage()); $error = 'Bir hata oluştu, lütfen tekrar deneyin.'; @@ -139,135 +184,127 @@
-
-
- Profil Düzenle -
+
+

+ Profil Düzenle +

-
diff --git a/src/modules/profile/setup.php b/src/modules/profile/setup.php index 063178e..9d373bf 100644 --- a/src/modules/profile/setup.php +++ b/src/modules/profile/setup.php @@ -1,6 +1,4 @@ execute([$_SESSION['user_id']]); $profile = $stmt->fetch(PDO::FETCH_ASSOC); + // Sağlık durumlarını çek + $stmt = $conn->prepare("SELECT condition_name FROM health_conditions WHERE user_id = ?"); + $stmt->execute([$_SESSION['user_id']]); + $healthConditions = $stmt->fetchAll(PDO::FETCH_COLUMN); + if ($_SERVER['REQUEST_METHOD'] == 'POST') { $age = clean($_POST['age']); $gender = clean($_POST['gender']); @@ -43,16 +46,65 @@ $error = 'Geçerli bir hedef kilo girin.'; } else { // OpenAI'dan kalori hesaplaması - $prompt = "Lütfen şu bilgilere göre günlük kalori ihtiyacını hesapla: - Yaş: $age, - Cinsiyet: $gender, - Kilo: $current_weight kg, - Boy: $height cm, - Aktivite seviyesi: $activity_level. - Sadece sayısal değeri ver."; + $prompt = "Lütfen şu bilgilere göre günlük kalori ihtiyacını hesapla ve sadece sayısal değer ver: + Yaş: {$age}, + Cinsiyet: " . ($gender == 'male' ? 'erkek' : 'kadın') . ", + Kilo: {$current_weight} kg, + Boy: {$height} cm, + Aktivite seviyesi: " . ($activity_level == 'sedentary' ? 'hareketsiz' : + ($activity_level == 'lightly_active' ? 'az hareketli' : + ($activity_level == 'moderately_active' ? 'orta hareketli' : 'çok hareketli'))) . " + Hedef: " . ($target_weight < $current_weight ? 'kilo vermek' : + ($target_weight > $current_weight ? 'kilo almak' : 'kiloyu korumak')) . " + + Lütfen sadece günlük kalori ihtiyacını rakam olarak ver. Örnek: 2000"; + + try { + $response = askOpenAI($prompt); - $response = askOpenAI($prompt); - $daily_calorie = intval($response['choices'][0]['message']['content']); + // Yanıttan sadece sayıyı çıkar + preg_match('/\d+/', $response['choices'][0]['message']['content'], $matches); + $daily_calorie = isset($matches[0]) ? intval($matches[0]) : 2000; + + // Mantıklı bir aralıkta olup olmadığını kontrol et + if ($daily_calorie < 1200 || $daily_calorie > 4000) { + $daily_calorie = 2000; + } + + // Hedef kiloya göre kalori ayarlaması + if ($target_weight < $current_weight) { + // Kilo vermek için günlük 500 kalori azalt + $daily_calorie = max(1200, $daily_calorie - 500); + } elseif ($target_weight > $current_weight) { + // Kilo almak için günlük 500 kalori ekle + $daily_calorie = min(4000, $daily_calorie + 500); + } + + } catch (Exception $e) { + // Hata durumunda Harris-Benedict formülü ile hesapla + if ($gender == 'male') { + $bmr = 88.362 + (13.397 * $current_weight) + (4.799 * $height) - (5.677 * $age); + } else { + $bmr = 447.593 + (9.247 * $current_weight) + (3.098 * $height) - (4.330 * $age); + } + + // Aktivite faktörü + $activity_factors = [ + 'sedentary' => 1.2, + 'lightly_active' => 1.375, + 'moderately_active' => 1.55, + 'very_active' => 1.725 + ]; + + $daily_calorie = round($bmr * ($activity_factors[$activity_level] ?? 1.2)); + + // Hedef kiloya göre ayarlama + if ($target_weight < $current_weight) { + $daily_calorie = max(1200, $daily_calorie - 500); + } elseif ($target_weight > $current_weight) { + $daily_calorie = min(4000, $daily_calorie + 500); + } + } // Profil oluştur veya güncelle if($profile) {