• 23-10-2024, 17:48:32
    #1
    Sabahtan beri çözemiyorum json.parse verip duruyor çıldırmak üzereyim lütfen yardım


    <?php 
    session_start(); 
    
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    if (isset($_SESSION['isLogged']) && $_SESSION['isLogged'] === true) {
        echo json_encode(['status' => 'redirect', 'url' => BASE_URL . '/Home']);
        exit; // Sonlandır
    }
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require '/xampp/htdocs/PHPMailer/src/Exception.php';
    require '/xampp/htdocs/PHPMailer/src/PHPMailer.php';
    require '/xampp/htdocs/PHPMailer/src/SMTP.php';
    // PDO bağlantısı
    global $DBSettings;
    $pdo = new PDO("odbc:DRIVER={$DBSettings['driver']};SERVER={$DBSettings['server']};DATABASE={$DBSettings['game_db']};charset=UTF-8", $DBSettings['uid'], $DBSettings['pass']);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // Çıkış tamponlamasını başlat
    ob_start();
    // JSON yanıt türünü belirt
    header('Content-Type: application/json');
    // Kullanıcı kaydı işlemi
    if (isset($_POST['strUserID'])) {
        $strUserID = trim($_POST['strUserID']);
        $Mail = trim($_POST['Mail']);
        $Password = trim($_POST['Password']);
        $RePassword = trim($_POST['RePassword']);
        $PhoneNumber = trim($_POST['PhoneNumber']);
        // Form doğrulama
        if (!$strUserID || !$Mail || !$Password || !$RePassword || !$PhoneNumber) {
            echo json_encode(['status' => 'error', 'message' => 'Lütfen tüm alanları doldurunuz.']);
            ob_end_flush();
            exit;
        } else if ($Password !== $RePassword) {
            echo json_encode(['status' => 'error', 'message' => 'Lütfen iki şifrenizi de aynı giriniz.']);
            ob_end_flush();
            exit;
        }
        // Kullanıcı, telefon ve mail var mı kontrol et
        $stmt = $pdo->prepare("SELECT COUNT(*) as count FROM DATA WHERE strUserID = :strUserID");
        $stmt->execute([':strUserID' => $strUserID]);
        if ($stmt->fetchColumn() > 0) {
            echo json_encode(['status' => 'error', 'message' => 'Bu kullanıcı adı zaten kullanılıyor.']);
            ob_end_flush();
            exit;
        }
        $stmt = $pdo->prepare("SELECT COUNT(*) as count FROM DATA WHERE PhoneNumber = :PhoneNumber");
        $stmt->execute([':PhoneNumber' => $PhoneNumber]);
        if ($stmt->fetchColumn() > 0) {
            echo json_encode(['status' => 'error', 'message' => 'Bu telefon numarası zaten kayıtlı.']);
            ob_end_flush();
            exit;
        }
        $stmt = $pdo->prepare("SELECT COUNT(*) as count FROM DATA WHERE Mail = :Mail");
        $stmt->execute([':Mail' => $Mail]);
        if ($stmt->fetchColumn() > 0) {
            echo json_encode(['status' => 'error', 'message' => 'Bu e-posta adresi zaten kayıtlı.']);
            ob_end_flush();
            exit;
        }
        // 6 basamaklı rastgele bir kod oluştur
        $verificationCode = rand(100000, 999999);
        // Kullanıcının e-postasına doğrulama kodunu gönder
        $mail = new PHPMailer(true);
        try {
            // E-posta ayarları
            $mail->isSMTP();
            $mail->Host = 'SMTP';
            $mail->SMTPAuth = true;
            $mail->Username = 'USER';
            $mail->Password = 'PASS';
            $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; 
            $mail->Port = 465; 
            $mail->setFrom('MAİL', 'Kayıt Onayı');
            $mail->addAddress($Mail);                
            $mail->isHTML(true);
            $mail->Subject = 'Kayıt Onayı';
            $mail->Body = "Kayıt işleminizi tamamlamak için doğrulama kodunuz: {$verificationCode}";
            if (!$mail->send()) {
                echo json_encode(['status' => 'error', 'message' => 'Email gönderimi başarısız. Hata: ' . $mail->ErrorInfo]);
                ob_end_flush();
                exit;
            }
            // Kullanıcının bilgilerini ve doğrulama kodunu veritabanına kaydet
            $stmt = $pdo->prepare("INSERT INTO DATA (strUserID, Mail, Password, PhoneNumber, VerificationCode, isVerified) VALUES (:strUserID, :Mail, :Password, :PhoneNumber, :VerificationCode, 0)");
            $stmt->execute([
                ':strUserID' => $strUserID,
                ':Mail' => $Mail,
                ':Password' => password_hash($Password, PASSWORD_BCRYPT), // Şifreyi hashle
                ':PhoneNumber' => $PhoneNumber,
                ':VerificationCode' => $verificationCode
            ]);
            echo json_encode(['status' => 'success', 'message' => 'Kayıt başarılı! E-postanıza gönderilen doğrulama kodunu giriniz.']);
            ob_end_flush();            
            exit;            
        } catch (Exception $e) {
            echo json_encode(['status' => 'error', 'message' => 'E-posta gönderimi başarısız. Hata: ' . $e->getMessage()]);
            ob_end_flush();
            exit;
        }
    }
    if (json_last_error() !== JSON_ERROR_NONE) {
        echo json_encode(['status' => 'error', 'message' => 'JSON encode hatası: ' . json_last_error_msg()]);
        ob_end_flush();
        exit;
    }
    // Kullanıcı doğrulama işlemi
    if (isset($_POST['verificationCode'])) {
        $inputCode = trim($_POST['verificationCode']);
        $strUserID = $_SESSION['strAccountID']; 
        // Veritabanından doğrulama kodunu kontrol et
        $stmt = $pdo->prepare("SELECT VerificationCode, isVerified FROM DATA WHERE strUserID = :strUserID");
        $stmt->execute([':strUserID' => $strUserID]);
        $checkCode = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($checkCode['isVerified'] == 1) {
            echo json_encode(['status' => 'error', 'message' => 'Bu hesap zaten doğrulanmış.']);
            ob_end_flush();
            exit;
        } else if ($checkCode['VerificationCode'] == $inputCode) {
            // Kullanıcıyı doğrula
            $stmt = $pdo->prepare("UPDATE DATA SET isVerified = 1 WHERE strUserID = :strUserID");
            $stmt->execute([':strUserID' => $strUserID]);
            // Oyun veritabanına kullanıcıyı ekleyelim
            $GetHash = $pdo->query("SELECT dbo.HashPasswordString('{$Password}') as HashPW")->fetch(PDO::FETCH_OBJ);
            $stmt = $pdo->prepare("INSERT INTO USER (strAccountID, strPasswd) VALUES (:strUserID, :strPasswd)");
            $stmt->execute([
                ':strUserID' => $strUserID,
                ':strPasswd' => $GetHash->HashPW
            ]);
            $_SESSION['isLogged'] = true;
            $_SESSION['strUserID'] = $strUserID;
            echo json_encode(['status' => 'success', 'message' => 'Hesabınız başarıyla doğrulandı.']);
            ob_end_flush();
            exit;
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Geçersiz doğrulama kodu.']);
            ob_end_flush();
            exit;
        }
    }
    
    ob_end_flush();
    ?>
  • 23-10-2024, 17:58:46
    #2
    fatbotter.com
    Hatayı da yazarsan iyi olur. Bu şekilde dener misin?



    <?php
    session_start();
    
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    // JSON response için yardımcı fonksiyon
    function sendJsonResponse($status, $message, $data = null) {
        header('Content-Type: application/json');
        $response = ['status' => $status, 'message' => $message];
        if ($data !== null) {
            $response['data'] = $data;
        }
        echo json_encode($response);
        exit;
    }
    
    if (isset($_SESSION['isLogged']) && $_SESSION['isLogged'] === true) {
        sendJsonResponse('redirect', '', ['url' => BASE_URL . '/Home']);
    }
    
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require '/xampp/htdocs/PHPMailer/src/Exception.php';
    require '/xampp/htdocs/PHPMailer/src/PHPMailer.php';
    require '/xampp/htdocs/PHPMailer/src/SMTP.php';
    
    try {
        global $DBSettings;
        $pdo = new PDO("odbc:DRIVER={$DBSettings['driver']};SERVER={$DBSettings['server']};DATABASE={$DBSettings['game_db']};charset=UTF-8", $DBSettings['uid'], $DBSettings['pass']);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        sendJsonResponse('error', 'Veritabanı bağlantı hatası: ' . $e->getMessage());
    }
    
    // Kullanıcı kaydı işlemi
    if (isset($_POST['strUserID'])) {
        try {
            $strUserID = trim($_POST['strUserID']);
            $Mail = trim($_POST['Mail']);
            $Password = trim($_POST['Password']);
            $RePassword = trim($_POST['RePassword']);
            $PhoneNumber = trim($_POST['PhoneNumber']);
    
            // Form doğrulama
            if (!$strUserID || !$Mail || !$Password || !$RePassword || !$PhoneNumber) {
                sendJsonResponse('error', 'Lütfen tüm alanları doldurunuz.');
            }
    
            if ($Password !== $RePassword) {
                sendJsonResponse('error', 'Lütfen iki şifrenizi de aynı giriniz.');
            }
    
            // Kullanıcı var mı kontrol
            $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE strUserID = ?");
            $stmt->execute([$strUserID]);
            if ($stmt->fetchColumn() > 0) {
                sendJsonResponse('error', 'Bu kullanıcı adı zaten kullanılıyor.');
            }
    
            // Telefon var mı kontrol
            $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE PhoneNumber = ?");
            $stmt->execute([$PhoneNumber]);
            if ($stmt->fetchColumn() > 0) {
                sendJsonResponse('error', 'Bu telefon numarası zaten kayıtlı.');
            }
    
            // Mail var mı kontrol
            $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE Mail = ?");
            $stmt->execute([$Mail]);
            if ($stmt->fetchColumn() > 0) {
                sendJsonResponse('error', 'Bu e-posta adresi zaten kayıtlı.');
            }
    
            // Doğrulama kodu oluştur
            $verificationCode = rand(100000, 999999);
    
            // Mail gönderimi
            $mail = new PHPMailer(true);
            $mail->isSMTP();
            $mail->Host = 'SMTP';
            $mail->SMTPAuth = true;
            $mail->Username = 'USER';
            $mail->Password = 'PASS';
            $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
            $mail->Port = 465;
            $mail->setFrom('MAİL', 'Kayıt Onayı');
            $mail->addAddress($Mail);
            $mail->isHTML(true);
            $mail->Subject = 'Kayıt Onayı';
            $mail->Body = "Kayıt işleminizi tamamlamak için doğrulama kodunuz: {$verificationCode}";
    
            if (!$mail->send()) {
                sendJsonResponse('error', 'Email gönderimi başarısız: ' . $mail->ErrorInfo);
            }
    
            // Kullanıcı bilgilerini session'a kaydet
            $_SESSION['temp_user'] = [
                'strUserID' => $strUserID,
                'Password' => $Password
            ];
    
            // Veritabanına kaydet
            $stmt = $pdo->prepare("INSERT INTO DATA (strUserID, Mail, Password, PhoneNumber, VerificationCode, isVerified) VALUES (?, ?, ?, ?, ?, 0)");
            $stmt->execute([
                $strUserID,
                $Mail,
                password_hash($Password, PASSWORD_BCRYPT),
                $PhoneNumber,
                $verificationCode
            ]);
    
            sendJsonResponse('success', 'Kayıt başarılı! E-postanıza gönderilen doğrulama kodunu giriniz.');
    
        } catch (Exception $e) {
            sendJsonResponse('error', 'İşlem sırasında bir hata oluştu: ' . $e->getMessage());
        }
    }
    
    // Doğrulama kodu kontrolü
    if (isset($_POST['verificationCode'])) {
        try {
            if (!isset($_SESSION['temp_user'])) {
                sendJsonResponse('error', 'Oturum bilgisi bulunamadı. Lütfen tekrar kayıt olun.');
            }
    
            $inputCode = trim($_POST['verificationCode']);
            $strUserID = $_SESSION['temp_user']['strUserID'];
            $Password = $_SESSION['temp_user']['Password'];
    
            $stmt = $pdo->prepare("SELECT VerificationCode, isVerified FROM DATA WHERE strUserID = ?");
            $stmt->execute([$strUserID]);
            $checkCode = $stmt->fetch(PDO::FETCH_ASSOC);
    
            if ($checkCode['isVerified'] == 1) {
                sendJsonResponse('error', 'Bu hesap zaten doğrulanmış.');
            }
    
            if ($checkCode['VerificationCode'] != $inputCode) {
                sendJsonResponse('error', 'Geçersiz doğrulama kodu.');
            }
    
            // Hesabı doğrula
            $stmt = $pdo->prepare("UPDATE DATA SET isVerified = 1 WHERE strUserID = ?");
            $stmt->execute([$strUserID]);
    
            // Oyun veritabanına ekle
            $GetHash = $pdo->query("SELECT dbo.HashPasswordString('{$Password}') as HashPW")->fetch(PDO::FETCH_OBJ);
            $stmt = $pdo->prepare("INSERT INTO USER (strAccountID, strPasswd) VALUES (?, ?)");
            $stmt->execute([
                $strUserID,
                $GetHash->HashPW
            ]);
    
            $_SESSION['isLogged'] = true;
            $_SESSION['strUserID'] = $strUserID;
            unset($_SESSION['temp_user']);
    
            sendJsonResponse('success', 'Hesabınız başarıyla doğrulandı.');
    
        } catch (Exception $e) {
            sendJsonResponse('error', 'Doğrulama sırasında bir hata oluştu: ' . $e->getMessage());
        }
    }
    ob_start() ve ob_end_flush() PHP'de çıktı tamponlaması (output buffering) için kullanılan fonksiyonlardır. Normal şartlarda bunlar faydalıdır, ancak JSON çıktısı verirken bazı sorunlara yol açabilirler:

    <?php
    ob_start();
    // ... kodlar ...
    
    // Bir yerde hata yakalandı
    echo json_encode(['status' => 'error', 'message' => 'Hata mesajı']);
    ob_end_flush();
    
    // ... başka kodlar ...
    
    // Başka bir yerde
    echo json_encode(['status' => 'success', 'message' => 'Başarılı']);
    ob_end_flush();
    Bu durumda buffer'da iki farklı JSON çıktısı birikebilir ve sonuç şöyle olabilir:

    {"status":"error","message":"Hata mesajı"}{"status":"success","message":"Başarılı"}
    Bu geçersiz bir JSON formatıdır ve parse edilemez.
  • 23-10-2024, 20:14:13
    #3
    lookout adlı üyeden alıntı: mesajı görüntüle
    Hatayı da yazarsan iyi olur. Bu şekilde dener misin?



    <?php
    session_start();
    
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    // JSON response için yardımcı fonksiyon
    function sendJsonResponse($status, $message, $data = null) {
        header('Content-Type: application/json');
        $response = ['status' => $status, 'message' => $message];
        if ($data !== null) {
            $response['data'] = $data;
        }
        echo json_encode($response);
        exit;
    }
    
    if (isset($_SESSION['isLogged']) && $_SESSION['isLogged'] === true) {
        sendJsonResponse('redirect', '', ['url' => BASE_URL . '/Home']);
    }
    
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require '/xampp/htdocs/PHPMailer/src/Exception.php';
    require '/xampp/htdocs/PHPMailer/src/PHPMailer.php';
    require '/xampp/htdocs/PHPMailer/src/SMTP.php';
    
    try {
        global $DBSettings;
        $pdo = new PDO("odbc:DRIVER={$DBSettings['driver']};SERVER={$DBSettings['server']};DATABASE={$DBSettings['game_db']};charset=UTF-8", $DBSettings['uid'], $DBSettings['pass']);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        sendJsonResponse('error', 'Veritabanı bağlantı hatası: ' . $e->getMessage());
    }
    
    // Kullanıcı kaydı işlemi
    if (isset($_POST['strUserID'])) {
        try {
            $strUserID = trim($_POST['strUserID']);
            $Mail = trim($_POST['Mail']);
            $Password = trim($_POST['Password']);
            $RePassword = trim($_POST['RePassword']);
            $PhoneNumber = trim($_POST['PhoneNumber']);
    
            // Form doğrulama
            if (!$strUserID || !$Mail || !$Password || !$RePassword || !$PhoneNumber) {
                sendJsonResponse('error', 'Lütfen tüm alanları doldurunuz.');
            }
    
            if ($Password !== $RePassword) {
                sendJsonResponse('error', 'Lütfen iki şifrenizi de aynı giriniz.');
            }
    
            // Kullanıcı var mı kontrol
            $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE strUserID = ?");
            $stmt->execute([$strUserID]);
            if ($stmt->fetchColumn() > 0) {
                sendJsonResponse('error', 'Bu kullanıcı adı zaten kullanılıyor.');
            }
    
            // Telefon var mı kontrol
            $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE PhoneNumber = ?");
            $stmt->execute([$PhoneNumber]);
            if ($stmt->fetchColumn() > 0) {
                sendJsonResponse('error', 'Bu telefon numarası zaten kayıtlı.');
            }
    
            // Mail var mı kontrol
            $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE Mail = ?");
            $stmt->execute([$Mail]);
            if ($stmt->fetchColumn() > 0) {
                sendJsonResponse('error', 'Bu e-posta adresi zaten kayıtlı.');
            }
    
            // Doğrulama kodu oluştur
            $verificationCode = rand(100000, 999999);
    
            // Mail gönderimi
            $mail = new PHPMailer(true);
            $mail->isSMTP();
            $mail->Host = 'SMTP';
            $mail->SMTPAuth = true;
            $mail->Username = 'USER';
            $mail->Password = 'PASS';
            $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
            $mail->Port = 465;
            $mail->setFrom('MAİL', 'Kayıt Onayı');
            $mail->addAddress($Mail);
            $mail->isHTML(true);
            $mail->Subject = 'Kayıt Onayı';
            $mail->Body = "Kayıt işleminizi tamamlamak için doğrulama kodunuz: {$verificationCode}";
    
            if (!$mail->send()) {
                sendJsonResponse('error', 'Email gönderimi başarısız: ' . $mail->ErrorInfo);
            }
    
            // Kullanıcı bilgilerini session'a kaydet
            $_SESSION['temp_user'] = [
                'strUserID' => $strUserID,
                'Password' => $Password
            ];
    
            // Veritabanına kaydet
            $stmt = $pdo->prepare("INSERT INTO DATA (strUserID, Mail, Password, PhoneNumber, VerificationCode, isVerified) VALUES (?, ?, ?, ?, ?, 0)");
            $stmt->execute([
                $strUserID,
                $Mail,
                password_hash($Password, PASSWORD_BCRYPT),
                $PhoneNumber,
                $verificationCode
            ]);
    
            sendJsonResponse('success', 'Kayıt başarılı! E-postanıza gönderilen doğrulama kodunu giriniz.');
    
        } catch (Exception $e) {
            sendJsonResponse('error', 'İşlem sırasında bir hata oluştu: ' . $e->getMessage());
        }
    }
    
    // Doğrulama kodu kontrolü
    if (isset($_POST['verificationCode'])) {
        try {
            if (!isset($_SESSION['temp_user'])) {
                sendJsonResponse('error', 'Oturum bilgisi bulunamadı. Lütfen tekrar kayıt olun.');
            }
    
            $inputCode = trim($_POST['verificationCode']);
            $strUserID = $_SESSION['temp_user']['strUserID'];
            $Password = $_SESSION['temp_user']['Password'];
    
            $stmt = $pdo->prepare("SELECT VerificationCode, isVerified FROM DATA WHERE strUserID = ?");
            $stmt->execute([$strUserID]);
            $checkCode = $stmt->fetch(PDO::FETCH_ASSOC);
    
            if ($checkCode['isVerified'] == 1) {
                sendJsonResponse('error', 'Bu hesap zaten doğrulanmış.');
            }
    
            if ($checkCode['VerificationCode'] != $inputCode) {
                sendJsonResponse('error', 'Geçersiz doğrulama kodu.');
            }
    
            // Hesabı doğrula
            $stmt = $pdo->prepare("UPDATE DATA SET isVerified = 1 WHERE strUserID = ?");
            $stmt->execute([$strUserID]);
    
            // Oyun veritabanına ekle
            $GetHash = $pdo->query("SELECT dbo.HashPasswordString('{$Password}') as HashPW")->fetch(PDO::FETCH_OBJ);
            $stmt = $pdo->prepare("INSERT INTO USER (strAccountID, strPasswd) VALUES (?, ?)");
            $stmt->execute([
                $strUserID,
                $GetHash->HashPW
            ]);
    
            $_SESSION['isLogged'] = true;
            $_SESSION['strUserID'] = $strUserID;
            unset($_SESSION['temp_user']);
    
            sendJsonResponse('success', 'Hesabınız başarıyla doğrulandı.');
    
        } catch (Exception $e) {
            sendJsonResponse('error', 'Doğrulama sırasında bir hata oluştu: ' . $e->getMessage());
        }
    }
    ob_start() ve ob_end_flush() PHP'de çıktı tamponlaması (output buffering) için kullanılan fonksiyonlardır. Normal şartlarda bunlar faydalıdır, ancak JSON çıktısı verirken bazı sorunlara yol açabilirler:

    <?php
    ob_start();
    // ... kodlar ...
    
    // Bir yerde hata yakalandı
    echo json_encode(['status' => 'error', 'message' => 'Hata mesajı']);
    ob_end_flush();
    
    // ... başka kodlar ...
    
    // Başka bir yerde
    echo json_encode(['status' => 'success', 'message' => 'Başarılı']);
    ob_end_flush();
    Bu durumda buffer'da iki farklı JSON çıktısı birikebilir ve sonuç şöyle olabilir:

    {"status":"error","message":"Hata mesajı"}{"status":"success","message":"Başarılı"}
    Bu geçersiz bir JSON formatıdır ve parse edilemez.
    SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
    hocam json kullanmasamda normal echo ile döndürsemde html olarak geliyor yanıtlar ama yanıt geliyor {"status":"error","message":"Bu kullanu0131cu0131 adu0131 zaten kullanu0131lu0131yor."} tabi html da birlikte geldiği için json parse ye düşüyor
  • 23-10-2024, 20:53:35
    #4
    CREATIVE35 adlı üyeden alıntı: mesajı görüntüle
    SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
    hocam json kullanmasamda normal echo ile döndürsemde html olarak geliyor yanıtlar ama yanıt geliyor {"status":"error","message":"Bu kullanu0131cu0131 adu0131 zaten kullanu0131lu0131yor."} tabi html da birlikte geldiği için json parse ye düşüyor
    <?php 
    session_start(); 
    
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    // JSON yanıt türünü en başta belirt
    header('Content-Type: application/json');
    ob_start();
    
    // Eğer kullanıcı zaten giriş yapmışsa yönlendir
    if (isset($_SESSION['isLogged']) && $_SESSION['isLogged'] === true) {
        echo json_encode(['status' => 'redirect', 'url' => BASE_URL . '/Home']);
        ob_end_flush();
        exit;
    }
    
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require '/xampp/htdocs/PHPMailer/src/Exception.php';
    require '/xampp/htdocs/PHPMailer/src/PHPMailer.php';
    require '/xampp/htdocs/PHPMailer/src/SMTP.php';
    
    try {
        // PDO bağlantısı
        global $DBSettings;
        $pdo = new PDO(
            "odbc:DRIVER={$DBSettings['driver']};SERVER={$DBSettings['server']};DATABASE={$DBSettings['game_db']};charset=UTF-8",
            $DBSettings['uid'],
            $DBSettings['pass']
        );
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
        // Kullanıcı kaydı işlemi
        if (isset($_POST['strUserID'])) {
            $strUserID = trim($_POST['strUserID']);
            $Mail = trim($_POST['Mail']);
            $Password = trim($_POST['Password']);
            $RePassword = trim($_POST['RePassword']);
            $PhoneNumber = trim($_POST['PhoneNumber']);
    
            // Form doğrulama
            if (empty($strUserID) || empty($Mail) || empty($Password) || empty($RePassword) || empty($PhoneNumber)) {
                throw new Exception('Lütfen tüm alanları doldurunuz.');
            }
    
            if ($Password !== $RePassword) {
                throw new Exception('Lütfen iki şifrenizi de aynı giriniz.');
            }
    
            // Kullanıcı, telefon ve mail kontrolü
            $checks = [
                ['field' => 'strUserID', 'value' => $strUserID, 'message' => 'Bu kullanıcı adı zaten kullanılıyor.'],
                ['field' => 'PhoneNumber', 'value' => $PhoneNumber, 'message' => 'Bu telefon numarası zaten kayıtlı.'],
                ['field' => 'Mail', 'value' => $Mail, 'message' => 'Bu e-posta adresi zaten kayıtlı.']
            ];
    
            foreach ($checks as $check) {
                $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE {$check['field']} = :value");
                $stmt->execute([':value' => $check['value']]);
                if ($stmt->fetchColumn() > 0) {
                    throw new Exception($check['message']);
                }
            }
    
            // Doğrulama kodu oluştur
            $verificationCode = rand(100000, 999999);
    
            // E-posta gönderimi
            $mail = new PHPMailer(true);
            $mail->isSMTP();
            $mail->Host = 'SMTP';
            $mail->SMTPAuth = true;
            $mail->Username = 'USER';
            $mail->Password = 'PASS';
            $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
            $mail->Port = 465;
            $mail->setFrom('MAİL', 'Kayıt Onayı');
            $mail->addAddress($Mail);
            $mail->isHTML(true);
            $mail->Subject = 'Kayıt Onayı';
            $mail->Body = "Kayıt işleminizi tamamlamak için doğrulama kodunuz: {$verificationCode}";
            $mail->send();
    
            // Kullanıcı kaydı
            $stmt = $pdo->prepare("INSERT INTO DATA (strUserID, Mail, Password, PhoneNumber, VerificationCode, isVerified) VALUES (:strUserID, :Mail, :Password, :PhoneNumber, :VerificationCode, 0)");
            $stmt->execute([
                ':strUserID' => $strUserID,
                ':Mail' => $Mail,
                ':Password' => password_hash($Password, PASSWORD_BCRYPT),
                ':PhoneNumber' => $PhoneNumber,
                ':VerificationCode' => $verificationCode
            ]);
    
            $_SESSION['strAccountID'] = $strUserID; // Doğrulama için kullanıcı ID'sini sakla
            
            echo json_encode(['status' => 'success', 'message' => 'Kayıt başarılı! E-postanıza gönderilen doğrulama kodunu giriniz.']);
        }
        // Doğrulama kodu kontrolü
        elseif (isset($_POST['verificationCode'])) {
            if (!isset($_SESSION['strAccountID'])) {
                throw new Exception('Oturum zaman aşımına uğradı. Lütfen tekrar kayıt olun.');
            }
    
            $inputCode = trim($_POST['verificationCode']);
            $strUserID = $_SESSION['strAccountID'];
    
            $stmt = $pdo->prepare("SELECT VerificationCode, isVerified FROM DATA WHERE strUserID = :strUserID");
            $stmt->execute([':strUserID' => $strUserID]);
            $checkCode = $stmt->fetch(PDO::FETCH_ASSOC);
    
            if (!$checkCode) {
                throw new Exception('Kullanıcı bulunamadı.');
            }
    
            if ($checkCode['isVerified'] == 1) {
                throw new Exception('Bu hesap zaten doğrulanmış.');
            }
    
            if ($checkCode['VerificationCode'] != $inputCode) {
                throw new Exception('Geçersiz doğrulama kodu.');
            }
    
            // Kullanıcıyı doğrula
            $stmt = $pdo->prepare("UPDATE DATA SET isVerified = 1 WHERE strUserID = :strUserID");
            $stmt->execute([':strUserID' => $strUserID]);
    
            // Oyun veritabanına kullanıcı ekleme
            $GetHash = $pdo->query("SELECT dbo.HashPasswordString('{$Password}') as HashPW")->fetch(PDO::FETCH_OBJ);
            $stmt = $pdo->prepare("INSERT INTO USER (strAccountID, strPasswd) VALUES (:strUserID, :strPasswd)");
            $stmt->execute([
                ':strUserID' => $strUserID,
                ':strPasswd' => $GetHash->HashPW
            ]);
    
            $_SESSION['isLogged'] = true;
            $_SESSION['strUserID'] = $strUserID;
    
            echo json_encode(['status' => 'success', 'message' => 'Hesabınız başarıyla doğrulandı.']);
        }
    
    } catch (Exception $e) {
        echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
    }
    
    ob_end_flush();
    Bu şekilde denermisin?
  • 23-10-2024, 20:59:02
    #5
    PropJoe adlı üyeden alıntı: mesajı görüntüle
    <?php
    session_start();
    
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    // JSON yanıt türünü en başta belirt
    header('Content-Type: application/json');
    ob_start();
    
    // Eğer kullanıcı zaten giriş yapmışsa yönlendir
    if (isset($_SESSION['isLogged']) && $_SESSION['isLogged'] === true) {
        echo json_encode(['status' => 'redirect', 'url' => BASE_URL . '/Home']);
        ob_end_flush();
        exit;
    }
    
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require '/xampp/htdocs/PHPMailer/src/Exception.php';
    require '/xampp/htdocs/PHPMailer/src/PHPMailer.php';
    require '/xampp/htdocs/PHPMailer/src/SMTP.php';
    
    try {
        // PDO bağlantısı
        global $DBSettings;
        $pdo = new PDO(
            "odbc:DRIVER={$DBSettings['driver']};SERVER={$DBSettings['server']};DATABASE={$DBSettings['game_db']};charset=UTF-8",
            $DBSettings['uid'],
            $DBSettings['pass']
        );
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
        // Kullanıcı kaydı işlemi
        if (isset($_POST['strUserID'])) {
            $strUserID = trim($_POST['strUserID']);
            $Mail = trim($_POST['Mail']);
            $Password = trim($_POST['Password']);
            $RePassword = trim($_POST['RePassword']);
            $PhoneNumber = trim($_POST['PhoneNumber']);
    
            // Form doğrulama
            if (empty($strUserID) || empty($Mail) || empty($Password) || empty($RePassword) || empty($PhoneNumber)) {
                throw new Exception('Lütfen tüm alanları doldurunuz.');
            }
    
            if ($Password !== $RePassword) {
                throw new Exception('Lütfen iki şifrenizi de aynı giriniz.');
            }
    
            // Kullanıcı, telefon ve mail kontrolü
            $checks = [
                ['field' => 'strUserID', 'value' => $strUserID, 'message' => 'Bu kullanıcı adı zaten kullanılıyor.'],
                ['field' => 'PhoneNumber', 'value' => $PhoneNumber, 'message' => 'Bu telefon numarası zaten kayıtlı.'],
                ['field' => 'Mail', 'value' => $Mail, 'message' => 'Bu e-posta adresi zaten kayıtlı.']
            ];
    
            foreach ($checks as $check) {
                $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE {$check['field']} = :value");
                $stmt->execute([':value' => $check['value']]);
                if ($stmt->fetchColumn() > 0) {
                    throw new Exception($check['message']);
                }
            }
    
            // Doğrulama kodu oluştur
            $verificationCode = rand(100000, 999999);
    
            // E-posta gönderimi
            $mail = new PHPMailer(true);
            $mail->isSMTP();
            $mail->Host = 'SMTP';
            $mail->SMTPAuth = true;
            $mail->Username = 'USER';
            $mail->Password = 'PASS';
            $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
            $mail->Port = 465;
            $mail->setFrom('MAİL', 'Kayıt Onayı');
            $mail->addAddress($Mail);
            $mail->isHTML(true);
            $mail->Subject = 'Kayıt Onayı';
            $mail->Body = "Kayıt işleminizi tamamlamak için doğrulama kodunuz: {$verificationCode}";
            $mail->send();
    
            // Kullanıcı kaydı
            $stmt = $pdo->prepare("INSERT INTO DATA (strUserID, Mail, Password, PhoneNumber, VerificationCode, isVerified) VALUES (:strUserID, :Mail, :Password, :PhoneNumber, :VerificationCode, 0)");
            $stmt->execute([
                ':strUserID' => $strUserID,
                ':Mail' => $Mail,
                ':Password' => password_hash($Password, PASSWORD_BCRYPT),
                ':PhoneNumber' => $PhoneNumber,
                ':VerificationCode' => $verificationCode
            ]);
    
            $_SESSION['strAccountID'] = $strUserID; // Doğrulama için kullanıcı ID'sini sakla
            
            echo json_encode(['status' => 'success', 'message' => 'Kayıt başarılı! E-postanıza gönderilen doğrulama kodunu giriniz.']);
        }
        // Doğrulama kodu kontrolü
        elseif (isset($_POST['verificationCode'])) {
            if (!isset($_SESSION['strAccountID'])) {
                throw new Exception('Oturum zaman aşımına uğradı. Lütfen tekrar kayıt olun.');
            }
    
            $inputCode = trim($_POST['verificationCode']);
            $strUserID = $_SESSION['strAccountID'];
    
            $stmt = $pdo->prepare("SELECT VerificationCode, isVerified FROM DATA WHERE strUserID = :strUserID");
            $stmt->execute([':strUserID' => $strUserID]);
            $checkCode = $stmt->fetch(PDO::FETCH_ASSOC);
    
            if (!$checkCode) {
                throw new Exception('Kullanıcı bulunamadı.');
            }
    
            if ($checkCode['isVerified'] == 1) {
                throw new Exception('Bu hesap zaten doğrulanmış.');
            }
    
            if ($checkCode['VerificationCode'] != $inputCode) {
                throw new Exception('Geçersiz doğrulama kodu.');
            }
    
            // Kullanıcıyı doğrula
            $stmt = $pdo->prepare("UPDATE DATA SET isVerified = 1 WHERE strUserID = :strUserID");
            $stmt->execute([':strUserID' => $strUserID]);
    
            // Oyun veritabanına kullanıcı ekleme
            $GetHash = $pdo->query("SELECT dbo.HashPasswordString('{$Password}') as HashPW")->fetch(PDO::FETCH_OBJ);
            $stmt = $pdo->prepare("INSERT INTO USER (strAccountID, strPasswd) VALUES (:strUserID, :strPasswd)");
            $stmt->execute([
                ':strUserID' => $strUserID,
                ':strPasswd' => $GetHash->HashPW
            ]);
    
            $_SESSION['isLogged'] = true;
            $_SESSION['strUserID'] = $strUserID;
    
            echo json_encode(['status' => 'success', 'message' => 'Hesabınız başarıyla doğrulandı.']);
        }
    
    } catch (Exception $e) {
        echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
    }
    
    ob_end_flush();
    Bu şekilde denermisin?
    malesef sayfayı açar açmaz submit yapmadan
    SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
  • 23-10-2024, 21:01:17
    #6
    CREATIVE35 adlı üyeden alıntı: mesajı görüntüle
    malesef sayfayı açar açmaz submit yapmadan
    SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
    Gerekli eklentilerin kurulu olduğuna eminmisin?

    <?php
    session_start();
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    // JSON yanıt türünü en başta belirt
    header('Content-Type: application/json');
    
    // Sayfa ilk yüklendiğinde bir işlem yapılmıyorsa boş bir JSON objesi döndür
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        echo json_encode(['status' => 'idle']);
        exit;
    }
    
    use PHPMailer\PHPMailer\PHPMailer;
    use PHPMailer\PHPMailer\Exception;
    require '/xampp/htdocs/PHPMailer/src/Exception.php';
    require '/xampp/htdocs/PHPMailer/src/PHPMailer.php';
    require '/xampp/htdocs/PHPMailer/src/SMTP.php';
    
    // Eğer kullanıcı zaten giriş yapmışsa yönlendir
    if (isset($_SESSION['isLogged']) && $_SESSION['isLogged'] === true) {
        echo json_encode(['status' => 'redirect', 'url' => BASE_URL . '/Home']);
        exit;
    }
    
    try {
        // PDO bağlantısı
        global $DBSettings;
        $pdo = new PDO(
            "odbc:DRIVER={$DBSettings['driver']};SERVER={$DBSettings['server']};DATABASE={$DBSettings['game_db']};charset=UTF-8",
            $DBSettings['uid'],
            $DBSettings['pass']
        );
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
        // Kullanıcı kaydı işlemi
        if (isset($_POST['strUserID'])) {
            $strUserID = trim($_POST['strUserID']);
            $Mail = trim($_POST['Mail']);
            $Password = trim($_POST['Password']);
            $RePassword = trim($_POST['RePassword']);
            $PhoneNumber = trim($_POST['PhoneNumber']);
    
            // Form doğrulama
            if (empty($strUserID) || empty($Mail) || empty($Password) || empty($RePassword) || empty($PhoneNumber)) {
                throw new Exception('Lütfen tüm alanları doldurunuz.');
            }
    
            if ($Password !== $RePassword) {
                throw new Exception('Lütfen iki şifrenizi de aynı giriniz.');
            }
    
            // Kullanıcı, telefon ve mail kontrolü
            $checks = [
                ['field' => 'strUserID', 'value' => $strUserID, 'message' => 'Bu kullanıcı adı zaten kullanılıyor.'],
                ['field' => 'PhoneNumber', 'value' => $PhoneNumber, 'message' => 'Bu telefon numarası zaten kayıtlı.'],
                ['field' => 'Mail', 'value' => $Mail, 'message' => 'Bu e-posta adresi zaten kayıtlı.']
            ];
    
            foreach ($checks as $check) {
                $stmt = $pdo->prepare("SELECT COUNT(*) FROM DATA WHERE {$check['field']} = :value");
                $stmt->execute([':value' => $check['value']]);
                if ($stmt->fetchColumn() > 0) {
                    throw new Exception($check['message']);
                }
            }
    
            // Doğrulama kodu oluştur
            $verificationCode = rand(100000, 999999);
    
            // E-posta gönderimi
            $mail = new PHPMailer(true);
            $mail->isSMTP();
            $mail->Host = 'SMTP';
            $mail->SMTPAuth = true;
            $mail->Username = 'USER';
            $mail->Password = 'PASS';
            $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
            $mail->Port = 465;
            $mail->setFrom('MAİL', 'Kayıt Onayı');
            $mail->addAddress($Mail);
            $mail->isHTML(true);
            $mail->Subject = 'Kayıt Onayı';
            $mail->Body = "Kayıt işleminizi tamamlamak için doğrulama kodunuz: {$verificationCode}";
            $mail->send();
    
            // Kullanıcı kaydı
            $stmt = $pdo->prepare("INSERT INTO DATA (strUserID, Mail, Password, PhoneNumber, VerificationCode, isVerified) VALUES (:strUserID, :Mail, :Password, :PhoneNumber, :VerificationCode, 0)");
            $stmt->execute([
                ':strUserID' => $strUserID,
                ':Mail' => $Mail,
                ':Password' => password_hash($Password, PASSWORD_BCRYPT),
                ':PhoneNumber' => $PhoneNumber,
                ':VerificationCode' => $verificationCode
            ]);
    
            $_SESSION['strAccountID'] = $strUserID; // Doğrulama için kullanıcı ID'sini sakla
            
            echo json_encode(['status' => 'success', 'message' => 'Kayıt başarılı! E-postanıza gönderilen doğrulama kodunu giriniz.']);
        }
        // Doğrulama kodu kontrolü
        elseif (isset($_POST['verificationCode'])) {
            if (!isset($_SESSION['strAccountID'])) {
                throw new Exception('Oturum zaman aşımına uğradı. Lütfen tekrar kayıt olun.');
            }
    
            $inputCode = trim($_POST['verificationCode']);
            $strUserID = $_SESSION['strAccountID'];
    
            $stmt = $pdo->prepare("SELECT VerificationCode, isVerified FROM DATA WHERE strUserID = :strUserID");
            $stmt->execute([':strUserID' => $strUserID]);
            $checkCode = $stmt->fetch(PDO::FETCH_ASSOC);
    
            if (!$checkCode) {
                throw new Exception('Kullanıcı bulunamadı.');
            }
    
            if ($checkCode['isVerified'] == 1) {
                throw new Exception('Bu hesap zaten doğrulanmış.');
            }
    
            if ($checkCode['VerificationCode'] != $inputCode) {
                throw new Exception('Geçersiz doğrulama kodu.');
            }
    
            // Kullanıcıyı doğrula
            $stmt = $pdo->prepare("UPDATE DATA SET isVerified = 1 WHERE strUserID = :strUserID");
            $stmt->execute([':strUserID' => $strUserID]);
    
            // Oyun veritabanına kullanıcı ekleme
            $GetHash = $pdo->query("SELECT dbo.HashPasswordString('{$Password}') as HashPW")->fetch(PDO::FETCH_OBJ);
            $stmt = $pdo->prepare("INSERT INTO USER (strAccountID, strPasswd) VALUES (:strUserID, :strPasswd)");
            $stmt->execute([
                ':strUserID' => $strUserID,
                ':strPasswd' => $GetHash->HashPW
            ]);
    
            $_SESSION['isLogged'] = true;
            $_SESSION['strUserID'] = $strUserID;
    
            echo json_encode(['status' => 'success', 'message' => 'Hesabınız başarıyla doğrulandı.']);
        }
    
    } catch (Exception $e) {
        echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
    } catch (PDOException $e) {
        echo json_encode(['status' => 'error', 'message' => 'Veritabanı hatası: ' . $e->getMessage()]);
    }
    Bunu deneyin bakalım.
  • 23-10-2024, 22:12:13
    #7
    sorunu çözdüm teşekkür ederim ilgilenen arkadaşlara kodumda ilk başta hata yokmuş routerden bir sıkıntı oluştuğu için yaşadığım bir şeymiş