[英]How to generate a unique row ID to uniquely identify cart item in shopping cart using PHP?
[英]How to generate a unique transaction id in a shopping cart
我正在使用購物車和本地支付網關,該網關要求每個交易都具有唯一的訂單ID。 該ID應該與訂單詳細信息一起保存在數據庫中,並作為變量發送到付款網關。 我的難題是如何在將變量發送到網關之前如何生成唯一ID以及如何保存它,以便在從網關的IPN收到響應時可以檢查其是否匹配。 有問題的變量如下所示:
$reference = $_POST['reference'];//unique order id of the transaction, generated by merchant
這是我用來生成隨機密鑰的方法,即使它的比特太長,您也可以實現唯一的隨機密鑰。
$id.time().uniqid(mt_rand(),true)
uniqid()-這將生成13個字符的uniqid
mt_rand()-使用Mersenne Twister算法生成隨機數,速度是rand()的4倍
uniqid(mt_rand())-在隨機生成編號前加上uniqueid
uniqid(mt_rand(),true)-為了獲得更強的隨機性,我通過將第二個參數設置為“ true”來啟用uniqid的熵
$ id.time()。uniqid(mt_rand(),true)-這里$ id可以是用戶ID,產品ID或您要選擇的任何ID,time()會生成當前的UNIX時間戳,最后我將附加我的uniqid (......)
不要在uniqueid()上使用md5(),這實際上會使安全性喪失。 附加或添加md5值是可以的。
也就是說,我會堅持使用http://www.php.net/manual/zh-CN/pdo.lastinsertid.php來獲取新插入的ID,但還會生成帶有設置為“ username_”的前綴參數的uniqueid()它應該非常獨特。
將訂單詳細信息插入表中。 該表的主鍵應具有AUTO INCREMENT屬性。 然后檢索最后插入的ID http://php.net/manual/en/function.mysql-insert-id.php
除訂單表的主鍵外,還包含字符串,年,月,日和4位數字的組合。 可能會有用。
例如。
2013年8月8日下的訂單可能具有以下訂單號:OS201308080001 OS201308080002
2013年8月9日下的訂單可能具有以下訂單號:OS201308090001 OS201308090002 OS201308090003
其中OS可能是商店名稱的首字母縮寫,接下來的4位數字是年份,接下來的2位數字是月份,接下來的2位數字是日期,接下來的4位數字(每天從0001開始)可以識別每天的訂單數量。
如果您真的想要一個唯一ID,這是我正在使用的代碼。 這個簡單的方法創建了7個字符的字符串,如果它已經存在於數據庫中->重新生成新的字符串,直到它是100%唯一的。 uniqid()並不是唯一的id,您可以在其中放置自己的前綴,可以將其與我的代碼混合使用,但是單獨的uniqid()可以將其放在base64和md5和sha1中,我不知道還有什么不是唯一的。
function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
{
$str = '';
$count = strlen($charset);
while ($length--) {
$str .= $charset[mt_rand(0, $count-1)];
}
return $str;
}
$unique_id = randString(7);
while(mysqli_num_rows(mysqli_query($con, "SELECT unique_id FROM table WHERE unique_id = '".mysqli_real_escape_string($con, $unique_id)."'")) > 0) {
$unique_id = randString(7);
}
//insert this id into database and use it
我要說的是,使唯一ID唯一的方法是組合當前時間戳(使用time()進行unix),然后在其前面添加和/或添加諸如當前用戶用戶名之類的名稱。 這樣,幾乎不可能創建副本。 您也可以添加最后插入的ID。 在我看來,這三個方法的組合是一種簡單的方法,並且由於time()每秒都會更改,並且用戶不太可能能夠在同一時間添加2個訂單,因此幾乎不可能進行重復操作。
是基於數據庫表的內容嗎? 具有AUTO_INCREMENT的列。 您可以使用以下方法使用PDO獲取最后一個插入ID: http : //www.php.net/manual/en/pdo.lastinsertid.php
或類似的東西
$reference = sha1(md5(time()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.