ilgili kısımları bununla değiştirin.
if (empty($ad) || empty($mail) || empty($instagram) || empty($tel) || empty($mesaj) )
Basit php sorunu
15
●370
- 13-02-2024, 14:03:43Mesajı düzenledim de eklediğim kodu tekrar dener misiniz
BarisKarademir adlı üyeden alıntı: mesajı görüntüle - 13-02-2024, 14:06:51ntka adlı üyeden alıntı: mesajı görüntülemaalesef else döndürüyor yine olmadıruidemre adlı üyeden alıntı: mesajı görüntüle
- 13-02-2024, 14:43:32buyrun databaseruidemre adlı üyeden alıntı: mesajı görüntüle
-- phpMyAdmin SQL Dump -- version 5.0.3 -- https://www.phpmyadmin.net/ -- -- Anamakine: 127.0.0.1 -- Üretim Zamanı: 16 Şub 2021, 11:55:45 -- Sunucu sürümü: 10.4.14-MariaDB -- PHP Sürümü: 7.4.11 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Veritabanı: `barisvkg_com` -- -- -------------------------------------------------------- -- -- Tablo için tablo yapısı `iletisim` -- CREATE TABLE `iletisim` ( `i_id` int(11) NOT NULL, `i_ad` varchar(50) NOT NULL, `i_mail` varchar(50) NOT NULL, `i_mesaj` varchar(555) NOT NULL, `i_okundu` int(5) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -- Tablo döküm verisi `iletisim` -- INSERT INTO `iletisim` (`i_id`, `i_ad`, `i_mail`, `i_mesaj`, `i_okundu`) VALUES (10, 'Halil', 'halil@gmail.com', 'Lorem Ipsum, dizgi ve baskı endüstrisinde kullanılan mıgır metinlerdir. Lorem Ipsum, adı bilinmeyen bir matbaacının bir hurufat numune kitabı oluşturmak üzere bir yazı galerisini alarak karıştırdığı 1500\'lerden beri endüstri standardı sahte metinler olara', 0), (11, 'Mehmet', 'mehmet@gmail.com', 'leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop', 1); -- -------------------------------------------------------- -- -- Tablo için tablo yapısı `yonetici` -- CREATE TABLE `yonetici` ( `y_id` int(11) NOT NULL, `y_kad` varchar(50) NOT NULL, `y_pass` varchar(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -- Tablo döküm verisi `yonetici` -- INSERT INTO `yonetici` (`y_id`, `y_kad`, `y_pass`) VALUES (1, 'admin', 'admin'); -- -- Dökümü yapılmış tablolar için indeksler -- -- -- Tablo için indeksler `iletisim` -- ALTER TABLE `iletisim` ADD PRIMARY KEY (`i_id`); -- -- Tablo için indeksler `yonetici` -- ALTER TABLE `yonetici` ADD PRIMARY KEY (`y_id`); -- -- Dökümü yapılmış tablolar için AUTO_INCREMENT değeri -- -- -- Tablo için AUTO_INCREMENT değeri `iletisim` -- ALTER TABLE `iletisim` MODIFY `i_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=14; -- -- Tablo için AUTO_INCREMENT değeri `yonetici` -- ALTER TABLE `yonetici` MODIFY `y_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2; COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
- 13-02-2024, 14:55:43
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:
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ı.- 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.
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> - 13-02-2024, 15:46:19BarisKarademir adlı üyeden alıntı: mesajı görüntüle
database de i_instagram ve i_tel yok ayrıca i_okundu varsayılan değerini null veya tanımlandığı gibi -> 0 yaparsanız problem çözülür gibi. Ek olarak varchar(x) değerleri bazı durumlarda yeterli olmayabilir bunları text türüne dönüştürürseniz daha iyi olur

