Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Ostrzeżenie:mysql_query():3 nie jest prawidłowym zasobem MySQL-Link

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak grupować według miesięcy w MySQL

  2. Wyszukiwanie MySQL na liście przecinków

  3. PHP — bezpieczne strony tylko dla członków z systemem logowania

  4. MySQL:wiele tabel czy jedna tabela z wieloma kolumnami?

  5. Jak zaimportować CSV do MySQL Workbench