Benzersiz ID Oluşturma ve Kontrol Etme
$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. :)
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (13)
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;
Yukarı video linki eklemeyi unuttum.
@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? :)
@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
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.