Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
[php+sql] mała pomoc
#1
Witajcie . Przepraszam , że pisze ale już mózg mam wypalony od myślenia Wink
Otóż piszę sobie takie coś jak przypuśćmy mamy na Facebook , że są posty na tablicy itp itd.
Wszystko się ładnie wczytuję po kliknięciu w "więcej" wczytuje się więcej postów wszystko gra.

Mój problem pojawia się gdy użytkownik doda jakiś post w formularzu , ponieważ nie odświeżam całej listy tylko dodaje na jej początek tego posta. Jednak wtedy po kliknięciu "więcej" ( zależności ile postów użytkownik dodał ) to te posty się dublują. Nie mam pomysłu jak to obejść. A także tego , że inni użytkownicy w tym momencie mogą coś dodać.

Ewentualny kod mogę podać lub coś do tłumaczyć Smile
Cytat:Wyrazić to co czuję , zabrakło by tyle słów....
Odpowiedz
#2
(25-04-2011, 16:28)kancik napisał(a): Witajcie . Przepraszam , że pisze ale już mózg mam wypalony od myślenia Wink
Otóż piszę sobie takie coś jak przypuśćmy mamy na Facebook , że są posty na tablicy itp itd.
Wszystko się ładnie wczytuję po kliknięciu w "więcej" wczytuje się więcej postów wszystko gra.

Mój problem pojawia się gdy użytkownik doda jakiś post w formularzu , ponieważ nie odświeżam całej listy tylko dodaje na jej początek tego posta. Jednak wtedy po kliknięciu "więcej" ( zależności ile postów użytkownik dodał ) to te posty się dublują. Nie mam pomysłu jak to obejść. A także tego , że inni użytkownicy w tym momencie mogą coś dodać.

Ewentualny kod mogę podać lub coś do tłumaczyć Smile
Pokaż kod.
Ajax?
PHP i MySQL Tworzenie stron WWW Vademecum profesjonalisty Wydanie 4
- sprzedam po rozsądnej cenie, stan jak nowa.

Carpe Di Em
Odpowiedz
#3
no dobra pokaże Ci ajax ale on najmniej potrzebny bo to chodzi o pobieranie z bay danych i jakoś wykluczenie tych co dodałem.

Kod PHP:
// dodanie wpisu
function set_status(){
    var 
old = $('#microblog_entries').html();
    var 
old2 = $('#entry_add input[type=submit]').val();
    $(
'#entry_add input[type=submit]').val('...');
    $.
ajax({
        
type"POST",
        
url"microblog/entries/add",
        
data: $('#entry_add').serialize(),
        
dataType"json",
        
success: function(json){

            $(
json['txt']).css('display','none').insertAfter('.microblog_title').delay(400).show('slow');
            if ( $(
'.microblog_not_exist') ) { $('.microblog_not_exist').remove();}
            $(
'#entry_add input[type=submit]').val(old2);
            $(
'#entry_add textarea[name=entry_body]').val('');
        },
        
error:function(){
            
alert('blad');
        }
        
    });
}
// pobranie wiecej wpisow

function microblog_get_more(x){


    $.
ajax({
        
type:"GET",
        
url"microblog/entries/show_last/"+x,
        
dataType"json",
        
success: function(json){
            $(
'.microblog_get_more').remove();
            $(
json['txt']).css('display','none').delay(0).insertAfter('.microblog_content:last').fadeIn();
        },
        
error: function() {
               
alert"Wystąpił błąd w połączniu :(");

        }    
    });        


na razie to wyglada prymitywnie bo po co mam coś robić ładniejsze skoro nie spełnia podstawowych założen.
dobra pobieram to jeszcze tak
Kod PHP:
return $this -> db -> query("SELECT mb.id,mb.id_user,mb.body,mb.date,u.login 
FROM "
.$this->db->dbprefix."microblog_entries
 
as mb , "
.$this->db->dbprefix."users as u WHERE mb.id_user=u.id ORDER BY mb.id DESC LIMIT ".$offset.",20");
//  to zapytanie złamałem by sie mniej wiecej miescilo tutaj na forum 

niby mógłbym sobie pobrać datę ostatniego dodanego w "locie" wpisu i liczyć te wszystkie wpisy w tabeli do pobrania jako starsze niż ta data. Może i by to było dobrym wyjściem. A jak ktoś by tam dopisał ze znajomych posta to by się pojawiła informacja gdzieś na ekranie , że dodał i wtedy by się odświeżyła lista , żeby już za dużo kombinować.
niby mógłbym sobie pobrać datę ostatniego dodanego w "locie" wpisu i liczyć te wszystkie wpisy w tabeli do pobrania jako starsze niż ta data. Może i by to było dobrym wyjściem. A jak ktoś by tam dopisał ze znajomych posta to by się pojawiła informacja gdzieś na ekranie , że dodał i wtedy by się odświeżyła lista , żeby już za dużo kombinować.
Cytat:Wyrazić to co czuję , zabrakło by tyle słów....
Odpowiedz
#4
Mamy tak:
- formularz dodawania - po dodaniu post jest dodawany na początek listy
- klik => więcej - pobieranie z bazy danych.

Ja bym po prostu...ukrywał, po kliknięciu na więcej, posty dodane po dodaniu posta przez użytkownika:
- dodaj w set_status() jakąś klasę
- przed wysłaniem ządania w funkcji microblog_get_more() po prostu usuń te elementy posiadające klasę dodwaną wyżej.
Odpowiedz
#5
Inaczej troszkę zrobiłem bo przemyślałem. Pedro84 dobrze mówisz , jednak wymyśliłem troszkę szybsze rozwiązanie.
Mianowicie zrobiłem tak. Gdy użytkownik dodaje nowego posta to dodaje się to w klasie np. new_added . Następnie w js sprawdzam sobie ( podczas pobierania starszych postów ) czy istnieje taki element ( .new_added ) , jeżeli istnieje to pobieram sobie z ostatniego takiego elementu ( .new_added ukrytą datę i potem to czysta formalność. Działa po testach tak jak należy. Dzięki za pomoc Wink
Cytat:Wyrazić to co czuję , zabrakło by tyle słów....
Odpowiedz
#6
(25-04-2011, 17:25)kancik napisał(a): Inaczej troszkę zrobiłem bo przemyślałem. Pedro84 dobrze mówisz , jednak wymyśliłem troszkę szybsze rozwiązanie.
Mianowicie zrobiłem tak. Gdy użytkownik dodaje nowego posta to dodaje się to w klasie np. new_added . Następnie w js sprawdzam sobie ( podczas pobierania starszych postów ) czy istnieje taki element ( .new_added ) , jeżeli istnieje to pobieram sobie z ostatniego takiego elementu ( .new_added ukrytą datę i potem to czysta formalność. Działa po testach tak jak należy. Dzięki za pomoc Wink
Moim zdaniem dość toporne rozwiązanie. Czemu? Zobacz, skoro możesz sobie puścić zwykłe zapytanie, bez jakichkolwiek manipulacji - wyłączająć offset i limit - to ja poszedłbym tą drogą Wink
Odpowiedz
#7
jeszcze jedno Big Grin

Kod PHP:
        $zapytanie "";
        
$zapytanie "SELECT mb.id,mb.id_user,mb.body,mb.date, u.login,u.avatar,ob.first,ob.second
                      FROM "
.$this->db->dbprefix."microblog_entries as mb,
                           "
.$this->db->dbprefix."users as u,
                           "
.$this->db->dbprefix."observe as ob
                      WHERE mb.id_user=u.id AND ((ob.first="
.$this->session->userdata('id')."
                            AND ob.second=mb.id_user) OR  mb.id_user="
.$this->session->userdata('id').")
                            "
;
        if ( 
is_numeric($this->uri->segment(5))) {
            
$zapytanie .= ",mb.date<".$this->uri->segment(5);
        }
        
$zapytanie .= " ORDER BY mb.id";
// $this->session->userdata('id') - id uzytkownika 
chodzi mi tu dokładnie o zapytanie a nie składnie php Smile mam trzy tabelki w bazie
users ( id , login , avatar itp itd - wymieniam tylko uzyte tu ) .
microblog_entries(id_user,id,body,date),
observe(first,second).

już wyjaśniam. w tabelce observe first to użytkownik który zaczyna obserwować użytkownika second Smile nie wymyśliłem lepszego algorytmu ;p

z poprzednimi tabelami nie trudno się domyślić o co mi chodzi Smile

Problem jest z zapytaniem które ma pokazywać wpisy tylko obserwowanych userów.
Sytuacja jest taka. Uzytkownik id=3 obserwuje uzytkownika id=4. No i jestem np. zalogowany na uzytkownika 3 i ten widzi swoje posty jako zdublowane. Nie wiem dlaczego Sad
Cytat:Wyrazić to co czuję , zabrakło by tyle słów....
Odpowiedz
#8
Zacznijmy od tego, że tabela observe ma trochę skopane nazwy kolumn. Czemu nie dasz np:
Kod:
user_id => id użytkownka
followed_id => id użytkownika zalogowanego
Taka techniczna uwaga.

Generalnie, proponowałbym zmianę struktury tabel na coś takiego:
Kod:
microblog_entries( id, user_id, body, date) // user_id zamiast id_user
observe(user_id, followed_id)

Druga sprawa, to Twoje zapytanie. Kiedy masz jesteś zalogowany jako ID 3, żeby pobrać wszystkie posty użytkownika obserwowanego (w tym przypadku ID 4), robisz coś takiego:
Kod:
SELECT *
FROM `observe` AS `ob`
JOIN `microblog_entries` AS `mb`
    ON `mb`.`user_id` = `ob`.`followed_id`
WHERE `ob`.`followed_id` = '4'
/*
* followed_id - wspomniane wcześniej ID usera obserwowanego
* mb.user_id - ID autora wpisu
*/
dalej możesz sobie manipulować zapytaniem jak chcesz. Zapytanie zwróci Ci wszystkie posty użytkownika ID 4.
Odpowiedz


Podobne wątki…
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  pomoc w złączeniu MySQL puciol 1 1,960 16-06-2012, 20:10
Ostatni post: Pedro84
  Pomoc przy kodzie php adamk342 4 3,360 07-05-2012, 17:28
Ostatni post: adamk342
  POMOC! Problem programistyczny. J0hny 1 2,004 10-10-2011, 16:54
Ostatni post: Pedro84
  Pomoc dla żółtodzioba verde 5 4,830 12-07-2011, 17:27
Ostatni post: hieroshima
  Odpłatna pomoc problem z Coopermine ! lopik 0 1,567 24-02-2011, 19:40
Ostatni post: lopik

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości
Sponsorzy i przyjaciele
SeoHost.pl