Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Błąd w pliku odbierania wiadomości
Forum PHP.pl > Forum > PHP
LucKy_skiLL
Witam, mam taki błąd


  1. Warning: mysql_num_rows() expects parameter 1 TO be resource, BOOLEAN given IN /home/luckyskill/domains/amxhelp.pl/public_html/id/ucp/wiadomosci/odbiorcza.php ON line 38



Cały kod

  1. <?
  2. session_start(); // rozpoczęcie sesji
  3. include('../../gora.php');
  4. include('../../panel.php');
  5.  
  6. echo "<div id='srodek'><div id='tlo'><div class='portfel_menu'>
  7. <center><a href='odbiorcza.php'>Skrzynka odbiorcza</a>
  8. <a href='newmsg.php' class='wplata'>Napisz nową wiadomość</a>
  9. <a href='nadawcza.php'>Skrzynka nadawcza</a>
  10. </center></div></div></div><br/><br/><br/><br/><br/>";
  11.  
  12. if ($_GET["id"]) {
  13. $id = intval($_GET["id"]); //zamieniamy zmiennš na liczbe, zapobiega to atakom typu sql injection
  14. if (mysql_num_rows(mysql_query("select wiad_od from wiadomosci where wiad_id=$id and wiad_czyj=0 and wiad_od=".$_SESSION['login']))) {
  15. mysql_query("delete from wiadomosci where wiad_id=$id"); //sprawdzamy czy wiadomoœć którš użytkownik chce usunšć faktycznie ależy do niego
  16. echo "Usunięto wiadomoœć!<br>";
  17. }
  18. }
  19.  
  20. else if ($_GET["co"]) {
  21. $co = intval($_GET["co"]); //zamieniamy zmiennš na liczbe, zapobiega to atakom typu sql injection
  22. if (mysql_num_rows(mysql_query("select wiad_od from wiadomosci where wiad_id=$id and wiad_czyj=0 and wiad_od=".$_SESSION['login']))) {
  23. mysql_query("update wiadomosci set wiad_przeczytane=1 where wiad_id=$co"); //po raz kolejny zostaje sprawdzony warunek,
  24. $wynik = mysql_query("select * from wiadomosci where wiad_id=$co and wiad_czyj=0"); //który również sprawdza właœciciela wiadomoœci
  25. $rekord = mysql_fetch_array($wynik);
  26. $nadawca = mysql_fetch_array(mysql_query("select login from uzytkownik where id=".$rekord["wiad_od"]));
  27. echo "<br><br><table><tr><td>Nadawca: ".$nadawca["user_login"]."</td><td>Data: ".date("d/m/Y H:i", strtotime($rekord["wiad_data"]))."</td><td><a href='odbiorcza.php?id=".$rekord["wiad_id"]."'>usuń</a></td></tr>";
  28. echo "<tr><td colspan=3>".$rekord["wiad_temat"]."</td></tr>";
  29. echo "<tr><td colspan=3>".$rekord["wiad_tresc"]."</td></tr>";
  30. echo "</table>";
  31. }
  32. }
  33.  
  34. else {
  35. $wynik = mysql_query("select * from wiadomosci where wiad_do=".$_SESSION['login']." and wiad_czyj=0 order by wiad_data");
  36.  
  37. echo "<div id='srodek'><div id='tlo'><table><tr><td>Nadawca</td><td>Temat</td><td>Data</td><td>&nbsp;</td></tr></div></div>";
  38. if (!mysql_num_rows($wynik))
  39. echo "<div id='srodek'><div id='tlo'><tr><td colspan=4 style='text-align:center'>Nie masz żadnych wiadomości!</div></div></td></tr>";
  40. else
  41. while ($rekord = mysql_fetch_array($wynik)) {
  42. $nadawca = mysql_fetch_array(mysql_query("select login from uzytkownik where id=".$rekord["wiad_od"]));
  43. $kw1 = "";
  44. $kw2 = "";
  45. if (!$rekord["wiad_przeczytane"]) {
  46. $kw1 = "<b>";
  47. $kw2 = "</b>";
  48. }
  49. echo "<tr><td>".$nadawca["login"]."</td><td><a href='odbiorcza.php?co=".$rekord["wiad_id"]."'>$kw1".$rekord["wiad_temat"]."$kw2</td><td>".date("d/m/Y H:i", strtotime($rekord["wiad_data"]))."</td><td><a href='odbiorcza.php?id=".$rekord["wiad_id"]."'>usuń</a></td></tr>";
  50. }
  51. echo "</table>";
  52. }
  53. ?>



Linia z errorem

  1. if (!mysql_num_rows($wynik))
Necsord
http://php.net/manual/en/function.mysql-query.php

Cytat
For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning resultset, mysql_query() returns a resource on success, or FALSE on error.
...
...
mysql_query() will also fail and return FALSE if the user does not have permission to access the table(s) referenced by the query.


Cytat
Example #1 Invalid Query

http://www.php.net/manual/en/function.mysql-error.php
Aware
Zrób tak:

  1. if(mysql_num_rows($wynik) == 0) {
  2. // komunikat o braku wiadomosci
  3. }
LucKy_skiLL
Mam dodać "mysql_error();" po tym ifie ?
Necsord
Niech Pan się zastanowi do czego służy ta funkcja, a następnie zastosuje ją w odpowiednim miejscu. Na stronie http://php.net/manual/en/function.mysql-query.php w pierwszym przykładzie ma Pan praktyczne jej zastosowanie .



Cytat(Aware @ 14.07.2012, 00:17:04 ) *
Zrób tak:

  1. if(mysql_num_rows($wynik) == 0) {
  2. // komunikat o braku wiadomosci
  3. }

Nie wiem skąd Panu przyszedł pomysł, że taki warunek zlikwiduje ostrzeżenie, które się pojawia.
LucKy_skiLL
Zmieniłem na:

  1. if(!$wynik)



Błędu nie ma, dziękuje za pomoc.
Necsord
Źle.
Przetłumacze Panu. Używa Pan metody mysql_query(), która zwraca przy błędzie false, a następnie w tym co Pan powyżej napisał Pan traktuje ten błąd jako brak wiadomości co nie koniecznie jest prawdą. Jak już napisałem, na stronie http://php.net/manual/en/function.mysql-query.php ma Pan poniższy przykład:
  1. $result = mysql_query('SELECT * WHERE 1=1');
  2. if (!$result) {
  3. die('Invalid query: ' . mysql_error());
  4. }
  5.  
  6. ?>


Pan ma go zastosować i sprawdzić co za wiadomość zwróci funkcja mysql_error, która to zwraca komunikat o typie błędu który wystąpił np błąd składni.

Idąc na łatwiznę to brakuje '' przy loginie.
  1. SELECT * FROM wiadomosci WHERE wiad_do=".$_SESSION['login']." AND wiad_czyj=0 ORDER BY wiad_data
LucKy_skiLL
Zrobiłem tak:

  1. if(!$wynik) {
  2. die('Invalid query:' . mysql_error());
  3. echo "<div id='srodek'><div id='tlo'><tr><td colspan=4 style='text-align:center'>Nie masz żadnych wiadomości!</div></div></td></tr>";
  4. }



I dostałem to:

Invalid query:Unknown column 'asd1' in 'where clause'
ethann
Kolega @Necsord praktycznie podał Ci rozwiązanie na tacy.. żeby uświadomić Cię jeszcze bardziej o co chodzi powiem tyle:
Powinieneś wiedzieć, że asd1 jest loginem w Twoim przypadku, a skoro zapytanie szuka kolumny o tej nazwie to najprawdopodobniej nie potrafktował tego jako stringu tylko jako nazwę kolumny. Żeby uświadomić sobie jeszcze bardziej o co MySQLowi chodzi proponuję całe zapytanie wyświetlić na ekranie, zrób po prostu nad funkcją die(), echo("całe zapytanie umieść tutaj");. Błąd powinien rzucić Ci się w oczy - o ile znasz składnie MySQLa...
LucKy_skiLL
W dalszym ciągu nie mam pojęcia, w czym tkwi problem.
ethann
Funkcja mysql_query() zwraca u Ciebie błąd. Jest to spowodowane tym, że zapytanie zostało źle skonstruowane i szuka kolumny która nie istnieje.
Cytat(Necsord)
Idąc na łatwiznę to brakuje '' przy loginie.

Ta odpowiedź zakańcza temat całkowicie..
Twoje zapytanie wygląda tak:
  1. SELECT * FROM wiadomosci WHERE wiad_do=".$_SESSION['login']." AND wiad_czyj=0 ORDER BY wiad_data

czyli po wrzuceniu zmiennej:
  1. SELECT * FROM wiadomosci WHERE wiad_do=asd1 AND wiad_czyj=0 ORDER BY wiad_data

Jak widzisz on szuka wiadomości, które mają odbiorce takiego samego jak wartość kolumny asd1, nie uznał asd1 jako nazwa odbiorcy bo zabrakło apostrofów/cudzysłowów.
Innymi słowy rozwiązanie twojego problemu wygląda tak:
  1. SELECT * FROM wiadomosci WHERE wiad_do='".$_SESSION['login']."' AND wiad_czyj=0 ORDER BY wiad_data

Czyli dodane zostają apostrofy przed i po ".$_SESSION['login']."
LucKy_skiLL
Dziękuje, teraz działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.