v2.5.2
Giriş yap

Benzersiz ID Oluşturma ve Kontrol Etme

redline
2,745 defa görüntülendi ve 1 kişi tarafından değerlendirildi
$code             = "111111";

$codeControl      = $db -> query("SELECT item_code FROM items WHERE item_code = '".$code."'") -> rowCount();

if ($codeControl != 0) {
  $code           = "222222";
}

Yukarıdaki işlemde $code değişkeni rand() vb. bir şekilde oluşturulmuş 6 haneli bir sayı. Bunu sipariş numarası olarak kabul edelim.

Veritabanına kaydetmeden önce $codeControl ile kontrol ediyorum. Eğer sonuç 0'a eşit değil ise if ile yeni bir $code oluşturuyorum.

Bu şekilde çakışmayı engellediğimi düşünüyordum fakat ya ikinci oluşturduğumuz $code'de çakışıyorsa?

if içinde if açarak tekrar kontrol ettirebiliriz, ancak oda çakışırsa diye sorun devam ediyor. :)

Döngü ile kontrol ettireyim dedim, bir türlü akıl erdiremedim. Yardımlarınızı bekliyorum. :)

Cevap yaz
Cevaplar (13)
shelby
1745 gün önce

Kodların resmi:
https://prnt.sc/r6lco3

shelby
1745 gün önce

Sonsuz döngü kur, eğer veritabanında yoksa code, döngüyü sonlandır. Şu yazdığım örneği inceleyebilirsin.
<?php

$r = range(0, 100, 2); // [0, 2, 4, 6, ..., 100] Çift Sayılar
$code = null;

// Kodumuzun tek bir sayı olmasını istiyoruz.

while(1) { // Sonsuz döngü
$code = rand(0, 100); // Rastgele Sayı
if(!in_array($code, $r)) { // Eğer $code $r arrayinin içerisinde yoksa döngüyü bitir.

   break;

}
else { // Eğer $code $r arrayinin içerisindeyse döngüye devam.

  echo $code." bu kod çift olduğu için döngüye devam. <br/>";

}
}

echo "Kodunuz hazır: ".$code;

pcmemo
1745 gün önce

Yukarı video linki eklemeyi unuttum.

https://youtu.be/LvMPxLC03Ks?t=65

pcmemo
1745 gün önce

bu videodaki yere 100000 yaz artık sipariş numaran 6 haneli ve uniq olacak. Gereksiz yere yan yollara sapıyorsun.

redline
1745 gün önce

@pcmemo

Hocam sıralı gitmesini istemememin sebebi, kullanıcıların o şekilde görmesini istememem sadece. Yani son siparişi oluşturan kişi kaç sipariş olduğunu aşağı yukarı tahmin edebilir oluyor o şekilde. Tamamen psikolojik yani sebebi. :)


@mehmet

regenerate'i çalıştıramadım hocam zaten, ben beceremedim sanırım. :) uniqid() fonksiyonunu daha önce araştırdım fakat gördüğüm kadarıyla 6 haneli bir sonuç elde edemiyoruz.


@shelby

Bu işlem için bir sınıf dahil etmek gerekir mi bilmiyorum ama sınıfı biraz inceledim hoşuma gitti, kenara attım teşekkür ederim. :)


Benim örnek olarak verdiğim kodu sonuç 0 verene kadar döndürecek bir döngü kuramaz mıyız, for vb. ile? :)

shelby
1749 gün önce

@redline
hashids kütüphanesini kullanabilirsin.
https://github.com/vinkla/hashids

Örnek:

<?php

require_once('vendor/autoload.php');

use HashidsHashids;

$salt = 'site_salt_anahtari_degistir';

$length = 6;

$id = 1923;

$hashids = new Hashids($salt, $length);

/
Alternatif
Key için özel harflerde seçebiliriz, hepsi küçük harf olacaktır.
$hashids = new Hashids($salt, 6, 'abcdefghijklmnopqrstuvwxyz');
/

$hash = $hashids->encode($id);

echo $hash."<br/>"; //aWKZrQ

echo $hashids->decode($hash)[0]; //1923

mehmet
1749 gün önce

İd yi bu şekilde regenerate etmeniz hatalı. Yine de benzersiz id yapacağım diyorsanız
1 ) uniqid(); fonksiyonunu kullanabilirsiniz

https://www.php.net/manual/tr/function.uniqid.php
pcmemo
1749 gün önce

Neden sıralı gitmesini sitemediğini de söylersen bakalım onun altında ne çıkacak. :)

redline
1749 gün önce

@shelby 6 haneli olarak şifreleme nasıl yapabilirim?

shelby
1749 gün önce

Veritabanı ID'sini Encrypt & Decrypt yapman bence daha uygun. Veritabanı ile uğraşma bence. Veritabanı id'sini encrypt edip kullanıcıya gösterirsin, kullanıcıdan aldığın veriyi de decrypt edip id'ye ulaşıp veritabanı işlemlerinde kullanabilirsin.

redline
1749 gün önce

@pcmemo hocam sıralı gitmesini istemediğim için böyle bir yol deniyorum. :)

pcmemo
1750 gün önce

Sormadan edemeyeceğim. NEden sipariş noyu sen vermeye çalışıyorsun, random yaptığına göre 6 basamaklı olmsının dışında özel bir amacı da yok.

SQL tablonda siparis_id (sana göre $code) kısmını PRIMARY ve AUTOINCREMENT yaparsan zaten her sipariş kaydında kendini tekrarlamayan kodu kendi verip kaydedektir.

Ddersen ki 6 haneli olsun diye yaptım. Zaten bahsettiğim işlemi 100000 den başla dersen ilk sipariş bile 6 basamaklı olacaktır. ikinci kayıt 100001 diye devam edecek.

pcmemo
1750 gün önce

Aşagıdaki gibi denersen eğer şifre tabloda varsa başa dönüp yeniden üretir.

regenerate:
$code = "111111";

$codeControl = $db -> query("SELECT item_code FROM items WHERE item_code = '".$code."'") -> rowCount();

if ($codeControl != 0) {
goto regenerate;
}