PHP: นามสกุล MySQL เลิกใช้แล้ว

  • เลิกใช้แล้วตั้งแต่ PHP 5.5 ... หายไปใน PHP 7.0
  • การออกแบบที่ไม่ดี
    • มากกว่า 15 ปีของการมีชีวิตอยู่
    • การเชื่อมต่อฐานข้อมูล: อันสุดท้ายคือค่าเริ่มต้น
    • จัดการข้อผิดพลาด? การจัดการข้อผิดพลาดอะไร
    • ออกแบบมาสำหรับ MySQL 3.23
    • การเชื่อมต่อที่เข้ารหัส
    • ไม่มีงบที่เตรียมไว้
  • เป็นอันตรายต่ออนาคต
    • ในไม่ช้าจะไม่ดูแลรักษาอีกต่อไป
  • ดังนั้นจะใช้อะไร
  • กระจายคำ

PHP เป็นภาษาการเขียนโปรแกรมเว็บเซิร์ฟเวอร์ที่ยอดเยี่ยม แต่มันก็ไม่ได้ดีสำหรับการจัดเก็บข้อมูลที่มีโครงสร้างเพียงอย่างเดียว นั่นเป็นเหตุผลว่าทำไมจึงมีส่วนขยายซึ่งสามารถเชื่อมต่อและใช้ DBMSs (DataBase Management Systems) รวมถึง MySQL ที่ เป็นที่นิยม มันเป็นเอ็นจิ้น DB ที่น่าเชื่อถือด้วยการพัฒนาที่แอคทีฟและการใช้งานที่เป็นที่นิยมโดยเฉพาะในการตั้งค่า AMP [W / L / M]

อย่างไรก็ตาม การใช้งานใน PHP นั้นทำได้ในอดีต ผ่านทาง ส่วนขยาย PHP MySQL

 mysql_ * 
ฟังก์ชั่น) ซึ่งล้าสมัยและเลิกใช้แล้ว! (อย่ามั่ว: MySQL ตัวเองไม่เลิกใช้)

รั้งตัวคุณเองบทความนี้ยาวไปหน่อย ... หากคุณไม่ต้องการอ่านให้จำไว้ว่า: ห้ามทั้งหมด

 mysql_ * 
ฟังก์ชั่นและใช้ mysql i หรือ PDO

เลิกใช้แล้วตั้งแต่ PHP 5.5 ... หายไปใน PHP 7.0

PHP 5.5.0 เปิดตัวอย่างเป็นทางการในวันที่ 20 มิถุนายน 2013 (ดูที่เก็บข่าว PHP ปี 2013 รวมถึงบันทึกประจำรุ่น) ในรุ่นนี้ผู้พัฒนา PHP ตัดสินใจเลิกใช้ส่วนขยาย MySQL

มีหลายสาเหตุที่แสดงไว้ในหน้า RFC ของการตัดสินใจ บทความคำถามที่พบบ่อยนี้สรุปจำนวนพวกเขา

นอกจากนี้ ตั้งแต่ PHP 7.0 ส่วนขยายได้ถูกลบออกอย่างสมบูรณ์ เนื่องจากไม่ถูกทำให้สะอาดและไม่เข้ากันกับเวอร์ชันใหม่ของรันไทม์ของภาษา

ดังนั้นใครบอกว่าเลิกใช้แล้วบอกว่ามีเหตุผลที่ดีที่จะไม่ใช้มันอีกต่อไป เพียงแค่คุณอย่าลืม ๆ

 mysql_ * 
ฟังก์ชั่นการใช้งานจะก่อให้เกิด
 E_DEPRECATED 
เตือน (ไม่ใช่ข้อผิดพลาด) โดยค่าเริ่มต้นใน PHP 5.5+

การออกแบบที่ไม่ดี

มากกว่า 15 ปีของการมีชีวิตอยู่

ส่วนขยาย MySQL ถูกนำมาใช้ใน PHP 2.0 นั่นคือแม้กระทั่งก่อนปี 1998 ปี PHP 3 ได้รับการปล่อยตัว เทคนิคการเขียนโปรแกรมอายุ 15 ปีไม่ได้มีประสิทธิภาพเสมอไปในทุกวันนี้ยิ่งไปกว่านั้นในด้านไอทีซึ่งพัฒนาอย่างรวดเร็วมาก ที่อาจอธิบายความช้า (เทียบได้) เทียบกับส่วนขยาย DBMS อื่น ๆ ... และยังอธิบายถึงการขาดคุณสมบัติบางอย่างที่มีความสำคัญต่อการใช้งานของวันนี้ดังที่อธิบายไว้ด้านล่าง

การเชื่อมต่อฐานข้อมูล: อันสุดท้ายคือค่าเริ่มต้น

 mysql_ * 
ฟังก์ชั่นถ้าไม่ได้บอกอย่างชัดเจนให้พิจารณาการเชื่อมต่อฐานข้อมูลที่จะใช้เป็นสิ่งที่เปิดล่าสุด พฤติกรรมนี้เป็นปัญหาในสองกรณี:
  • เมื่อคุณใช้หลายฐานข้อมูลในเวลาเดียวกัน: ลืมส่งพารามิเตอร์การเชื่อมต่อและคำขอ SQL ของคุณไปในฐานข้อมูลผิด
  • เพื่อติดตามบั๊ก: ไม่มีตัวแปรที่อธิบายการเชื่อมต่ออย่างชัดเจนดังนั้นจึงเป็นไปไม่ได้ที่จะใช้ PHP IDE / ดีบักเกอร์: คุณต้องหาผู้ถูกกล่าวหา
     mysql_connect 
    ตัวเองและเพิ่มรหัสการแก้จุดบกพร่องหากจำเป็น

จัดการข้อผิดพลาด? การจัดการข้อผิดพลาดอะไร

PHP 5 นำกระบวนทัศน์ที่นำมาโดยตรงจากการเขียนโปรแกรมเชิงวัตถุ: ข้อยกเว้น ส่วนขยาย MySQL เก่าเกินไปและไม่เคยได้รับการปรับปรุงให้ใช้ดังนั้นวิธีเดียวที่จะตรวจจับข้อผิดพลาดคือใช้ mysql_error () ข้อเสียใหญ่ของเทคนิคนี้: คุณต้องใส่รหัสการจัดการข้อผิดพลาดหลังจากทุก ๆ
 mysql_ * 
ฟังก์ชั่นการโทร!

ข้อยกเว้นช่วยให้การบล็อกรหัสถูกขัดจังหวะและตรงไปที่การจัดการข้อผิดพลาดทำให้รหัสไม่เพียง แต่สำหรับโปรแกรมเมอร์ แต่ยังสำหรับ PHP: การยกเว้นเป็นแบบพาสซีฟและถูกกระตุ้นเฉพาะเมื่อฟังก์ชั่นรายงานข้อผิดพลาดด้วยตัวเอง ด้วยวิธีการอื่น ๆ PHP จะต้องตรวจสอบทุกครั้งหากทุกอย่างเป็นไปตามแผนที่วางไว้และส่วนใหญ่ทำ ... นั่นเป็นสิ่งที่ไร้ประโยชน์

ออกแบบมาสำหรับ MySQL 3.23

ผู้ใช้ SQL ขั้นสูง (ของฉัน) จะผิดหวัง: คุณลักษณะบางอย่างที่พัฒนาขึ้นหลังจาก 3.23 นั้นใช้งานไม่ได้เนื่องจากขาดการอัปเดตส่วนขยายที่เหมาะสม

ส่งผลให้กระบวนการ SQL ขาดซึ่งมีประโยชน์มากในบางกรณี

บางคนกล่าวว่าส่วนขยายยังมีปัญหากับการเข้ารหัสข้อความ

การเชื่อมต่อที่เข้ารหัส

การเชื่อมต่อฐานข้อมูลระยะไกลสามารถรักษาความปลอดภัยโดยใช้ SSL (Secure Socket Layer) แต่ไม่ใช่ TLS (Transport Layer Security) เนื่องจากมีเหตุการณ์ล่าสุดที่พิสูจน์แล้ว (เช่นเขียน, HeartBleed ของ OpenSSL) SSL เป็นโปรโตคอลที่ใช้งานไม่ได้และควรแทนที่ด้วย TLS 1.1+ ด้วยเหตุผลมากมายที่ไม่สามารถอธิบายได้ที่นี่ ส่วนขยายไม่รองรับ TLS ดังนั้นบังคับให้ทุกคนใช้มาตรฐานการเข้ารหัสที่ควรพิจารณาว่าเลิกใช้แล้ว

ไม่มีงบที่เตรียมไว้

คุณสังเกตเห็นชื่อตัวหนาและขีดเส้นใต้หรือไม่? นี่อาจเป็นจุดที่สำคัญที่สุดของบทความทั้งหมดนี้:

ส่วนขยาย MySQL ไม่มีคำสั่งที่เตรียมไว้

Whazzat และทำไมพวกเขาถึงสำคัญมาก? คำร้องขอ SQL เป็นตัวแปรเวลาส่วนใหญ่ตามตัวเลือกของผู้ใช้ โซลูชันที่ง่ายที่สุด (และแพร่หลายที่สุด) มีลักษณะดังนี้:

 mysql_query ('สมาชิก UPDATE SET name = "'. $ _ GET ['name']. '" WHERE name = "'. $ name. '"'); 

ทุกอย่างเรียบร้อยคุณใส่เครื่องหมายคำพูดคู่ล้อมรอบข้อมูลของผู้ใช้ น่าเสียดายที่มันไม่เพียงพอ: ผู้ใช้ทุกคนสามารถเป็นผู้ดูแลระบบได้โดยการเข้าถึง

 เปลี่ยน-name.php? name =% 22% 20admin% 3D1%% 22USERNAME 20name% 3D 
. บางบทช่วยสอนแบบสุ่มจะบอกให้คุณใช้
 mysql_real_escape_string 
ซึ่งแม้ว่าจะมีประสิทธิภาพก็เป็นได้ (โดยสุจริต) นานเกินไปและน่าเกลียดและนำไปสู่ความสับสนและการใช้ซ้ำสองครั้งหรือไม่มีการใช้เลยในตัวแปรที่กำหนด

คำสั่งที่เตรียมไว้ให้คำตอบที่สวยงามสำหรับระเบียบนี้: คุณเตรียมโครงสร้างคำขอของคุณจากนั้นดำเนินการกับพารามิเตอร์ที่คุณต้องการ (ตัวอย่าง PDO):

 $ req = $ pdo-> เตรียมพร้อม ('สมาชิก UPDATE SET name =: newname WHERE name =: name'); $ req-> execute (อาร์เรย์ ("newname" => $ _GET ['name'], "name" => $ name)); 
ไปเลยโดยไม่ต้องกังวลเรื่องการฉีด SQL อีกต่อไป งานสกปรกทั้งหมดทำเพื่อคุณ

เป็นอันตรายต่ออนาคต

ส่วนขยายใกล้จะถึงจุดสิ้นสุดของชีวิตการลบออกจาก PHP นั้นใกล้เข้ามาและเว็บไซต์ของคุณก็จะใช้งานเช่นกัน ... แม้กระทั่งทุกวันนี้ก็ยังมี "วัฒนธรรม" รอบส่วนขยายซึ่งจะหายไปโดยไม่ทราบว่า: บทเรียนมากมายและผู้คนยังแนะนำให้ใช้งานโดยไม่ทราบว่าจะมีการลบในอนาคต คุณเข้าใจแล้ววัฒนธรรมนี้จะต้องถูกกำจัดไป

นั่นเป็นเหตุผลที่คุณต้องแปลงสคริปต์เว็บไซต์หรือแม้แต่ CMS (ถ้าเป็นไปได้) เป็น DB access API อื่น ยิ่งทำเร็วก็ยิ่งดี: โครงการของคุณอาจไม่ใหญ่มากนักและยังมีเอกสารประกอบของส่วนขยายที่สามารถใช้งานได้ง่ายเช่นเดียวกับบทแนะนำการแปลง

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

ในไม่ช้าจะไม่ดูแลรักษาอีกต่อไป

การขาดการบำรุงรักษานำมาซึ่งความเสี่ยงที่สำคัญ: การละเมิดความปลอดภัยที่พบในรหัสนั้นอาจจะไม่ได้รับการแก้ไข หากค้นพบปัญหาด้านความปลอดภัยที่สำคัญเว็บไซต์ดังกล่าวจะคุกคามเว็บไซต์นับล้านแห่งหากไม่ได้ทำการเปลี่ยน พยายามอย่าเป็นหนึ่งในนั้น

ดังนั้นจะใช้อะไร

คำตอบนั้นง่าย แต่ให้คุณเลือก:
  • PDO
    • อินเตอร์เฟสแบบ Object-oriented เท่านั้น
    • ทำงานกับหลาย DBMS: MySQL, MSSQL, sqlite, ...
  • mysqli
    • แบบจำลองเชิงวัตถุ และ ฟังก์ชันที่ใช้งานร่วมกันได้
    • Higly ออกแบบส่วนขยาย MySQL อีกครั้ง

กระจายคำ

หากคุณเห็นว่ามีคนแนะนำการใช้งานส่วนขยายหรือเรียนรู้การใช้งานให้ทำสิ่งที่คุณสามารถทำได้เพื่อบอกเขาว่าเขากำลังทำอะไรผิด:

บอกและเชื่อมโยงเขา / เธอบทความนี้ซึ่งจะแสดงข้อโต้แย้งว่าทำไมไม่ใช้มันแทนที่จะเขียนคำตอบที่ยาวและจุกจิก

บทความคำถามที่พบบ่อยนี้ได้รับอนุญาตภายใต้ CC BY-SA และเริ่มเขียนโดย gravgun

บทความก่อนหน้านี้ บทความถัดไป

เคล็ดลับยอดนิยม