• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

pokazywanie ostatnich wiadomosci!

Object Storage Arubacloud
0 głosów
97 wizyt
pytanie zadane 25 marca 2017 w PHP przez prymex Obywatel (1,250 p.)

Witam męczę się już z 4 godzinę z skryptem który napisałem chodzi oto że ma wyświetlać ostatnią wiadomość z konwersacji od  danego użytkownika lecz w tym błąd iż on pokazuje wiadomości tylko te które ja wysłałem do użytkownika a nie i te i te tutaj jest kod :

 

<?php

    echo '<div class=\'kategorie\'>Wiadomości :</div>';

require_once("../../polaczenie/connect.php");

$idek = $_SESSION['ajdi'];

$wiadomosci = $polaczenie->query("SELECT * FROM wiadomosci WHERE odkogo = '$idek' OR dokogo = '$idek'");

$ilosc = $wiadomosci->RowCount();

if ($ilosc>0){
        
        
    while ($r = $wiadomosci->fetch(PDO::FETCH_ASSOC)){
    
    
    $tresc = $r['tresc'];    
    
        
    $data = $r['data'];    

    $date = date_create($data);
    
    $dataczas = new DateTime();
    
    $czas_teraz = date_format($dataczas, 'Y-m-d');
    
    $czas_wyslania = date_format($date, 'Y-m-d' );
    
    if (strlen($tresc)>25)
    {
        $tresci = substr($tresc, 0, 25);
        $tresc = $tresci . "...";
    }
    
    $odkogo1 = $r['odkogo'];
    
    $dokogo2 = $r['dokogo'];
    
    
    
    if ($odkogo1 == $idek)
    {
        $odkogo1 = $dokogo2;
        $dokogo2 = $odkogo1;
    }
    
    

    
    
        $wiadomosciod = $polaczenie->Prepare("SELECT * FROM wiadomosci WHERE odkogo = :odkogo AND dokogo = :dokogo ORDER BY id DESC");
        
        $wiadomosciod->bindValue( ':odkogo', $odkogo1 );
        $wiadomosciod->bindValue( ':dokogo', $dokogo2 );
        $wiadomosciod->Execute();

        $ilosc1 = $wiadomosciod->RowCount();
        
        if ($ilosc1<1){
    
    $dane = $polaczenie->Prepare("SELECT * FROM uzytkownicy WHERE ajdi = :odkogo");
    
    $dane->bindValue( ':odkogo', $odkogo1 );
    $dane->Execute();
    
    while ($petly = $dane->fetch(PDO::FETCH_ASSOC)){
    
    $imie = $petly['imie'];
    
    $nazwisko = $petly['nazwisko'];

    $id = $petly['ajdi'];

    
    echo '<div class=\'wiadomosci\'>';
    echo '<a href=\'?wyslij_wiadomosci&do=' . $id . '\'>' . $imie . ' ' . $nazwisko . '</a>';
    if ($czas_teraz == $czas_wyslania)
    {
        echo '<div class=\'data\'>' . date_format($date, 'H:i' ) . '</div>';
    }
    else
    {
        echo '<div class=\'data\'>' . date_format($date, 'Y-m-d H:i' ) . '</div>';
    }
    echo '<div class=\'tresc\'>'. $tresc . '</div>';
    echo '</div>';
        
        
    }
        }
    
    }
    
}
?>

 

1 odpowiedź

0 głosów
odpowiedź 27 marca 2017 przez xandros Nałogowiec (29,450 p.)
edycja 27 marca 2017 przez xandros

CR:

<?php

echo '<div class=\'kategorie\'>Wiadomości :</div>';

require_once("../../polaczenie/connect.php");

$idek = $_SESSION['ajdi'];

$wiadomosci = $polaczenie->query("SELECT * FROM wiadomosci WHERE odkogo = '$idek' OR dokogo = '$idek'"); //sql injection? :v

$ilosc = $wiadomosci->RowCount();

if ($ilosc > 0) { //bezsensowny warunek, wystarczy wpisać $ilosc
    
    
    while ($r = $wiadomosci->fetch(PDO::FETCH_ASSOC)) { //może yeldem a potem foreach? 
        //zmien nazwe zmiennej "r", na taka, o ktorej wiadomo, co przechowuje
        
        
        $tresc = $r['tresc']; //nie musisz przypisywac zmiennych z tablicy, po prostu użyj ich jak zmiennych
        
        
        $data = $r['data']; //j.w.
        
        $date = date_create($data);
        
        $dataczas = new DateTime();
        
        $czas_teraz = date_format($dataczas, 'Y-m-d');
        
        $czas_wyslania = date_format($date, 'Y-m-d');
        
        if (strlen($tresc) > 25) {
            $tresci = substr($tresc, 0, 25);
            $tresc  = $tresci . "...";
        }
        
        $odkogo1 = $r['odkogo']; //j.w.
        
        $dokogo2 = $r['dokogo']; //j.w.
        
        
        
        if ($odkogo1 == $idek) {
            $odkogo1 = $dokogo2;
            $dokogo2 = $odkogo1;
        } //domyslam sie, co tu sie odwalilo, ale nie pochwalam
        
        
        
        
        
        $wiadomosciod = $polaczenie->Prepare("SELECT * FROM wiadomosci WHERE odkogo = :odkogo AND dokogo = :dokogo ORDER BY id DESC"); //prepare z malej
        
        $wiadomosciod->bindValue(':odkogo', $odkogo1);
        $wiadomosciod->bindValue(':dokogo', $dokogo2);
        $wiadomosciod->Execute();
        
        $ilosc1 = $wiadomosciod->RowCount();
        
        if ($ilosc1 < 1) {
            
            $dane = $polaczenie->Prepare("SELECT * FROM uzytkownicy WHERE ajdi = :odkogo");
            
            $dane->bindValue(':odkogo', $odkogo1);
            $dane->Execute();
            
            while ($petly = $dane->fetch(PDO::FETCH_ASSOC)) {
                
                $imie = $petly['imie']; //j.w.
                
                $nazwisko = $petly['nazwisko']; //j.w.
                
                $id = $petly['ajdi']; //j.w.
                
                
                echo '<div class=\'wiadomosci\'>';
                echo '<a href=\'?wyslij_wiadomosci&do=' . $id . '\'>' . $imie . ' ' . $nazwisko . '</a>';
                if ($czas_teraz == $czas_wyslania) {
                    echo '<div class=\'data\'>' . date_format($date, 'H:i') . '</div>';
                } else {
                    echo '<div class=\'data\'>' . date_format($date, 'Y-m-d H:i') . '</div>';
                }
                echo '<div class=\'tresc\'>' . $tresc . '</div>';
                echo '</div>';
                
                
            }
        }
    }
}//schody do nieba :V, za duzo nested blocks

Niestety calość masz do przepisania.

Czego brakuje, by rozwiązać twój problem: tabeli sql, która będzie wskazywać kto jest odbiorcą, a kto nadawcą

Jedna tabela która przechowuje wszystkie wiadomości, druga do wskazywania odbiorcy i nadawcy... by nie przechowywać tej samej wiadomości 2x.

 

O błedach do poprawy:

Dużo kodu się powtarza. Potwórz funkcje, zachowując zasady: 1 funkcja jedno dokladne zadanie. maksymalnie 30 lini kodu, 3 nested blocki (zagnieżdżenia warunków/pętli/etc), nie przesadzaj z iloscia "return".

Nazwy zmiennych do poprawy, niektóre nie wiadomo w ogóle, co przetrzymują. 

Tworzysz niepotrzebne zmienne, kopiując tam dane z tablicy, kiedy możesz po prostu zadziałać na tej tablicy.

Odizoluj za pomocą funkcji to, część prezentacji (wszystko, co wypluwasz na ekran), od części logiki (np. zapytania SQL) 

komentarz 27 marca 2017 przez Benek Szeryf (90,790 p.)

wyplóważ

Ten uczuć kiedy patrzysz na wyraz i stwierdzasz, że nigdy wcześniej go nie znałeś surprise

1
komentarz 27 marca 2017 przez xandros Nałogowiec (29,450 p.)
dzieki, nie powinienem pracować po godzinach...

Podobne pytania

0 głosów
1 odpowiedź 120 wizyt
0 głosów
1 odpowiedź 495 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez Jedyn Obywatel (1,200 p.)
0 głosów
1 odpowiedź 248 wizyt
pytanie zadane 28 kwietnia 2019 w PHP przez iframeeh Użytkownik (680 p.)

92,538 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,923 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...