Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] System prywatnych wiadomości - Masz () nową wiadomość
Forum PHP.pl > Forum > Przedszkole
Kerth
Witajcie,
otóż tak jak w temacie. Jak mam zrobić, żeby pojawiało mi się Masz () nową wiadomość i w miejsce nawiasów wpisało liczbę (sumę - COUNT) wiadomości(czyli liczbę pobranych wartości[zer] z bazy danych). Mam pole `przeczytane_pw` i jak jest 0 to jest nieprzeczytane jak 1 to przeczytane. Czy ja to dobrze robię, czy może problem jest gdzieś indziej? Bo nie pobiera mi nic i ciągle wykonuje się tylko else.

  1. $pobierz_czy_read = $db->prepare("SELECT COUNT(`przeczytane_pw`) FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy");
  2. $pobierz_czy_read->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
  3.  
  4. if(!$pobierz_czy_read->execute()){
  5. throw new Exception("Błąd zapytania");
  6. }else{
  7. $data_read_pw = $pobierz_czy_read->fetch();
  8. $wynik2_read_pw = $data_read_pw['przeczytane_pw'];
  9.  
  10. if($wynik2_read_pw == 1){
  11. echo '<span class = "tab"><span class="gray">Nie masz wiadomości</span></span>';
  12. }else{
  13. echo '<span class = "tab"><span class="lightgreen">Masz () <span class = "red">nieprzeczytaną</span> wiadomość!</span></span>';
  14. }
  15. }

Jakieś rady?
tzm
No to patrz... prosta sprawa. (sorki nie dziala mi Y)

Kazda nowa wiadomosc niech updateuje pole message_for_read +1 jesli jest to wiadomosc nie przecztana. Nie jest to doskonale rozwiazanie bo moglbs sie pokusic o serializacje tablic z id message w celu ustalenia jeszcze ktora wiadomosc jest przecztana a ktora nie.
Kazde odcztanie wiadomosci niech Ci updatuje pole message_for_read -1 jesli ja ktos przecztal.
Tm sposobem nie musisz robic count['row'] == 1 // nieprzecztana tlko masz wszstko w jednej tablic z baz tabeli user.
Mozesz sobie po ajaxie ustawic automatczne odswiezanie co iles tam milisekund tlko to jedno pole w bazie i jesli message_for_read > 0 to zmieniasz wartosc z Nie masz nowch... na Masz message_for_read(bo int) nowch wiadomosci.
Nie rob echo w funkcjach - korzstaj z return.

Tak to rozwiazalem jak przepiswalem facebooka kieds i zdawalo egzamin. Wdajnosciowo tez wdaje sie uzasadnione bo zamiast pobierac X wpisow wiadomosci co jedna sekunde - pobierasz jeden i jesli spelnia dan warunek to dopiero podejmujesz akcje odcztania ich. Tle.
adrianpl20
w zapytaniu po
  1. COUNT(`przeczytane_pw`)
dodaj
  1. AS wynik
czyli
  1. COUNT(`przeczytane_pw`) AS wynik
i w tablicy jako nazwe pola daj wynik
aras785
Cześć.

Kolega wyżej już odpowiedział na pytanie odnośnie zliczanie, a ja mam małą sugestie:
Jeśli możesz to sprawdzaj wiadomości dla użytkownika na podstawie jego ID, a nie nicku.

Pozdrawiam
Turson
Błąd leży gdzie indziej, w logice. Mianowicie, jeżeli kolumna `przeczytane_pw` przyjmuje wartość 0 lub 1, to
  1. if($wynik2_read_pw == 1){

nie ma sensu

Masz policzyć ilość rekordów, które są nieprzeczytane, gdzie przeczytane_pw = 0

  1. $pobierz_czy_read = $db->prepare("SELECT COUNT(`przeczytane_pw`) AS ilosc FROM `wiadomosci_pw` WHERE `wiadomosc_do` = :nick_odbiorcy AND przeczytane_pw = 0");
  2. $pobierz_czy_read->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
  3.  
  4. if(!$pobierz_czy_read->execute()){
  5. throw new Exception("Błąd zapytania");
  6. }
  7. else{
  8. $data_read_pw = $pobierz_czy_read->fetch();
  9. $wynik2_read_pw = $data_read_pw['ilosc'];
  10.  
  11. if($wynik2_read_pw==0){
  12. echo '<span class = "tab"><span class="gray">Nie masz wiadomości</span></span>';
  13. }
  14. else{
  15. echo '<span class = "tab"><span class="lightgreen">Masz ('.$wynik2_read_pw.') <span class = "red">nieprzeczytaną</span> wiadomość!</span></span>';
  16. }
  17. }
aras785
-- Jednak masz rację biggrin.gif
Kerth
Rzeczywiście działa. Dzięki za pomoc.

Podepnę się jeszcze raz do tego tematu. Mam zrobione wszystko z systemu prywatnych wiadomości oprócz linku z wiadomością. Jak taki link zrobić? Obecnie mam tak, że gdy kliknie się w odebrane:
http://iv.pl/images/82667606302760991926.png

są to po prostu tylko wiadomości pobierane zapytaniem z bazy danych. Ale jak zrobić link, że jak się w niego kliknie to ustawi na odczytane? Zapytanie wiem jak zrobić tylko z tym linkiem nie bardzo.
Turson
index.php?action=message&setRead=id_wiadomości
Link jest dowolny
Kerth
Ale nie chodzi mi o link w przeglądarce tylko o wyświetlenie zamiast gotowych wiadomości sformatowany <a href... </a> np.
<a href = ""> Tu temat wiadomości </a>
Turson
Nie rozumiem problemu
Kerth
U mnie wiadomości wyświetlają się tak:
http://iv.pl/images/82667606302760991926.png
a chcę, żeby zamiast wyświetlania od razu wszystkich wiadomości w słupku pojawił się link przenoszący do tej wiadomości.
Tak jak na forum: http://iv.pl/images/28556360714258001314.png
Wazniak96
Nom to tworzysz kolejny plik, który będzie pobierał z tablicy GET id wiadomości i ją wyświetlał. A wtedy tylko dajesz odnośnik do example.com/odczytaj.php?id=1

Oczywiście nie zapomnij zweryfikować w tym pliku czy osoba czytając wiadomość jest jej odbiorcą smile.gif
Kerth
Nie wiem jak sformułować zapytanie, które będzie pobierało GET`em dane z bazy. Kombinuję tak, ale nie działa:

  1. $id = $_GET['id'];
  2. $pobierz_pw = $db->prepare("SELECT `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `id` = :id");
  3. $pobierz_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
  4. $pobierz_pw->bindValue(":id", $id, PDO::PARAM_INT);
  5. $pobierz_pw -> closeCursor();
  6. if(!$pobierz_pw->execute()){
  7. throw new Exception("Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!");
  8. }


Mam błędy typu:

  1. Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\WebServ\httpd\strona4\get_pw_message.php on line 106
  2.  
  3. Fatal error: Uncaught exception 'Exception' with message 'Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!' in C:\WebServ\httpd\strona4\get_pw_message.php:107 Stack trace: #0 {main} thrown in C:\WebServ\httpd\strona4\get_pw_message.php on line 107


Co robię nie tak?
Pyton_000
Chcesz bindować 2 elementy a w zapytaniu masz 1
Kerth
No racja ale jak usunę :nick_odbiorcy i tak zostaje mi:


  1. Fatal error: Uncaught exception 'Exception' with message 'Wystąpił błąd podczas pobierania prywatnych wiadomości. Skontaktuj się z programistą aplikacji!' in C:\WebServ\httpd\strona4\get_pw_message.php:107 Stack trace: #0 {main} thrown in C:\WebServ\httpd\strona4\get_pw_message.php on line 107
Turson
Wyświetlaj błędy zapytań na poziomie dev
  1. if(!$pobierz_pw->execute()){
  2. print_r(!$pobierz_pw->errorInfo());
  3. }
Kerth
Ten kod nie wyświetla nic. Żadnej reakcji.
Turson
CloseCursor() powinno być chyba za execute()
Pyton_000
  1. $id = $_GET['id'];
  2. try {
  3. $pobierz_pw = $db->prepare("SELECT `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `id` = :id");
  4. $pobierz_pw->bindValue(":nick_odbiorcy", $_SESSION['nick'], PDO::PARAM_STR);
  5. $pobierz_pw->bindValue(":id", $id, PDO::PARAM_INT);
  6. $pobierz_pw -> closeCursor();
  7. $pobierz_pw->execute();
  8. }
  9. catch(PDOException $e) {
  10. echo $e->getMessage();
  11. }
Kerth
Nic niestety nie wyświetla się. Może pokażę jak to wygląda:

  1. $id = $_GET['id'];
  2.  
  3. try {
  4. $pobierz_pw = $db->prepare("SELECT `wiadomosc_od`, `temat_pw`, `wiadomosc_pw`, `data_pw` FROM `wiadomosci_pw` WHERE `id` = :id");
  5. $pobierz_pw->bindValue(":id", $id, PDO::PARAM_INT);
  6. $pobierz_pw -> closeCursor();
  7. $pobierz_pw->execute();
  8. }
  9. catch(PDOException $e) {
  10. echo $e->getMessage();
  11. }
  12.  
  13. foreach($pobierz_pw as $row_pw)
  14. {
  15. echo '<a href = "get_pw_message.php"> Temat: '.$row_pw['temat_pw'].'</a> </br>';
  16.  
  17. echo "</br>Nadawca: \t";
  18. echo('<span class = "lightgreen">');
  19. echo ''.$row_pw['wiadomosc_od'].'</br>' ;
  20. echo('</span>');
  21.  
  22. echo "Temat: \t";
  23. echo('<span class = "lightgreen">');
  24. echo ''.$row_pw['temat_pw'].'</br>';
  25. echo('</span>');
  26.  
  27. echo "Treść: \t";
  28. echo('<span class = "lightgreen">');
  29. echo ''.$row_pw['wiadomosc_pw'].'</br>';
  30. echo('</span>');
  31.  
  32. echo "Otrzymano: \t";
  33. echo('<span class = "lightgreen">');
  34. echo ''.$row_pw['data_pw'].'</br>';
  35. echo('</span>');
  36. echo '________________________________</br>';
  37. }
Pyton_000
wywal to: $pobierz_pw -> closeCursor();
Kerth
Nie ma żadnej różnicy.
Turson
A czego ty oczekujesz? Operujesz na obiekcie. Gdzie się podziało fetchAll() ... ?
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.