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

pokazywanie ostatnich wiadomosci!

VPS Starter Arubacloud
0 głosów
88 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,690 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ź 119 wizyt
0 głosów
1 odpowiedź 485 wizyt
pytanie zadane 29 marca 2017 w C i C++ przez Jedyn Obywatel (1,200 p.)
0 głosów
1 odpowiedź 247 wizyt
pytanie zadane 28 kwietnia 2019 w PHP przez iframeeh Użytkownik (680 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...