Tôi có thể kết hợp các API MySQL trong PHP không?


106

Tôi đã tìm kiếm trên mạng và cho đến nay những gì tôi thấy là bạn có thể sử dụng mysql_mysqli_cùng nhau có nghĩa là:

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

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

hoặc là

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

Hợp lệ nhưng khi tôi sử dụng mã này, những gì tôi nhận được là:

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

Đối với đầu tiên và giống nhau ngoại trừ với mysqli_close(). Đối với cái thứ hai.

Vấn đề là gì? Tôi không thể sử dụng mysql_mysqlicùng nhau? Hay là nó bình thường? Là cách tôi có thể kiểm tra xem các kết nối có hợp lệ không? (cái if(mysq...))


5
mysql không được dùng nữa, nó chỉ có nghĩa là chúng sẽ không hoạt động cùng nhau. Tại sao bạn lại cố gắng làm như vậy ..?
Sterling Archer

7
Bạn nên tránh sử dụng các mysql_*chức năng hoàn toàn. Chúng dễ xảy ra lỗi và không an toàn, và chúng sẽ sớm bị xóa khỏi PHP (chúng được đánh dấu là không dùng nữa vào lúc này). [Câu trả lời tuyệt vời này] [0] đi sâu hơn vào giải thích lý do tại sao chúng tệ. [0]: stackoverflow.com/a/12860046/1055295
Andrei Bârsan

2
1) bạn khăng khăng sử dụng một giao diện cũ kém chất lượng (mysql) được đánh dấu là lỗi thời trong tài liệu kể từ năm 2) vì một số lý do kỳ lạ bạn muốn kết hợp nó với người kế nhiệm thay vì làm đúng và chuyển đổi sang giao diện mới 3 ) bạn ngạc nhiên đến nỗi bạn hỏi trên SO về nó cũng không thành công, mặc dù rõ ràng là những gì bạn đang làm là vô nghĩa.
fvu

1
Nó không phải là một mê tín. Tất nhiên bạn có thể viết mã xấu với các mysqli_*chức năng và mã tốt với các chức năng mysql_*. Nhưng danh mục thứ hai được đánh dấu là không được dùng nữa vì nó là tập hợp hàm kém hơn, không thể hỗ trợ các lệnh gọi kiểu OO hoặc thậm chí các câu lệnh đã chuẩn bị (chỉ nêu tên hai ví dụ). Đưa ra lựa chọn hai công cụ để thực hiện cùng một công việc, một trong số đó rõ ràng là tốt hơn về lâu dài và linh hoạt hơn, câu trả lời đúng không rõ ràng sao?
Andrei Bârsan

1
Dĩ nhiên là không. Tuy nhiên, với tùy chọn lựa chọn giữa chức năng không dùng nữa và chức năng được hỗ trợ tích cực, chẳng hạn như cuốn sách trừu tượng của riêng bạn, tại sao lại sử dụng các chức năng cũ?
Andrei Bârsan

Câu trả lời:


65

Không, bạn không thể sử dụng mysqlmysqlicùng nhau. Chúng là các API riêng biệt và các tài nguyên chúng tạo ra không tương thích với nhau.

Có một mysqli_close, mặc dù.


Mặc dù bạn không bao giờ cần phải đóng kết nối; các đối tượng tự dọn dẹp khi chúng không còn được tham chiếu ở bất kỳ đâu. (Không chắc liệu các tài nguyên cũ có làm được điều đó hay không, nhưng các đối tượng thực sự có thể tận dụng RAII ở một mức độ không đáng kể.)
cHao

@cHao không chỉ có vậy, nhưng PHP sẽ đóng bất kỳ kết nối MySQL mở khi các lối ra kịch bản
Thuốc nổ

1
Nhưng không phải lúc nào cũng vậy, theo kinh nghiệm của tôi, vì vậy chúng tôi luôn đặt dấu đóng ở cuối tệp.
RationalRabbit

14

Chỉ để đưa ra câu trả lời chung ở đây về cả ba API MYSQL với tài liệu tham khảo:

Bạn không thể trộn lẫn bất kỳ của ba ( mysql_*, mysqli_*, PDO) MYSQL API từ PHP với nhau, nó chỉ không làm việc. Nó thậm chí còn có trong Câu hỏi thường gặp thủ công :

Không thể trộn các phần mở rộng . Vì vậy, ví dụ: chuyển kết nối mysqli tới PDO_MySQL hoặc ext / mysql sẽ không hoạt động .


Bạn cần sử dụng cùng một API MySQL và các chức năng liên quan của nó, từ kết nối đến truy vấn.


Một số người đã cố gắng nói với tôi hôm nay rằng họ không có vấn đề / lỗi khi trộn mysql_real_escape_string()với phần còn lại của mã là PDO. Có điều gì tôi không đạt được ở đây trong thời gian làm việc với các API khác nhau này không? Tôi có phải là người dốt ở đây không? Điều này là cho câu hỏi "hiện đã bị xóa" stackoverflow.com/q/34209127 chỉ có 10K + thành viên mới có thể xem được nên bất cứ ai thắc mắc. Điều này liên quan đến $stmt3->execute(array('classID' => $_POST['class'],'studentID' => mysql_real_escape_string($substr)))- Tôi có thiếu thứ gì ở đây không?
Funk Forty Niner

1
@ Fred-ii- Bạn đúng :) Đọc hướng dẫn sử dụng cho thấy bạn đã đúng . Điều có thể xảy ra là, điều đó mysql_real_escape_string()sẽ âm thầm thử tạo kết nối với các tham số mặc định sau đó hoạt động cho OP. Vì vậy, nó chỉ thực hiện kết nối để có được bộ ký tự. Vì vậy, OP có 2 kết nối
Rizier123

Nếu ít nhất OP đã nói với tôi / chúng tôi rằng họ có thể có 2 kết nối riêng biệt, tôi có lẽ đã đồng ý; họ đã quyết định khác. Tuy nhiên, tôi vẫn không thể thấy cách đó vẫn hoạt động. Nếu nó xảy ra, tôi bối rối.
Funk Forty Niner

@ Fred- ii- Xem: link_identifier Nó sẽ sử dụng cài đặt kết nối mặc định mà nó có ini_get(). Vì vậy, nó có thể chỉ hoạt động cho OP với cài đặt mặc định. Tôi sẽ chỉ để nó và lấy một ít cà phê mới (☕☕☕).
Rizier123

Bạn có thể muốn thêm điều gì đó về sqlsrv_query(). Tôi vừa đóng một câu hỏi ở đây stackoverflow.com/q/41263771
Funk Forty Niner 21/12/16

2

Về mặt kỹ thuật, bạn có thể sử dụng bao nhiêu kết nối riêng biệt tùy thích, trong khi vấn đề của bạn chỉ do lỗi đánh máy - bạn chỉ không thể sử dụng tài nguyên từ một tiện ích mở rộng với các chức năng từ một tiện ích mở rộng khác, điều này khá rõ ràng.

Tuy nhiên, bạn nên tránh nhiều kết nối từ cùng một tập lệnh , bất kể từ một API hay các API khác nhau. Vì nó sẽ tạo gánh nặng cho máy chủ cơ sở dữ liệu của bạn và làm cạn kiệt tài nguyên của nó. Vì vậy, mặc dù về mặt kỹ thuật bạn có thể làm được, nhưng bạn không nên kết hợp các phần mở rộng khác nhau trong mã của mình, hãy tiết kiệm trong thời gian ngắn tái cấu trúc.


Mặc dù đây có lẽ là một ý tưởng hay, nhưng kết nối gộp được phát triển vì lý do này. Khi bạn có nhiều yêu cầu web truy cập vào một máy chủ web, bạn không thể dễ dàng sử dụng cùng một kết nối, vì vậy bạn mở một kết nối mới. Tổng hợp kết nối tiết kiệm chi phí trên máy chủ ứng dụng và cơ sở dữ liệu.
Doug

-3

MySQLian toàn hơn rất nhiều so với MySQLcái mà hiện nay không được dùng nữa. Đó là lý do tại sao bạn nên gắn bó MySQLivà cũng không thể trộn chúng vì cả hai đều khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.