v2.5.2
Giriş yap

Random Sipariş Numarası Oluşturma

ufukozdemir
468 defa görüntülendi

Merhaba

Aşağıdaki gibi Random sipariş no oluşturuyorum.

    substr(rand(10000000,99999999), 0, 6);

Şöyle bir sorunum var oluşturduğu sipariş no databasede var ise tekrardan yeni random sipariş no oluşturtursun. Şayet bu oluşturduğu random sipariş no da var ise tekrardan bir sipariş no oluştursun.

Açıkcası döngünü hiç olmayan sipariş no bulana kadar dönmesini istiyorum.

Bunu hangi mantıkta yapabilirim.

Umarım anlatabilmişimdir derdimi :)

Cevap yaz
Cevaplar (7)
kargasa1982
641 gün önce

$siparisno = microtime(true);

sadece bu kadarı yeter sana, zamana bağlı olduğu için hiç bir zaman aynı sayı denk gelmez.

hashdash
629 gün önce

Dostum mantık basit.
Önce var olan sayıyı veritabanında aratacaksın.

<code>

$siparis_no = "ABC1234";
$pdo_query = $sql->prepare("SELECT * FROM veritabani WHERE siparis_no LIKE = :s_no);
$pdo_query->execute(array("s_no" => $siparis_no));
foreach( $pdo_query as $row) {
    if(!empty($pdo_query)) {
        echo "Bu numara kayıtlı";
        
        // KODUN GERİ KALANINI BURAYA YAPIŞTIR
        
    }else {
        echo "Bu numara kayıtlı değiş!";
    }
}

</code>

ufukozdemir
629 gün önce

Merhaba,

@emirhan arkadaşımızın verdiği fikir ile basit bir fonksiyon yazdım işime yaradı sizinle de paylaşmak istedim.
Umarım faydalı olur.

function rand_order_no($order_no = [], $length = 8) {
	$rand = substr(str_shuffle('0123456789'), 0, $length);
	if (substr($rand, 0, 1) == 0 || in_array($rand, $order_no)) {
		$rand = rand_order_no($order_no, $length);
	}
	return $rand;
}

Buradaki amacım başında sıfır olmadan ve gönderdiğim array içerisinde üretilen sipariş numarasının olmaması.

ufukozdemir
635 gün önce

Önceki yazdığım sistemde id ile tutuyordum aradan bir siparişi sildikleri zaman neden sıra değişti vs diye sorular geliyordu.
Bundan dolayı farklı bir no tutmak istedim.

Sanırım microtime formatında tutmak mantıklı olacak.

Cevaplarınızı için çok teşekkür ederim hepinize :)

admin
639 gün önce

neden id alani tutmuyorsun veya guid ?

zelemi
641 gün önce

Sana çok basit bir yöntem vereyim bazı projelerimde kullanmıştım.
Eklediğin son insertId değerini al başına ekle veya sonuna nereye istersen işte böylece al sana random sipariş numarası olur.
Cünkü insert id tekil olarak tanımlıcağın için sürekli artıcaktır.

emirhan
641 gün önce

Belki bu yardımcı olur.
Önce database'deki kodlarının hepsini aldım.
Daha sonra bu kodların hepsini bir array içine koydum.
Sonrasında in_array ile üretilen kodun orada var olup olmadığına baktım.
intval($number) bölümünü boşver. O ben birden fazla kod üretirken aynı anda kaç tane üretilmek isteniyorsa o kadar for döngüsü çalışıyor.

`

$table = 'codes';

function generateCode($length = null){
    $result = "";
    $characters = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
    $charactersLength = strlen($characters);

    for ($i = 0.0; $i < $length; $i++) {
      $result = $result . $characters[rand(0, strlen($characters)-1)];
    }

    return $result;
};

$codes = array();
$sqlIds = array();

$CurrentCodes = $wpdb->get_results(
    "SELECT code FROM codes"
);

$CurrentCodes = array_map(
    function($item){
        return $item->code;
    },
    $CurrentCodes
);

for ($i=0; $i < intval($number); $i++) { 
    
    $code = generateCode(10);

    if (in_array($code, $CurrentCodes)) {
        $i--;
        continue;
    }

    $data = array(
        'code' => $code,
        'time' => $time,
        'isUsed' => $isUsed,
        'campaignId' => $campaignId,
        'createdBranch' => $createdBranch,
        'usedTime' => null,
    );
    
    $wpdb->insert($table, $data);
    $my_id = $wpdb->insert_id;
    
    $codes[] = $code;

    $sqlIds[] = $my_id;
    
}

`

NOT: BU KOD KESİNLİKTE VERİMLİ DEĞİLDİR. ÇOK ÖNCEDEN YAZDIĞIM BİR KOD.

Daha verimli olması açısından veritabanına SQL sorgusu ile tabloda bu id var mıdır diye sormak daha iyi bir yaklaşım olacaktır.