PHP sử dụng tài nguyên như một biến đặc biệt để giữ các liên kết đến các đối tượng bên ngoài, chẳng hạn như tệp và kết nối cơ sở dữ liệu. Mỗi tài nguyên được cấp một id số nguyên. ( Tài liệu )
Kết nối không thành công
Nếu kết nối cơ sở dữ liệu không thành công, bạn sẽ có thể gặp phải lỗi "Biến được chỉ định không phải là tài nguyên MySQL-Link hợp lệ", như Dan Breen đã đề cập, vì biến được cho là giữ tài nguyên là null.
$link = mysql_connect('localsoth','baduser','badpass'); // failed connection
$result = mysql_query("SELECT 1", $link); // throws error
Vì bạn nhận được một ID tài nguyên cụ thể trong thông báo lỗi, kết nối cơ sở dữ liệu có thể bị đóng đột ngột vì một số lý do. Chương trình của bạn vẫn có một biến có ID tài nguyên, nhưng đối tượng bên ngoài không còn tồn tại. Điều này có thể là do một mysql_close()
gọi đến một nơi nào đó trước khi gọi tới mysql_query
hoặc lỗi cơ sở dữ liệu bên ngoài đã đóng kết nối.
$link = mysql_connect();
mysql_close($link);
// $link may still contain a resource identifier, but the external object is gone
mysql_query("SELECT 1", $link);
Sử dụng lại các kết nối
Sự cố với tiện ích mở rộng mysql và mysql_connect()
là theo mặc định nếu bạn chuyển cùng một tham số trong các cuộc gọi liên tiếp, nó sẽ sử dụng lại kết nối hiện có thay vì tạo kết nối mới ( Tài liệu
). Điều này có thể được khắc phục bằng cách chuyển true
tới $new_link
tham số.
Bản thân tôi đã gặp phải điều này trên một hệ thống thử nghiệm trong đó dữ liệu từ hai cơ sở dữ liệu riêng biệt trong quá trình sản xuất được kết hợp trên một máy chủ thử nghiệm và trong quá trình thử nghiệm mysql_xxx()
các lệnh gọi hàm đi qua nhau và phá vỡ hệ thống.
$link1 = mysql_connect('localhost','user','pass'); // resource id 1 is given
$link2 = mysql_connect('localhost','user','pass'); // resource id 1 is given again
mysql_close($link2); // the connection at resource id 1 is closed
mysql_query("SELECT 1", $link1); // will fail, since the connection was closed
Sử dụng $new_link
:
$link1 = mysql_connect('localhost','user','pass'); // resource id 1 is given
$link2 = mysql_connect('localhost','user','pass', true); // resource id 2 is given
mysql_close($link2); // the connection at resource id 2 is closed
mysql_query("SELECT 1", $link1); // the connection at resource id 1 is still open
Chỉnh sửa:
Ngoài ra, tôi khuyên bạn nên sử dụng MySQLi extension hoặc PDO
thay vào đó, nếu có thể. Phần mở rộng MySQL đang trở nên khá cũ và không thể tận dụng bất kỳ tính năng nào trong phiên bản MySQL 4.1.3. Hãy xem http://www.php.net/manual/en/mysqli .overview.php
để biết một số chi tiết về sự khác biệt giữa ba giao diện.