PHP "Fatal error" hatası

arda.nb01

Femtopat
Katılım
24 Ocak 2024
Mesajlar
42
Daha fazla  
Cinsiyet
Erkek
PHP'ye yeni başladım ve 2 sorunum var.
1. olarak Card kodu yazdım ama çalışmadı.
2. olarak sistemi hazırladım ama şu hatayı veriyor:
fatal error: Uncaught argumentcounterror: The number of variables must match the number of parameters in the prepared statement in C:\xampp\htdocs\uyelik\kayit.php:11 stack trace: #0 C:\xampp\htdocs\uyelik\kayit.php(11): mysqli_stmt_bind_param(object(mysqli_stmt), 'SSS', 'arda31', 'ardatutku999@gm...', '123345') #1 {main} thrown in C:\xampp\htdocs\uyelik\kayit.php on line 11
Kod:


PHP:
<?php
include("baglanti.php");

if(isset($_POST["kaydet"])) {
 $name = mysqli_real_escape_string($baglanti, $_POST["kullaniciadi"]);
 $email = mysqli_real_escape_string($baglanti, $_POST["email"]);
 $password = mysqli_real_escape_string($baglanti, $_POST["parola"]);

 $ekle = "INSERT INTO kullanicilar(kullanici_adi,email,parola) VALUES ('$name','$email','$password')";
 $stmt = mysqli_prepare($baglanti, $ekle);
 mysqli_stmt_bind_param($stmt, "sss", $name, $email, $password);
 $calistirekle = mysqli_stmt_execute($stmt);

 if ($calistirekle) {
 echo '<div class="alert alert-success" role="alert">
 başarılı bi şekilde kayıt oldun!
 </div>';
 } else {
 echo '<div class="alert alert-danger" role="alert">
 kayıt oluştururken bir hata meydana geldi!
 </div>';
 }

 mysqli_stmt_close($stmt);
}

mysqli_close($baglanti);
?>

<!doctype html>
<html lang="en">
 <head>
 <meta charset="utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>kayıt</title>
 </head>

 <body>
<div class="container">
 <div class="card">
 <form action= "kayit.php" method="POST">
 <div class="mb-3">
 <label for="exampleInputEmail1" class="form-label">kullanıcı adı</label>
 <input type="text" class="form-control" id="exampleInputEmail1" name="kullaniciadi">
 <div id="emailHelp" class="form-text"></div>
 </div>
 <div class="mb-3">
 <label for="exampleInputEmail1" class="form-label">E-posta</label>
 <input type="email" class="form-control" id="exampleInputEmail1" name="email">
 <div id="emailHelp" class="form-text"></div>
 </div>
 <div class="mb-3">
 <label for="exampleInputPassword1" class="form-label">şifre</label>
 <input type="password" class="form-control" id="exampleInputPassword1" name="parola">
 </div>
 <div class="mb-3 form-check">
 <input type="checkbox" class="form-check-input" id="exampleCheck1">
 <label class="form-check-label" for="exampleCheck1">beni unutma</label>
 </div>
 <button type="submit" class="btn btn-primary" name="kaydet">Kayıt Ol</button>
</form>
 </div>
</div>
 </body>
</html>
 
İlk olarak, "Card kodu" diyerek bahsettiğiniz şeyin tam olarak ne olduğunu netleştirebilir misiniz? Hangi koddan bahsettiğinizi ve nasıl bir çalışma beklediğinizi belirtir misiniz?

İkinci olarak, aldığınız hatanın nedeni, hazırlanan ifadenin parametrelerini bağlama işlemi sırasında hatalı sayıda parametre kullanmanızdır. Hazırlanan ifade için üç parametre bekleniyor ancak siz dört parametre sağlıyorsunuz. Bu nedenle hata alıyorsunuz.

Kodunuzdaki hatayı düzeltmek için, mysqli_stmt_bind_param() fonksiyonuna aktarılan parametre sayısını düzeltebilirsiniz. INSERT INTO sorgusu, kullanıcı adı, e-posta ve parola olmak üzere üç sütuna değer ekleyeceğinden, "sss" parametre belirtecini kullanmanız gerekmektedir. Ayrıca, mysqli_real_escape_string() kullanımı güvenlik açısından iyi bir yaklaşım olmasına rağmen, burada mysqli_stmt_bind_param() kullanıyoruz, bu nedenle mysqli_real_escape_string() kullanmanıza gerek yoktur. İşte düzeltilmiş kodunuz
Kod:
<?php
include("baglanti.php");

if(isset($_POST["kaydet"])) {
    $name = $_POST["kullaniciadi"];
    $email = $_POST["email"];
    $password = $_POST["parola"];

    $ekle = "INSERT INTO kullanicilar(kullanici_adi, email, parola) VALUES (?, ?, ?)";
    $stmt = mysqli_prepare($baglanti, $ekle);
    mysqli_stmt_bind_param($stmt, "sss", $name, $email, $password);
    $calistirekle = mysqli_stmt_execute($stmt);

    if ($calistirekle) {
        echo '<div class="alert alert-success" role="alert">
        Başarılı bir şekilde kayıt oldunuz!
        </div>';
    } else {
        echo '<div class="alert alert-danger" role="alert">
        Kayıt oluşturulurken bir hata meydana geldi!
        </div>';
    }

    mysqli_stmt_close($stmt);
}

mysqli_close($baglanti);
?>

Bu düzeltmeler yapıldığında, kodunuzun düzgün çalışması gerekmektedir. Ancak, güvenlik için daha ileri adımlar atılması gerekebilir. Örneğin, kullanıcı girişi verilerinin doğrulaması ve parolaların hashlenmesi gibi
 
Value'ları zaten stringe eklemişsin. Eklenecek bir şey yok ki. Bir daha ekletmeye çalışıyorsun eklenecek bir şey olmadığı için. Haliyle hata alıyorsun.

VALUES ('$name', '$email', '$password') dediğinde otomatik olarak string şuna dönüşüyor;
VALUES ('arda31', '[email protected]', '123345'), fakat fill için yapabilmesi için soru işareti bulması lazım.

Bind param yapacaksan ilk yazdığımı yapmayacaksın. Yada bind param yapma, ilki gibi yap. SQL Injection'a karşı string filtering yapmışsın zaten, ona ekstra bir şey dememe gerek yok.
 
İlk olarak, "Card kodu" diyerek bahsettiğiniz şeyin tam olarak ne olduğunu netleştirebilir misiniz? Hangi koddan bahsettiğinizi ve nasıl bir çalışma beklediğinizi belirtir misiniz?

İkinci olarak, aldığınız hatanın nedeni, hazırlanan ifadenin parametrelerini bağlama işlemi sırasında hatalı sayıda parametre kullanmanızdır. Hazırlanan ifade için üç parametre bekleniyor ancak siz dört parametre sağlıyorsunuz. Bu nedenle hata alıyorsunuz.

Kodunuzdaki hatayı düzeltmek için, mysqli_stmt_bind_param() fonksiyonuna aktarılan parametre sayısını düzeltebilirsiniz. INSERT INTO sorgusu, kullanıcı adı, e-posta ve parola olmak üzere üç sütuna değer ekleyeceğinden, "sss" parametre belirtecini kullanmanız gerekmektedir. Ayrıca, mysqli_real_escape_string() kullanımı güvenlik açısından iyi bir yaklaşım olmasına rağmen, burada mysqli_stmt_bind_param() kullanıyoruz, bu nedenle mysqli_real_escape_string() kullanmanıza gerek yoktur. İşte düzeltilmiş kodunuz
Kod:
<?php
include("baglanti.php");

if(isset($_POST["kaydet"])) {
 $name = $_POST["kullaniciadi"];
 $email = $_POST["email"];
 $password = $_POST["parola"];

 $ekle = "INSERT INTO kullanicilar(kullanici_adi, email, parola) VALUES (?, ?, ?)";
 $stmt = mysqli_prepare($baglanti, $ekle);
 mysqli_stmt_bind_param($stmt, "sss", $name, $email, $password);
 $calistirekle = mysqli_stmt_execute($stmt);

 if ($calistirekle) {
 echo '<div class="alert alert-success" role="alert">
 Başarılı bir şekilde kayıt oldunuz!
 </div>';
 } else {
 echo '<div class="alert alert-danger" role="alert">
 Kayıt oluşturulurken bir hata meydana geldi!
 </div>';
 }

 mysqli_stmt_close($stmt);
}

mysqli_close($baglanti);
?>

Bu düzeltmeler yapıldığında, kodunuzun düzgün çalışması gerekmektedir. Ancak, güvenlik için daha ileri adımlar atılması gerekebilir. Örneğin, kullanıcı girişi verilerinin doğrulaması ve parolaların hashlenmesi gibi

Mesela bunun gibi yapmak istiyorum Card derken bunu demek istemiştim yani CSS yazmak olarak düşünebiliriz bir de If'e atadığım başarılı ve başarısız mesajları istediğim gibi çalışmıyor

(54) PHP ile Veritabanına Üye Kayıt İşlemi #1 - YouTube - Google Chrome 26.03.2024 19_03_17.png
 
Mesela bunun gibi yapmak istiyorum Card derken bunu demek istemiştim yani CSS yazmak olarak düşünebiliriz bir de If'e atadığım başarılı ve başarısız mesajları istediğim gibi çalışmıyor
Adam bootstrap kullanmış. Sende bootstrap dahil edilmiş değil. Class vermişsin her elemente ama neye göre verdin? Hiç bir CSS dahil etmemişsin, o classlar hiç bir şey ifade etmiyor tarayıcıya bu şekilde.
 
Adam Bootstrap kullanmış. Sende Bootstrap dahil edilmiş değil. Class vermişsin her elemente ama neye göre verdin? Hiçbir CSS dahil etmemişsin, o classlar hiçbir şey ifade etmiyor tarayıcıya bu şekilde.

Bende adamın yaptığının aynısını yaptım adamın kullandığı kodlarla benimkinin bir farkına bakar mısın?
(54) PHP ile Veritabanına Üye Kayıt İşlemi #1 - YouTube - Google Chrome 27.03.2024 06_04_56.png
 

Yeni konular

Geri
Yukarı