โค้ด PHP สำเร็จรูปสำหรับตัวสร้างตัวเลขสุ่ม การใช้ฟังก์ชันสุ่ม PHP สคริปต์การกู้คืนรหัสผ่าน

สวัสดีทุกคน! ในบทความนี้เราจะดูที่ มีอะไรใหม่สำหรับการสร้างตัวเลขสุ่มใน PHP 7.1.

การอัปเดตนี้เกิดขึ้นโดยมองไม่เห็นสำหรับนักพัฒนา แต่ได้ปรับปรุงภาษาการเขียนโปรแกรมแล้ว PHPในด้านการสร้างตัวเลขสุ่ม

เท่าที่ทราบมาใน. PHPเราสามารถใช้ฟังก์ชันได้ แรนด์ (ต่ำสุด, สูงสุด)เพื่อสร้างตัวเลขสุ่ม:

เอคโค่ แรนด์(7, 17);

หากคุณรีเฟรชหน้าตอนนี้คุณจะได้รับหมายเลขสุ่มใหม่ทุกครั้ง

แต่ไม่ใช่ทุกอย่างจะง่ายอย่างที่คิด ประเด็นก็คือขึ้นอยู่กับสิ่งที่คุณสร้างตัวเลขสุ่มสำหรับฟังก์ชัน แรนด์()ใช้ระบบการสร้างที่แตกต่างกัน เหล่านั้น. ขึ้นอยู่กับระบบที่ใช้งาน บางระบบอาจใช้วิธีการสร้างแบบอ่อนแอ ดังนั้นคุณจะได้รับตัวเลขที่ไม่ได้สุ่มทั้งหมด

ใน พีเอชพี 7.1ปัญหานี้ได้รับการแก้ไขแล้วและมีการเพิ่มคุณสมบัติแล้ว mt_rand():

เอคโค mt_rand(7, 17);

ฟีเจอร์นี้ทำงานได้ดีขึ้นมาก รวมถึงความปลอดภัยด้วย สิ่งสำคัญที่ต้องรู้ก็คือถ้าคุณใช้ฟังก์ชันนี้ แรนด์()วี พีเอชพี 7.1จากนั้นจะถูกเขียนทับโดยอัตโนมัติ mt_rand()- เหล่านั้น. แรนด์()ตอนนี้เป็นเพียงนามแฝงสำหรับ mt_rand().

มีการปรับปรุงฟังก์ชันอื่นๆ มากมายสำหรับการสร้างผลลัพธ์แบบสุ่ม พีเอชพี 7.1- ตัวอย่างเช่น มาดูกันว่าเราจะรับค่าสุ่มจากอาร์เรย์ได้อย่างไร:

$names = ["อีวาน", "อเล็กซานเดอร์", "วาซิลี่"];
สะท้อนชื่อ $;

เหล่านั้น. ฟังก์ชันใดๆ เช่นนี้ได้รับการปรับปรุงเพื่อให้สร้างตัวเลขสุ่มได้ดีขึ้น พีเอชพี 7.1- ใช่ การอัปเดตนี้ไม่มีใครสังเกตเห็น แต่ไม่ว่าคุณจะเขียนด้วยภาษาใดก็ตาม สิ่งสำคัญมากคือต้องเข้าใจว่าเกิดอะไรขึ้นภายในฟังก์ชันและลักษณะการทำงานของฟังก์ชัน

งาน
คุณต้องสร้างตัวเลขสุ่มภายในช่วงตัวเลข

สารละลาย
ฟังก์ชัน mt_rand() ได้รับการออกแบบมาเพื่อสิ่งนี้:

// รวมตัวเลขสุ่มระหว่าง $upper และ $lower
$random_number = mt_rand($ล่าง, $บน);

การอภิปราย
การสร้างตัวเลขสุ่มมีประโยชน์เมื่อคุณต้องการแสดงภาพสุ่มบนหน้าจอ สุ่มกำหนดจุดเริ่มต้นในเกม เลือกรายการสุ่มจากฐานข้อมูล หรือสร้างตัวระบุเซสชันที่ไม่ซ้ำกัน ในการสร้างตัวเลขสุ่มในช่วงเวลาระหว่างจุดสองจุด คุณจะต้องส่งอาร์กิวเมนต์สองตัวไปที่ฟังก์ชัน mt_rand():

$random_number = mt_rand(1, 100);

การเรียก mt_rand() โดยไม่มีอาร์กิวเมนต์จะส่งคืนตัวเลขระหว่างศูนย์ถึงจำนวนสุ่มสูงสุดที่ส่งคืนโดย mt_getrandmax() เป็นเรื่องยากสำหรับคอมพิวเตอร์ที่จะสร้างตัวเลขสุ่มอย่างแท้จริง เขาเก่งกว่ามากในการทำตามคำแนะนำอย่างมีระเบียบและไม่ดีนักถ้าเขาจำเป็นต้องทำอะไรตามใจชอบ หากคุณต้องการบังคับให้คอมพิวเตอร์สร้างตัวเลขสุ่ม คุณจะต้องให้ชุดคำสั่งที่สามารถทำซ้ำได้จำนวนหนึ่งแก่คอมพิวเตอร์ และความจริงของการทำซ้ำได้ทำให้การสุ่มเป็นไปได้น้อยลง

PHP มีโปรแกรมสร้างตัวเลขสุ่มที่แตกต่างกันสองแบบ: ฟังก์ชันคลาสสิกที่เรียกว่า rand() และฟังก์ชันขั้นสูง mt_rand()

MT (Mersenne Twister) คือเครื่องกำเนิดตัวเลขสุ่มหลอกที่ตั้งชื่อตามพระภิกษุชาวฝรั่งเศสและนักคณิตศาสตร์ Marin Mersenne ผู้ศึกษาจำนวนเฉพาะ อัลกอริธึมของเครื่องกำเนิดนี้ขึ้นอยู่กับจำนวนเฉพาะเหล่านี้ ฟังก์ชัน mt_rand() เร็วกว่าฟังก์ชัน rand() และสร้างตัวเลขสุ่มมากกว่า ดังนั้นเราจึงชอบแบบแรกมากกว่า

หากคุณมี PHP เวอร์ชันเก่ากว่า 4.2 ก่อนที่จะเรียกใช้ฟังก์ชัน mt_rand() (หรือ rand()) เป็นครั้งแรก คุณจะต้องเริ่มต้นตัวสร้างด้วยค่าเริ่มต้นโดยการเรียก mt_srand() (หรือ srand( )) การทำงาน. ข้อมูลเริ่มต้นคือตัวเลขที่ฟังก์ชันสุ่มใช้เป็นพื้นฐานในการสร้างตัวเลขสุ่มที่ส่งคืน มันหมายถึงวิธีการแก้ไขภาวะที่กลืนไม่เข้าคายไม่ออกที่กล่าวถึงข้างต้น - การทำซ้ำและการสุ่ม

เนื่องจากค่าเริ่มต้นที่เปลี่ยนแปลงอย่างรวดเร็วและมีโอกาสทำซ้ำได้ต่ำ (คุณสมบัติเหล่านี้ควรมีลักษณะเป็นค่าเริ่มต้นที่ดี) คุณสามารถรับค่าที่ส่งกลับโดยไมโครไทม์ของฟังก์ชันเวลาที่มีความแม่นยำสูง () เริ่มต้นเครื่องกำเนิดไฟฟ้าเพียงครั้งเดียวก็เพียงพอแล้ว PHP 4.2 และใหม่กว่าจัดการการเริ่มต้นโดยอัตโนมัติ แต่หากค่าเริ่มต้นถูกตั้งค่าด้วยตนเองก่อนการเรียก mt_rand() ครั้งแรก PHP จะไม่แทนที่ด้วยค่าเริ่มต้นของตัวเอง

หากคุณต้องการเลือกบันทึกแบบสุ่มจากฐานข้อมูล วิธีที่ง่ายที่สุดคือการกำหนดจำนวนฟิลด์ทั้งหมดในตารางก่อน เลือกตัวเลขสุ่มจากช่วงนั้น จากนั้นสอบถามแถวนั้นจากฐานข้อมูล:

$sth = $dbh->query("SELECT COUNT(*) AS count from quotes");
ถ้า ($row = $sth->fetchRow()) (
$count = $แถว;
) อื่น (
ตาย ($row->getMessage());
}
$สุ่ม = mt_rand(0, $count - 1);
$sth = $dbh->query("เลือกเครื่องหมายคำพูดจากเครื่องหมายคำพูด LIMIT $random,1");
ในขณะที่ ($row = $sth->fetchRow()) (
พิมพ์ $row .

"\n";
}

ข้อมูลโค้ดนี้จะกำหนดจำนวนแถวทั้งหมดในตาราง สร้างตัวเลขสุ่มจากช่วงนั้น จากนั้นใช้ LIMIT $random,1 เพื่อเลือกหนึ่งแถวจากตารางโดยเริ่มต้นที่ตำแหน่ง $random ใน MySQL เวอร์ชัน 3.23 หรือสูงกว่า มีตัวเลือกอื่นที่เป็นไปได้:

$sth = $dbh->query("เลือกคำพูดจากคำพูด ORDER BY RAND() จำกัด 1");
ในขณะที่ ($row = $sth->fetchRow()) (
พิมพ์ $row . "\n";
}

ในกรณีนี้ MySQL จะสุ่มแถวก่อนแล้วจึงส่งคืนแถวแรก

เริ่มต้นตัวสร้างตัวเลขสุ่ม ไวยากรณ์:

โมฆะ srand (เมล็ด int)

เริ่มต้นตัวสร้างตัวเลขสุ่มด้วยค่าเมล็ด

แสนด์((สองเท่า) ไมโครไทม์()*1000000);
$สุ่ม = แรนด์();
สะท้อน $ สุ่ม;

GETRANDMAX

ส่งกลับตัวเลขสุ่มที่ใหญ่ที่สุดที่เป็นไปได้ ไวยากรณ์:

Int getrandmax()

ฟังก์ชันนี้ส่งคืนค่าสูงสุดที่สามารถรับได้โดยใช้ฟังก์ชันการสร้างตัวเลขสุ่ม rand()

โดยปกติจะเป็น 32767

สร้างตัวเลขสุ่ม ไวยากรณ์:

Int แรนด์()

เมื่อเรียกด้วยพารามิเตอร์ขั้นต่ำและสูงสุดเผื่อเลือก ฟังก์ชันนี้จะสร้างตัวเลขสุ่มจนถึงและรวมพารามิเตอร์เหล่านั้นด้วย หากไม่มีพารามิเตอร์ min และ max ระบบจะส่งกลับตัวเลขตั้งแต่ 0 ถึง RAND_MAX

เพื่อให้ฟังก์ชันนี้ทำงานได้อย่างถูกต้อง ก่อนที่จะใช้งาน คุณจะต้องเริ่มต้นตัวสร้างตัวเลขสุ่มด้วยฟังก์ชัน srand()

lcg_value()

LCG ตัวสร้างตัวเลขสุ่มหลอก (PHP 4, PHP 5)

คำอธิบาย:

ลอย lcg_value (เป็นโมฆะ)

lcg_value() ส่งกลับตัวเลขสุ่มเทียมในช่วง (0, 1) ฟังก์ชันนี้จะรวมเครื่องกำเนิดไฟฟ้าสองตัวที่มี 2^31 - 85 และ 2^31 - 249 ในช่วงเวลาหนึ่ง

mt_getrandmax()

แสดงค่าสุ่มที่ใหญ่ที่สุดที่เป็นไปได้ (PHP 3 >= 3.0.6, PHP 4, PHP 5)

คำอธิบาย:

Int mt_getrandmax (เป็นโมฆะ)

แสดงค่าสูงสุดที่สามารถส่งกลับโดย mt_rand()

mt_rand()

สร้างค่าสุ่มที่ดีที่สุด (PHP 3 >= 3.0.6, PHP 4, PHP 5)

คำอธิบาย:

int mt_rand()

ตัวสร้างตัวเลขสุ่มรุ่นเก่าๆ หลายเวอร์ชันมีลักษณะที่น่าสงสัยและทำงานช้า ตามค่าเริ่มต้น PHP จะใช้ฟังก์ชัน rand() เพื่อสร้างตัวเลขสุ่ม ฟังก์ชัน mt_rand() เป็นการทดแทนที่ดี ใช้ตัวสร้างตัวเลขสุ่มที่เร็วกว่า rand() ถึง 4 เท่า และใช้ Mersenne Twister

เมื่อเรียกโดยไม่มีอาร์กิวเมนต์ min และ max ที่เป็นทางเลือก mt_rand() จะส่งกลับค่าสุ่มเทียมซึ่งอยู่ระหว่าง 0 ถึง RAND_MAX ตัวอย่างเช่น หากคุณต้องการรับค่าสุ่มระหว่าง 5 ถึง 15 ให้มองหา mt_rand (5, 15)

ตัวอย่างการใช้ mt_rand()

เสียงสะท้อน mt_rand() . "\n";
เสียงสะท้อน mt_rand() . "\n";

เสียงสะท้อน mt_rand (5, 15);
?>

ผลลัพธ์ของการรันตัวอย่างนี้จะเป็นดังนี้:

1604716014
1478613278
6

ความคิดเห็น

ความคิดเห็น: ในเวอร์ชันก่อน 3.0.7 พารามิเตอร์ตัวที่สองของฟังก์ชันจะระบุช่วงของตัวเลข ตัวอย่างเช่น หากต้องการรับตัวเลขสุ่มระหว่าง 5 ถึง 15 ในเวอร์ชันเหล่านี้ คุณต้องระบุฟังก์ชัน mt_rand(5, 11)

mt_srand()

ตั้งค่าเริ่มต้นของตัวสร้างตัวเลขสุ่มที่ดีที่สุด (PHP 3 >= 3.0.6, PHP 4, PHP 5)

คำอธิบาย:

โมฆะ mt_srand()

ตั้งค่าเริ่มต้นของเครื่องกำเนิดตัวเลขสุ่มโดยใช้เมล็ด ตั้งแต่ PHP 4.2.0 เป็นต้นไป seed เป็นทางเลือก และละเว้นการตั้งค่าเริ่มต้นสำหรับค่าสุ่ม

ตัวอย่างการใช้ mt_srand()

// เมล็ดด้วยไมโครวินาที
ฟังก์ชั่น make_seed()
{
list($usec, $sec) = explode(" ", microtime());
กลับ (ลอย) $sec + ((ลอย) $usec * 100000);
}
mt_srand(make_seed());
$randval = mt_rand();
?>

ความคิดเห็น: ตั้งแต่ PHP 4.2.0 เป็นต้นไป ไม่จำเป็นต้องเริ่มต้นตัวสร้างตัวเลขสุ่มด้วย srand() หรือ mt_srand() อีกต่อไป เนื่องจากตอนนี้จะดำเนินการโดยอัตโนมัติ

ตอนนี้เราใช้ฟังก์ชันการสร้างรหัสผ่านสำเร็จรูปและเขียนสคริปต์เพื่อกู้คืนหรือสร้างรหัสผ่านใหม่สำหรับผู้ใช้เว็บไซต์ของคุณ

สคริปต์การกู้คืนรหัสผ่าน

ปกติสคริปต์จะเขียนอย่างไร?

เช่นเคย มีการร่างโครงร่างทีละขั้นตอน สิ่งที่เราต้องทำทีละขั้นตอน ทุกอย่างเกิดขึ้นในไฟล์เดียว Reminder.php

1. เราจะรันสคริปต์เฉพาะเมื่อมีตัวแปรบางตัว เช่น $action;

2. เพื่อเริ่มกระบวนการสร้างรหัสผ่าน ผู้ใช้ระบุที่อยู่อีเมล $_POST[`ema'l`]; เพื่อให้โค้ดง่ายขึ้น ให้กำหนดค่านี้ให้กับตัวแปร $email

3. เราจะตรวจสอบอักขระทั้งหมดโดยใช้นิพจน์ทั่วไปเพื่อให้แน่ใจว่าผู้ใช้ป้อนที่อยู่อีเมลที่ถูกต้อง ถ้าไม่เช่นนั้น เราจะแสดงข้อผิดพลาดและหยุดสคริปต์ หากทุกอย่างถูกต้องเราจะเดินหน้าต่อไป

4. ในกรณีของเราเราจะค้นหาผู้ใช้ที่มีที่อยู่อีเมลนี้ในฐานข้อมูล ถ้าไม่เช่นนั้น เราจะแจ้งข้อผิดพลาดว่าไม่มีที่อยู่ดังกล่าวในฐานข้อมูลและหยุดสคริปต์

5. มีผู้ใช้ที่มีที่อยู่นี้อยู่ในฐานข้อมูล ดำเนินการต่อและเปิดใช้งานฟังก์ชั่นการสร้างรหัสผ่านใหม่ นอกจากนี้ เมื่อใช้ที่อยู่อีเมล เรายังได้รับรหัสเฉพาะของผู้ใช้จากฐานข้อมูลและเขียนลงในตัวแปร $id