Bu PHP kodunda yapılan işlemler, kullanıcıdan gelen bilgileri alıp bir veritabanına kaydetmeye yöneliktir. Kodu incelediğimde, gördüğüm bazı potansiyel hatalar ve eksiklikler şunlardır:- Veritabanı Bağlantısı Kontrolü Eksik: admin/ayar.php dosyasında veritabanı bağlantısı kurulmuş olmalı. Ancak bu dosyanın içeriği gösterilmemiş, bu nedenle $db nesnesinin düzgün bir şekilde PDO veya mysqli gibi bir veritabanı nesnesi olarak ayarlanıp ayarlanmadığını kontrol etmek önemlidir.
- SQL Injection Güvenlik Açığı: Kullanıcı girdileri doğrudan SQL sorgusuna parametre olarak geçiriliyor. Bu, hazırlanan sorgular (prepared statements) kullanılarak yapıldığı için SQL injection saldırılarına karşı bir koruma sağlar. Bu iyi bir uygulamadır.
- Hata Yönetimi: $db->prepare() işlemi başarısız olursa, bu kod bu durumu ele almaz. PDO için hata modunun (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) ayarlanmış olması iyi bir pratiktir. Bu, hata oluştuğunda daha açıklayıcı mesajlar almanızı sağlar.
- action Attribütü Boş: Formun action attribütü boş bırakılmış. Bu durumda form, kendini işleyen PHP kodu ile aynı dosyada olduğu için sorun teşkil etmez. Form verileri bu dosyaya POST edilir.
- Güvenlik Önlemleri: Kullanıcı girdilerini doğrudan işlemeden önce daha fazla güvenlik önlemi alınabilir. Örneğin, htmlspecialchars veya benzeri fonksiyonlar kullanılarak XSS saldırılarına karşı önlem alınabilir.
- POST Kontrolü: if($_POST) kullanmak, POST isteği olup olmadığını kontrol etmek için yaygın bir yöntemdir ancak daha spesifik bir kontrol (if ($_SERVER['REQUEST_METHOD'] == 'POST')) daha açıklayıcı olabilir.
Kodda belirgin bir "syntax error" veya mantıksal hata gözükmüyor. Ancak, kodunuzun doğru çalışabilmesi için admin/ayar.php dosyasında doğru bir PDO veritabanı bağlantısı yapılandırılması gerektiğini unutmayın. Ayrıca, kullanıcı girdilerinin doğruluğunu ve güvenliğini sağlamak için ek önlemler almanızı öneririm.
ChatGpt den yardım almayı denediniz mi? Çoğu zaman işe yarıyor. Sizin kodu ChatGpt ye verdim hataları söylemesini istedim yukarıdakileri yazdı.
Daha sonra hataları düzeltip tekrar kodu yazar mısın diye sordum. Şu kodu verdi, çalışıp çalışmayacağını bilmiyorum umarım işinize yarar.
<?php
include("admin/ayar.php");
// Veritabanı bağlantısında hata modunu ayarlama
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$ad = htmlspecialchars(trim($_POST["ad"]));
$mail = htmlspecialchars(trim($_POST["mail"]));
$instagram = htmlspecialchars(trim($_POST["instagram"]));
$tel = htmlspecialchars(trim($_POST["tel"]));
$mesaj = htmlspecialchars(trim($_POST["mesaj"]));
if(empty($ad) || empty($mail) || empty($instagram) || empty($tel) || empty($mesaj)) {
echo "Boş alan bırakmamalısınız.";
} else {
try {
$kaydet = $db->prepare("INSERT INTO iletisim (i_ad, i_mail, i_instagram, i_tel, i_mesaj) VALUES (?, ?, ?, ?, ?)");
$sonuc = $kaydet->execute([$ad, $mail, $instagram, $tel, $mesaj]);
if($sonuc) {
echo "Başvurunuz Gönderilmiştir";
} else {
echo "Bir hata oluştu, daha sonra tekrar deneyin.";
}
} catch (PDOException $e) {
echo "Veritabanı hatası: " . $e->getMessage();
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>BAŞVURU</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="fonts/material-design-iconic-font/css/material-design-iconic-font.min.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="wrapper">
<div class="inner">
<form action="" method="POST">
<h3>BAŞVURU</h3>
<label class="form-group">
<input type="text" name="ad" class="form-control" required>
<span>Ad Soyad</span>
<span class="border"></span>
</label>
<label class="form-group">
<input type="email" name="mail" class="form-control" required>
<span>Mail Adresi</span>
<span class="border"></span>
</label>
<label class="form-group">
<input type="text" name="instagram" class="form-control" required>
<span>Instagram Adresi</span>
<span class="border"></span>
</label>
<label class="form-group">
<input type="text" name="tel" class="form-control" required>
<span>Telefon Numarası</span>
<span class="border"></span>
</label>
<label class="form-group">
<textarea name="mesaj" class="form-control" required></textarea>
<span>Kendinizi tanıtınız (iş, okul, hobiler vb.)</span>
<span class="border"></span>
</label>
<button type="submit">Başvuruyu Gönder <i class="zmdi zmdi-arrow-right"></i></button>
</form>
</div>
</div>
</body>
</html>