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