PHP używa zasobów jako specjalnej zmiennej do przechowywania linków do zewnętrznych obiektów, takich jak pliki i połączenia z bazami danych. Każdy zasób otrzymuje identyfikator w postaci liczby całkowitej. (Dokumentacja )
Nieudane połączenia
Jeśli połączenie z bazą danych nie powiedzie się, prawdopodobnie otrzymasz błąd „Określona zmienna nie jest prawidłowym zasobem MySQL-Link”, jak wspomniał Dan Breen, ponieważ zmienna, która ma przechowywać zasób, jest pusta.
$link = mysql_connect('localsoth','baduser','badpass'); // failed connection
$result = mysql_query("SELECT 1", $link); // throws error
Ponieważ w komunikacie o błędzie pojawia się określony identyfikator zasobu, prawdopodobnie z jakiegoś powodu połączenie z bazą danych zostało niespodziewanie zamknięte. Twój program nadal ma zmienną z identyfikatorem zasobu, ale obiekt zewnętrzny już nie istnieje. To może być z powodu mysql_close()
zadzwoń gdzieś przed wywołaniem mysql_query
lub błąd zewnętrznej bazy danych, który spowodował zamknięcie połączenia.
$link = mysql_connect();
mysql_close($link);
// $link may still contain a resource identifier, but the external object is gone
mysql_query("SELECT 1", $link);
Ponowne używanie połączeń
Problem z rozszerzeniem mysql i mysql_connect()
jest to, że domyślnie, jeśli przekażesz te same parametry w kolejnych wywołaniach, użyje ono ponownie istniejącego połączenia zamiast tworzyć nowe (Dokumentacja
). Można to naprawić, przekazując true
do $new_link
parametr.
Sam spotkałem się z tym w systemie testowym, w którym dane z dwóch oddzielnych baz danych w środowisku produkcyjnym zostały połączone na jednym serwerze testowym oraz podczas testowania mysql_xxx()
wywołania funkcji przeszły po sobie i zepsuły system.
$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
Korzystanie z $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
Edycja:
Na marginesie polecam użycie MySQLi rozszerzenie lub PDO
zamiast tego, jeśli to możliwe. Rozszerzenie MySQL staje się dość stare i nie może korzystać z żadnych funkcji starszych niż MySQL w wersji 4.1.3. Spójrz na http://www.php.net/manual/en/mysqli .przegląd.php
aby uzyskać szczegółowe informacje na temat różnic między trzema interfejsami.