Çözüldü PHP birden fazla kayıt engelleme

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

kroxlycode

Decapat
Katılım
28 Ekim 2022
Mesajlar
87
Çözümler
3
Daha fazla  
Sistem Özellikleri
Intel Core i7-13620H | RTX 4050 6GB | 16 GB DDR5 4800 MHz | 512 GB NVMe SSD | 180Hz
Cinsiyet
Erkek
Meslek
Yazılım Geliştirme
Merhaba dostlar, Ajax ile kayıt yapıyorum. Yapmak istediğim aynı mail varsa kaydedilmesin yani her mail için bir hesap olmasını istiyorum aynı maille bir daha hesap açılmasın. Kodu yazdım fakat hata falanda vermiyor. Email kontrolü yapmıyor.

PHP:
<?php
include "../vt/init.php";

$ad = $_POST["ad"];
$soyad = $_POST["soyad"];
$d_tarihi = $_POST["d_tarihi"];
$email = $_POST["email"];
$sifre = $_POST["sifre"];

$varolankullanici = DB::queryFirstRow("SELECT id FROM users WHERE email = ?", $email);

if ($varolankullanici) {
 echo "2";
} else {
 $ekle = DB::insert("INSERT INTO users (ad, soyad, d_tarihi, email, sifre) VALUES (?, ?, ?, ?, ?)", [$ad, $soyad, $d_tarihi, $email, $sifre]);

 if ($ekle) {
 echo "1";
 } else {
 echo "0";
 }
}
?>
 
Çözüm
Hocam, şöyle yapmayın gözünüzü seveyim bunu kod tarafında yapacaksınız.

PHP:
$email = $_POST['email'];
$CheckEmailRecord = $db->prepare("SELECT id,email FROM table WHERE email = :email");
$CheckEmailRecord->execute([":email" => $email]);

if ($CheckEmailRecord->rowCount() == 0) {

 // kullanici kayit kodlarin.

} else {
echo 2;
}

Veya

PHP:
$email = $_POST['email'];
$CheckEmailRecord = $db->prepare("SELECT count(*) as EmailCount FROM table WHERE email = :email");
$CheckEmailRecord->execute([":email" => $email]);
$RowFetch = $CheckEmailRecord->fetch(PDO::FETCH_ASSOC)

if (intval($RowFetch['EmailCount']) == 0) {

 // senin kayit kodlarin.

} else {

echo 2;

}

Bu ikisinden birini kendi dB OOP objenize göre uyarlayın.

Sorunu çözdüm.
PHP:
$varolankullanici = DB::queryFirstRow("SELECT id FROM users WHERE email =?", $email);
Yerine

PHP:
$varolankullanici = DB::getRow("SELECT id FROM users WHERE email = ?", [$email]);

Olacakmış.
Veritabanı baĝlantısı PDO olarak yapıyorum, sen kendine göre uyarla.
PHP:
<?php

    try {
        $db = new PDO("mysql:host={$db_host};dbname={$db_name}",$db_user,$db_pass);
        $db-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }   catch (PDOEXCEPTION $e) {
        echo $e->getMessage();
    }

$email = $_POST['email'];
$CheckEmailRecord = $db->prepare("SELECT id,email FROM table WHERE email = :email");
$CheckEmailRecord->execute([":email" => $email]);

if ($CheckEmailRecord->rowCount() == 0) {

 // senin kayit kodlarin.

} else {
 
echo 2;

}
 
Veritabanı baĝlantısı PDO olarak yapıyorum, sen kendine göre uyarla.
PHP:
<?php

    try {
        $db = new PDO("mysql:host={$db_host};dbname={$db_name}",$db_user,$db_pass);
        $db-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }   catch (PDOEXCEPTION $e) {
        echo $e->getMessage();
    }

$email = $_POST['email'];
$CheckEmailRecord = $db->prepare("SELECT id,email FROM table WHERE email = :email");
$CheckEmailRecord->execute([":email" => $email]);

if ($CheckEmailRecord->rowCount() == 0) {

 echo 2;

} else {

 // senin kayit kodlarin.

}
Veritabanı bağlantısı init.php üzerinde ya işte.
 
Veritabanı bağlantısı init.php üzerinde ya işte.
Biliyorum ancak özel bir veritabanı bağlantısı yaptıkları için obje öğelerini bilmiyorum.

Fetch yapmam gerekirse o biliyor ben değil. Ayrıca özel class içinde row count var mı yok mu onuda bilmiyoruz.

Ayrıca belirtmek isterim ki DB sorgusundan boolean olarak dönüş alıyor olmalı ki $varolankullanici değişkenini if döngüsüne fetchlemeden ve koşul uygulamadan koysun.

Yani benim yapacağım öneri max bu kadar olabilir, o kendisi ihtiyacına göre düzenleyecek.
 
Biliyorum ancak özel bir veri tabanı bağlantısı yaptıkları için obje öğelerini bilmiyorum.

Fetch yapmam gerekirse o biliyor ben değil. Ayrıca özel class içinde row count var mı yok mu onu da bilmiyoruz.

Atım bağlantıyı nasıl yaptığımı.

PHP:
config.php

<?php
ini_set("display_errors", 0);
define('MYSQL_HOST', 'localhost');
define('MYSQL_DB', 'a-ticaret');
define('MYSQL_USER', 'root');
define('MYSQL_PASS', '');
?>

db.php

<?
 //db
 ?>

init.php

 <?php
session_start();
include "config.php";
require_once "db.php";
?>
 
Atım bağlantıyı nasıl yaptığımı.

PHP:
config.php

<?php
ini_set("display_errors", 0);
define('MYSQL_HOST', 'localhost');
define('MYSQL_DB', 'a-ticaret');
define('MYSQL_USER', 'root');
define('MYSQL_PASS', '');
?>

db.php

<?
 //db
 ?>

init.php

 <?php
session_start();
include "config.php";
require_once "db.php";
?>
Hocam db.php dosyasında bağlantı, siz bize veritabanı kullanıcı detaylarıni atmışsınız.

Db.php boş olarak yazmışsınız*
 
Hocam peki ekliyor mu kaydı onu kontrol ettiniz mi ?
SELECT id FROM users WHERE email = ?
olan kısmı
SELECT id FROM users WHERE email = '?' yapıp denermisiniz bi
 
Neyi atmamı istiyorsunuz
Ben bir şeyi atmanızı istemiyorum, bir başkasına neden öyle yaptığımı anlattım o kadar #11inci yorumda bulabilirsiniz.

Eğer tam olarak anlamadıysanız. Şöyle ilerleyin.

Veritabanına email için sorgu yapın.
SQL:
SELECT count(*) as EmailCount FROM table WHERE email = '[email protected]'

Sonra bu sorguyu fetchleyin ve EmailCount'un 0 dan büyük olup olmadığını kontrol edin.

Ardından eğer büyük ise istediğinizi değilse diğer istediğiniz yolu izle diye bir if oluşturun. Olay bundan ibaret.

Zaten EMAIL kolonu veritabanı tablosunda Unique Index olarak indexlenmişse kaydederken otomatik olarak MySQL tarafında hata oluşuyor. Eğer bunuda Try Catch gibi bir şey ile yakalamaya çalışmıyorsanız hata çıktısı ile karşılaşmazsınız.
 
Hocam peki ekliyor mu kaydı onu kontrol ettiniz mi?
SELECT ID FROM users WHERE email =?
Olan kısmı
SELECT ID FROM users WHERE email = '?' yapıp dener misiniz bir

Kullanıcı ekliyor fakat aynı maille birden fazla kayıt yapabiliyor.

Ben bir şeyi atmanızı istemiyorum, bir başkasına neden öyle yaptığımı anlattım o kadar #11inci yorumda bulabilirsiniz.

Eğer tam olarak anlamadıysanız. Şöyle ilerleyin.

Veritabanına email için sorgu yapın.
SQL:
SELECT count(*) as EmailCount FROM table WHERE email = '[email protected]'

Sonra bu sorguyu fetchleyin ve EmailCount'un 0 dan büyük olup olmadığını kontrol edin.

Ardından eğer büyük ise istediğinizi değilse diğer istediğiniz yolu izle diye bir if oluşturun. Olay bundan ibaret.

Zaten EMAIL kolonu veritabanı tablosunda Unique Index olarak indexlenmişse kaydederken otomatik olarak MySQL tarafında hata oluşuyor. Eğer bunuda Try Catch gibi bir şey ile yakalamaya çalışmıyorsanız hata çıktısı ile karşılaşmazsınız.
1703582455962.png
 

Technopat Haberler

Yeni mesajlar

Geri
Yukarı