Supplied argument is not a valid MySQL result resource

Z PHPEdia.pl
Skocz do: nawigacji, wyszukiwania

Ostrzeżenie "Supplied argument is not a valid MySQL result resource" najczęściej pojawia się w przypadku błędu w zapytaniu SQL, które ma zostać wykonane. Poniżej znajduje się poprawny kod, wykonujący zapytanie do bazy danych.

$conn = mysql_connect('localhost', 'user', 'password');
mysql_select_db('test');
$q = mysql_query("select * from tabtest");
$arr = mysql_fetch_array($q);
mysql_close($conn);

Zakładając, że istnieje baza danych o nazwie test oraz w bazie znajduje się tabela tabtest, powyższy kod zapisze do zmiennej $arr jeden wiersz pobrany z bazy.

Wystarczy jednak drobna literówka w zapytaniu, by pojawiło się tytułowe ostrzeżenie.

$q = mysql_query("select * form tabtest");

Inną przyczyną pojawiania się tego ostrzeżenia, jest próba odczytania danych z tabeli lub bazy, która nie istnieje.

mysql_select_db('nie_ma_takiej_bazy');
$q = mysql_query("select * form nie_ma_takiej_tabeli");

Podobnie rzecz ma się z poleceniem mysql_connect. Podanie niepoprawnego hosta, nazwy użytkownika lub hasła spowoduje wygenerowanie sporej ilości ostrzeżeń, między innymi "Supplied argument is not a valid MySQL result resource".

Ostatnim powodem występowania tego rodzaju ostrzeżeń jest próba odczytu danych przy pomocy mysql_fetch_*, podczas gdy zapytanie nie pobierało danych(select), a jedynie je aktualizowało(insert, update, delete). Wszystkie poniższe przykłady spowodują pojawienie się ostrzeżenia.

$q1 = mysql_query("insert into tabtest (sname) values ('aaaaa')");
mysql_fetch_array($q1);
 
$q2 = mysql_query("update tabtest set sname = 'qqqqqqq'");
mysql_fetch_array($q2);
 
$q3 = mysql_query("delete from tabtest");
mysql_fetch_array($q3);

Znajdowanie i usuwanie błędów

Najlepszym rozwiązaniem jest skorzystanie z gotowej warstwy abstrakcji, która załatwi sprawę za nas. Czasami jednak nie ma takiej możliwości, więc trzeba wiedzieć jak znajdować przyczynę pojawienia się ostrzeżenia. W tym celu należy zmodyfikować pierwszy przykład.

$conn = mysql_connect('localhost', 'user', 'password');
mysql_select_db('test') or die("Błąd podczas wybierania bazy danych");
$q = mysql_query("select * from tabtest") or die("Błąd podczas wykonywania zapytania");
mysql_fetch_array($q);
mysql_close($conn);

Wystarczy dodać or die('komunikat błędu'), by w prosty sposób znaleźć błąd. A dlaczego to działa? Wyjaśnienie jest bardzo banalne. Zarówno mysql_select_db, jak i mysql_query zwraca false w przypadku wystąpienia błędu. Operator or natrafia na false w pierwszym wyrażeniu i analizuje drugie. W drugim wyrażeniu znajduje się funkcja die, która wyświetla komunikat błędu i kończy działanie skryptu.

Linki zewnętrzne

  • PHP Errors List - lista popularnych błędów PHP i sposoby ich rozwiązania


Jest to element FAQ, czyli zestawienia odpowiedzi na najczęściej zadawane pytania.

Zestawienie: Informacje | Podstawy PHP | Porady praktyczne | Pytania z forum | Bezpieczeństwo