Random Sipariş Numarası Oluşturma
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 :)
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (7)
$siparisno = microtime(true);
sadece bu kadarı yeter sana, zamana bağlı olduğu için hiç bir zaman aynı sayı denk gelmez.
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>
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ı.
Ö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 :)
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.
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.