Tôi đang làm việc trên một giỏ hàng và một cổng thanh toán địa phương yêu cầu mỗi giao dịch phải có ID đơn hàng duy nhất. ID này được cho là được lưu trong cơ sở dữ liệu dựa trên các chi tiết đơn hàng và được gửi dưới dạng biến vào cổng thanh toán. Vấn đề nan giải của tôi là về cách tạo ID duy nhất và cách lưu nó trước khi gửi các biến của tôi đến cổng để tôi có thể kiểm tra xem nó có khớp khi nhận được phản hồi từ IPN của cổng không. Biến trong câu hỏi được hiển thị dưới đây:
$reference = $_POST['reference'];//unique order id of the transaction, generated by merchant
Hỏi ngày 8 tháng 8 năm 2013 lúc 8:52Aug 8, 2013 at 8:52
1
Đây là cách tôi sử dụng để tạo khóa ngẫu nhiên, mặc dù bit dài của nó bạn có thể đạt được khóa ngẫu nhiên độc đáo.
$id.time[].uniqid[mt_rand[],true]
uniqid [] - Điều này sẽ tạo ra 13 ký tự uniqid
MT_RAND [] - Tạo số ngẫu nhiên bằng cách sử dụng thuật toán Mersenne Twister và nhanh hơn gấp 4 lần Rand []
uniqid [mt_rand []] - tiền tố số tạo ngẫu nhiên với độc đáo
uniqid [mt_rand [], true] - Để có được ngẫu nhiên mạnh mẽ hơn, tôi đang kích hoạt entropy của uniqid bằng cách đặt tham số thứ hai thành 'true'
$ id.time []. uniqid [mt_rand [], true] - ở đây $ id có thể là userid, sản phẩm hoặc bất kỳ id nào bạn muốn chọn, thời gian [] sẽ tạo dấu thời gian unix hiện tại [...]
Đã trả lời ngày 13 tháng 10 năm 2015 lúc 8:03Oct 13, 2015 at 8:03
1
Không sử dụng md5 [] trên độc đáo [], nó thực sự sẽ lỏng lẻo về bảo mật. Để nối hoặc dự phòng giá trị md5 là ok.
Điều đó nói rằng tôi sẽ gắn bó với //www.php.net/manual/en/pdo.lastin Nó nên là khá nhiều độc đáo.
Đã trả lời ngày 8 tháng 8 năm 2013 lúc 9:22Aug 8, 2013 at 9:22
DexadexaDexa
1.64110 Huy hiệu bạc24 Huy hiệu đồng10 silver badges24 bronze badges
Nếu bạn thực sự muốn một ID duy nhất, đây là mã mà tôi đang sử dụng. Đơn giản này tạo ra chuỗi 7 ký tự và nếu nó đã tồn tại trong cơ sở dữ liệu -> tái tạo mới, cho đến khi nó độc đáo 100%. uniqid [] không phải là ID thực sự duy nhất, bạn có thể đặt tiền tố của riêng bạn có thể được trộn với mã của tôi, nhưng một mình uniqid [] với việc đặt nó vào base64 và md5 và sha1 và tôi không biết những gì khác không phải là duy nhất.
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
Đã trả lời ngày 8 tháng 8 năm 2013 lúc 9:06Aug 8, 2013 at 9:06
Bên cạnh khóa chính của bảng đặt hàng, sự kết hợp của một chuỗi, năm, tháng, ngày và 4 chữ số số. có thể hữu ích.
ví dụ.
Đơn đặt hàng được đặt vào ngày 8 tháng 8 năm 2013 có thể có các số đơn hàng sau: OS201308080001 OS201308080002
Đơn đặt hàng được đặt vào ngày 9 tháng 8 năm 2013 có thể có các số đơn hàng sau: OS201308090001 OS201308090002 OS201308090003
Khi hệ điều hành có thể là tên ban đầu của tên cửa hàng của bạn, 4 chữ số tiếp theo là năm, 2 chữ số tiếp theo là tháng, 2 chữ số tiếp theo là ngày và 4 chữ số tiếp theo [bắt đầu từ 0001 mỗi ngày] có thể xác định số đơn đặt hàng mỗi ngày.
Đã trả lời ngày 8 tháng 8 năm 2013 lúc 9:02Aug 8, 2013 at 9:02
Tôi sẽ nói rằng cách tạo ID độc đáo nhất sẽ là sự kết hợp của dấu thời gian hiện tại [UNIX sử dụng Time []] và sau đó nối và/hoặc chuẩn bị nó với một cái gì đó giống như tên người dùng người dùng hiện tại. Bằng cách này, gần như không thể tạo ra một bản sao. Bạn cũng có thể thêm ID được chèn cuối cùng. Theo tôi, sự kết hợp của ba người này là một phương pháp đơn giản và sẽ khiến cho các bản sao gần như không thể do thực tế là thời gian [] sẽ thay đổi mỗi giây và người dùng rất khó có thể thêm 2 đơn hàng ở cùng một giây .
Đã trả lời ngày 8 tháng 8 năm 2013 lúc 10:22Aug 8, 2013 at 10:22
BenbenBen
881 Huy hiệu bạc12 Huy hiệu đồng1 silver badge12 bronze badges
Một cái gì đó dựa trên một bảng cơ sở dữ liệu của bạn? Một cột có auto_increment. Bạn có thể tìm nạp ID chèn cuối cùng bằng PDO với điều này: //www.php.net/manual/en/pdo.lastinsertid.php
Hoặc một cái gì đó như
$reference = sha1[md5[time[]]];
Đã trả lời ngày 8 tháng 8 năm 2013 lúc 8:55Aug 8, 2013 at 8:55
1