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.