ฉันสามารถผสม MySQL API ใน PHP ได้หรือไม่


108

ฉันได้ค้นหาเครือข่ายและจนถึงตอนนี้สิ่งที่ฉันเห็นคือคุณสามารถใช้mysql_และmysqli_รวมความหมาย:

<?php
$con=mysqli_connect("localhost", "root" ,"" ,"mysql");

if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysql_close($con);
echo "Done";
?>

หรือ

<?php
$con=mysql_connect("localhost", "root" ,"" ,"mysql");
if( mysqli_connect_errno( $con ) ) {
    echo "failed to connect";
}else{
    echo "connected";
}
mysqli_close($con);
echo "Done";
?>

ถูกต้อง แต่เมื่อฉันใช้รหัสนี้สิ่งที่ฉันได้รับคือ:

Connected
Warning: mysql_close() expects parameter 1 to be resource, object given in D:\************.php on line 9
Done

mysqli_close()สำหรับครั้งแรกและครั้งเดียวกับการยกเว้น สำหรับอันที่สอง

อะไรคือปัญหา? ฉันไม่สามารถใช้mysql_และmysqliร่วมกันได้หรือไม่? หรือเป็นเรื่องปกติ? เป็นวิธีตรวจสอบว่าการเชื่อมต่อถูกต้องหรือไม่? (ที่if(mysq...))


6
mysql เลิกใช้งานแล้วมันสมเหตุสมผลแล้วที่จะไม่ทำงานร่วมกัน ทำไมคุณถึงพยายามทำ .. ?
Sterling Archer

7
คุณควรหลีกเลี่ยงการใช้mysql_*ฟังก์ชันทั้งหมด เป็นข้อผิดพลาดได้ง่ายและไม่ปลอดภัยและจะถูกลบออกจาก PHP ในไม่ช้า (ขณะนี้ถูกทำเครื่องหมายว่าเลิกใช้งานแล้ว ) [คำตอบที่ดีนี้] [0] จะอธิบายรายละเอียดเพิ่มเติมว่าเหตุใดจึงไม่ดี [0]: stackoverflow.com/a/12860046/1055295
Andrei Bârsan

2
1) คุณยืนยันที่จะใช้อินเทอร์เฟซเก่า ๆ (mysql) ที่ถูกทำเครื่องหมายว่าล้าสมัยในเอกสารตั้งแต่ยุค 2) ด้วยเหตุผลแปลก ๆ ที่คุณต้องการผสมกับตัวตายตัวแทนแทนที่จะทำในสิ่งที่ถูกต้องและแปลงเป็นแบบใหม่ 3 ) คุณแปลกใจมากที่คุณถาม SO เกี่ยวกับเรื่องนี้ไม่ได้ผลแม้ว่ามันจะค่อนข้างชัดเจนว่าสิ่งที่คุณทำนั้นเป็นเรื่องไร้สาระ
fvu

1
ไม่ใช่เรื่องไสยศาสตร์ แน่นอนคุณสามารถเขียนโค้ดที่ไม่ดีด้วยmysqli_*ฟังก์ชันและโค้ดที่ดีmysql_*ได้ แต่หมวดหมู่หลังถูกทำเครื่องหมายว่าเลิกใช้แล้วเนื่องจากเป็นชุดฟังก์ชันที่ด้อยกว่าจึงไม่สามารถรองรับการเรียกใช้แบบ OO หรือแม้แต่คำสั่งที่เตรียมไว้ (เพื่อตั้งชื่อเพียงสองตัวอย่าง) มีตัวเลือกให้เลือกสองเครื่องมือในการทำงานเดียวกันซึ่งหนึ่งในนั้นดีกว่าในระยะยาวและมีความยืดหยุ่นมากกว่าอย่างชัดเจนคำตอบที่ถูกต้องไม่ชัดเจนหรือไม่?
Andrei Bârsan

1
ไม่แน่นอน อย่างไรก็ตามด้วยตัวเลือกในการเลือกระหว่างฟังก์ชันที่เลิกใช้งานและฟังก์ชันที่สนับสนุนอย่างแข็งขันสำหรับเช่นการหมุนนามธรรมของคุณเองทำไมต้องใช้ฟังก์ชันเก่า ๆ
Andrei Bârsan

คำตอบ:


67

ไม่คุณไม่สามารถใช้mysqlและmysqliร่วมกันได้ เป็น API ที่แยกจากกันและทรัพยากรที่สร้างขึ้นไม่สามารถทำงานร่วมกันได้

มีmysqli_closeแม้ว่า


แม้ว่าคุณจะไม่จำเป็นต้องปิดการเชื่อมต่อก็ตาม อ็อบเจ็กต์ทำความสะอาดตัวเองเมื่อไม่มีการอ้างอิงอีกต่อไป (ไม่แน่ใจว่าทรัพยากรเก่าธรรมดาจะทำเช่นนั้นได้หรือไม่ แต่วัตถุสามารถใช้ประโยชน์จาก RAII ได้ในระดับที่ไม่สำคัญ)
cHao

@cHao ไม่เพียงแค่นั้น แต่ PHP จะปิดการเชื่อมต่อ MySQL ที่เปิดอยู่เมื่อสคริปต์ออก
Explosion Pills

1
แต่ไม่เสมอไปสำหรับประสบการณ์ของฉันเราจึงวางไว้ที่ด้านล่างของไฟล์เสมอ
RationalRabbit

15

เพียงเพื่อให้คำตอบทั่วไปเกี่ยวกับ MYSQL API ทั้งสามพร้อมการอ้างอิง:

คุณไม่สามารถผสมใด ๆ ในสาม ( mysql_*, mysqli_*, PDO) ข้อมูล MySQL API จาก PHP ด้วยกันก็เพียงไม่ทำงาน แม้แต่ในคำถามที่พบบ่อยด้วยตนเอง :

มันเป็นไปไม่ได้ที่จะผสมนามสกุล ดังนั้นสำหรับตัวอย่างเช่นผ่านการเชื่อมต่อ mysqli จะ PDO_MySQL หรือต่อ / MySQL จะไม่ทำงาน


คุณต้องใช้ MySQL API เดียวกันและฟังก์ชันที่เกี่ยวข้องตั้งแต่การเชื่อมต่อไปจนถึงการสืบค้น


ผู้ชายบางคนพยายามบอกฉันในวันนี้ว่าพวกเขาไม่มีปัญหา / ข้อผิดพลาดเมื่อผสมmysql_real_escape_string()กับโค้ดที่เหลือที่เป็น PDO มีบางอย่างที่ฉันไม่เคยได้รับจากการทำงานกับ API ต่างๆเหล่านี้หรือไม่ ฉันเป็นคนงมงายอยู่ที่นี่หรือเปล่า? นี่เป็นเพียงคำถาม "ที่ถูกลบแล้ว" stackoverflow.com/q/34209127เท่านั้นที่สามารถดูได้โดยสมาชิก 10K + ทุกคนที่ไม่ควรสงสัย สิ่งนี้เกี่ยวข้องกับ$stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- ฉันขาดอะไรที่นี่หรือไม่?
Funk Forty Niner

1
@ เฟร็ด-II- คุณกำลังขวา :) อ่านคู่มือการแสดงให้เห็นว่าคุณมีความถูกต้อง สิ่งที่อาจเกิดขึ้นคือmysql_real_escape_string()จะพยายามเชื่อมต่อกับพารามิเตอร์เริ่มต้นอย่างเงียบ ๆซึ่งใช้งานได้กับ OP ดังนั้นมันจึงทำการเชื่อมต่อเพื่อรับชุดอักขระ ดังนั้น OP จึงมี 2 การเชื่อมต่อ
Rizier123

ถ้าอย่างน้อย OP บอกฉัน / เราว่าพวกเขาอาจมีการเชื่อมต่อแยกกัน 2 ครั้งฉันก็อาจจะเห็นด้วย พวกเขาตัดสินใจเป็นอย่างอื่น อย่างไรก็ตามฉันยังไม่เห็นว่าจะยังคงใช้งานได้อย่างไร ถ้าเป็นเช่นนั้นฉันงุนงง
Funk Forty Niner

@ เฟร็ด-II- ดู: link_identifierini_get()มันจะใช้การตั้งค่าการเชื่อมต่อค่าเริ่มต้นซึ่งจะได้รับด้วย ดังนั้นมันอาจใช้ได้กับ OP ด้วยการตั้งค่าเริ่มต้น ฉันจะทิ้งมันไว้และรับกาแฟใหม่ (☕☕☕)
Rizier123

sqlsrv_query()คุณอาจต้องการที่จะเพิ่มบางสิ่งบางอย่างเกี่ยวกับ ฉันเพิ่งปิดคำถามที่นี่stackoverflow.com/q/41263771
Funk Forty Niner

2

ในทางเทคนิคคุณสามารถใช้การเชื่อมต่อแยกกันได้มากเท่าที่คุณต้องการในขณะที่ปัญหาของคุณเกิดจากการพิมพ์ผิดเพียงอย่างเดียว - คุณไม่สามารถใช้ทรัพยากรจากส่วนขยายเดียวกับฟังก์ชันจากอีกรายการหนึ่งซึ่งค่อนข้างชัดเจน

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


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

-3

MySQLiมีความปลอดภัยมากกว่าMySQLที่ตอนนี้เลิกใช้แล้ว นั่นเป็นเหตุผลที่คุณควรยึดติดMySQLiและคุณไม่สามารถผสมได้เนื่องจากทั้งสองอย่างแตกต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.