Cách mã trình tạo số tăng tự động trong php

Ghi chú. Bài đăng này đã hơn một năm tuổi và vì vậy thông tin ở đây có thể đã lỗi thời. Nếu bạn phát hiện ra điều gì đó, vui lòng để lại nhận xét và chúng tôi sẽ cố gắng khắc phục

  • Chia sẻ cái này
  • Tweet cái này đi
  • Chia sẻ cái này

Cách đây một thời gian, tôi đang thực hiện một số thay đổi đối với một trang web và bắt gặp một khối mã khiến tôi ngây người nhìn vào màn hình của mình. Trang web tôi đang làm việc là một trang web xây dựng tùy chỉnh, được tạo bởi một nhà phát triển khác tại công ty mà tôi đang làm việc vào thời điểm đó. Tôi chưa bao giờ làm một PHP. CSI trên trang web này trước đây nhưng hãy nhớ rằng tôi đã rất ngạc nhiên với những gì tôi tìm thấy vào thời điểm đó nên tôi đã ghi chú lại để tham khảo sau này. Gần đây tôi đã suy nghĩ về cách tiếp cận phân tích mã

Mã tôi tìm thấy nằm trong một phương thức chèn một mục vào bảng cơ sở dữ liệu. Vì một số lý do mà tôi không thể hiểu được, nhà phát triển đã chọn không sử dụng ID gia tăng tự động và thay vào đó đã phát triển một phương pháp về cơ bản quyết định ngẫu nhiên số ID cho mặt hàng

Tôi không thể dán toàn bộ khối mã vào đây, nhưng tôi có thể bao gồm vùng mã khiến tôi phải vò đầu bứt tai

do {
  $ref = mt_rand[1, pow[2, 31]-1]; // Generate a ref number
  $result = $mysqli->query["SELECT id FROM tblrefs WHERE ref = {$ref}"];
} while[$result->num_rows == 0];

Nếu bạn đủ kinh nghiệm, có lẽ bạn sẽ nhận ra vấn đề ở đây. Tôi nghĩ có thể là một ý kiến ​​hay để xem qua mọi thứ đang diễn ra tại đây

  • Đầu tiên chúng ta nhập một vòng lặp do-while. Điều này sẽ tiếp tục chạy trong khi điều kiện của while là đúng
  • Tiếp theo, chúng tôi tạo một số tham chiếu và lưu trữ nó trong biến $ref. Đây là một số ngẫu nhiên [được tạo bởi hàm mt_rand[]] nằm giữa 1 và số lớn nhất của một số nguyên 32 bit [được tính bằng cách nâng 2 lên lũy thừa của 31 và trừ đi 1]
  • Dòng tiếp theo là một truy vấn SQL để tìm hiểu xem số ngẫu nhiên mà chúng tôi tạo đã tồn tại trong bảng cơ sở dữ liệu mà chúng tôi quan tâm hay chưa
  • Điều kiện trong khi sau đó được xem xét. Nếu số hàng được trả về từ truy vấn SQL không phải là 0 thì chúng tôi đã sử dụng số đó trong cơ sở dữ liệu và vì vậy chúng tôi cần lặp lại để tạo lại số, v.v. Nếu nó là 0 thì số mới và chúng ta có thể thoát khỏi vòng lặp do-while và tiếp tục chèn mục vào cơ sở dữ liệu

Điều này có một vài vấn đề

  • Để chèn bất cứ thứ gì vào bảng, trước tiên chúng ta cần truy vấn cơ sở dữ liệu để xem liệu chúng ta có ID phù hợp không
  • Vì một số lý do, chúng tôi đang tìm ra giá trị của một số nguyên tối đa bằng cách sử dụng toán học chứ không phải hằng số PHP tích hợp PHP_MAX_INT. Tính nhanh giá trị này bằng cách tăng 2 lũy thừa 31 thực sự là một phép toán khá tốn kém. Tại sao nhà phát triển quyết định không sử dụng PHP_MAX_INT ở đây nằm ngoài khả năng của tôi, nhưng đó không phải là vấn đề chính ở đây
  • Vì chúng tôi đang tạo một số ngẫu nhiên nên ngày càng có nhiều khả năng chúng tôi sẽ tạo một số đã tồn tại. Điều này có nghĩa là càng có nhiều mục trong cơ sở dữ liệu thì càng có nhiều khả năng chúng tôi sẽ tìm thấy một mục hiện có trong cơ sở dữ liệu và phải tạo lại số ngẫu nhiên của mình
  • Vì đây là một trang web bận rộn với một số biên tập viên đang viết nội dung nên có khả năng khối mã này sẽ tạo ra hai ID giống hệt nhau và cố gắng chèn chúng vào cơ sở dữ liệu cùng một lúc.  

Để kiểm tra nhanh, tôi quyết định xem phương pháp này sẽ mất bao lâu để tìm một số trùng lặp từ giá trị được tạo ngẫu nhiên. Tôi tập hợp một tập lệnh nhanh để tạo các số ngẫu nhiên bằng cách sử dụng cùng một phương pháp như trên cho đến khi tìm thấy một bản sao, tại thời điểm đó, chúng tôi đếm số lượng giá trị được tạo và bắt đầu lại

for [$outer = 0; $outer 

Chủ Đề