![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.02.2014 Ostrzeżenie: (0%) ![]() ![]() |
Witam
To moja pierwsza wiadomość na tym forum. Otóż urzęduję sobie na silniku forum SMF(Simple Machines Forum). Zaszła konieczność pobrania tematów z określonego działu, przy czym potrzebuję również pobrać ostatni post z danego tematu więc skleciłem sobie takie zapytanie: Kod SELECT t.num_replies, m.subject, t.id_topic, m.id_msg FROM {db_prefix}topics AS t INNER JOIN(SELECT * FROM {db_prefix}messages ORDER BY id_msg DESC) AS m ON m.id_topic=t.id_topic WHERE t.id_board=13 GROUP BY t.id_topic O ile w mysql work bench zapytanie wykonuje się poprawnie i zwraca to co potrzebuje to już po wklejeniu do SMF w ten sposób: Kod $query = $smcFunc['db_query']('',''TUTAJ ZAPYTANIE DO BAZY); oczywiście dalej również używam funkcji db smf.pokazuje komunikat "Hacking attempt..". Myślę, że może to być wina sub SELECT'a w INNER JOIN. Proszę o pomoc, bo męczę się już z tym jakiś czas. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cudne zabezpieczenia ma ten SMF, lol
![]() Czy tabela topics nie ma pola, w ktorym znajduje sie ID ostatniej wiadomosci? Jesli nie, to wejdz do funkcji SMF, ktora wykonuje zapytanie i wywal to durne zabezpieczenie. Albo zobacz jakiej funkcji ona uzywa, pewnie mysql_query, i odpal ją sam recznie zamiast tej funkcji SMF -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.02.2014 Ostrzeżenie: (0%) ![]() ![]() |
Cudne zabezpieczenia ma ten SMF, lol ![]() Czy tabela topics nie ma pola, w ktorym znajduje sie ID ostatniej wiadomosci? Jesli nie, to wejdz do funkcji SMF, ktora wykonuje zapytanie i wywal to durne zabezpieczenie. Albo zobacz jakiej funkcji ona uzywa, pewnie mysql_query, i odpal ją sam recznie zamiast tej funkcji SMF Ok, każdy rekord tematu zawiera id ostatniej wiadomości, ale znacznika czasu owej już nie a potrzebuje tego by ustalić czy temat zawiera nieprzeczytane przez użytkownika posty. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Skoro jest ID ostatniej wiadomosci, to do selecta po topicach dodajesz poprostu LEFT JOIN i po sprawie. Zadne podzapytania ci tu nie sa potrzebne
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.02.2014 Ostrzeżenie: (0%) ![]() ![]() |
Potrzebuję coś takiego:
Pobrać wszystkie rekordy z topics ale z warunkiem tylko jednej kategorii, następnie z tabeli wiadomości pobrać subject i do tego LEFT JOIN log_topics z tym, że musi to być LEFT JOIN bo INNER JOIN nie pokaże pustych a ja chcę mieć możliwość sprawdzenia poprzez np. $s['pole_z_tabeli_log_topics'] czy jest puste dla danego tematu, więc skleciłem coś takiego:
to działa, więc do tego potrzebuję dać
Finalnie chciałbym otrzymać dane w takiej formie(żeby zwróciło tyle wierszy ile dopasuje tematów w tabeli topics): t.topic_id | t.num_replies | m.subject | log_topics.id_msg lub t.topic_id | t.num_replies | m.subject | NULL Pomóżcie, bo już próbowałem na wiele sposobów i cały czas pokazuje, że przy LEFT JOIN nieznana kolumna id_topic w tabeli topics. ps przy edycji geshi się kaszani. Proszę o pomoc. Ten post edytował ktostaki 12.02.2014, 12:57:43 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
1) Czemu t.topic_id ? W select pobierasz t.id_topic. Masz takie dwie kolumny?
2) Nie: {db_prefix}topics AS t, {db_prefix}messages AS m a ({db_prefix}topics AS t, {db_prefix}messages AS m) -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.02.2014 Ostrzeżenie: (0%) ![]() ![]() |
1) Czemu t.topic_id ? W select pobierasz t.id_topic. Masz takie dwie kolumny? 2) Nie: {db_prefix}topics AS t, {db_prefix}messages AS m a ({db_prefix}topics AS t, {db_prefix}messages AS m) 1. ponieważ w select id_topic z tabeli topics pobieram jako topic_id zeby roznoznic z topic_id z log_topics. 2. nie bardzo rozumiem to co napisałeś różni się tylko nawiasem, czy masz na mysli, że tylko jego brakuje? // edit Teraz
Wyrzuca mi bardzo duzo rekordow z kolei bez LEFT JOIN, jedynie kilkanascie i takiej ilosci potrzebuje z tym, ze z danymi z tabeli LEFT JOIN. Ten post edytował ktostaki 12.02.2014, 13:07:33 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
ad1) Ale w warunkach czy laczeniach uzywa sie nazw pol, a nie ich aliasow
ad2) Tak, czasami join nie widzi tabel, gdy jest wiecej niz 1 we FROM Zas co do duzej ilosci rekordow to normalne. Skoro laczysz tabele, ktora ma duzo danych dla danego laczenia, to logiczne, ze to wszystko ci wypluje w postaci kolejnych rekordow -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.02.2014 Ostrzeżenie: (0%) ![]() ![]() |
ad1) Ale w warunkach czy laczeniach uzywa sie nazw pol, a nie ich aliasow ad2) Tak, czasami join nie widzi tabel, gdy jest wiecej niz 1 we FROM Zas co do duzej ilosci rekordow to normalne. Skoro laczysz tabele, ktora ma duzo danych dla danego laczenia, to logiczne, ze to wszystko ci wypluje w postaci kolejnych rekordow Ok więc jak mogę osiągnąć coś takiego? t.topic_id | t.num_replies | m.subject | log_topics.id_msg t.topic_id | t.num_replies | m.subject | NULL t.topic_id | t.num_replies | m.subject | log_topics.id_msg t.topic_id | t.num_replies | m.subject | NULL t.topic_id | t.num_replies | m.subject | NULL t.topic_id | t.num_replies | m.subject | log_topics.id_msg Chcialbym zeby rekordow bylo tyle ile dopasuje z tabeli topics a nie log_topics. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Ale co jest w tabeli log_topics i czemu chcesz pobrac tylko max 1 rekord z stamtad dla danego topicu, skoro widac, ze ta tabela dla danego topicu moze miec wiecej niz jeden rekord?
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.02.2014 Ostrzeżenie: (0%) ![]() ![]() |
Ale co jest w tabeli log_topics i czemu chcesz pobrac tylko max 1 rekord z stamtad dla danego topicu, skoro widac, ze ta tabela dla danego topicu moze miec wiecej niz jeden rekord? Bo to się tyczy tylko do jednej kategorii forum i uzytkownika, bo tabela log_topics ma pola: id_topic, id_member, id_msg i zawiera informacje o ostatnio przeczytanym poscie i ta informacje potrzebuje nawet jezeli nie bedzie takiego rekordu wtedy dla rekordu danego tematu z (topics) ma zwrocic NULL i wiem ze user wtedy na pewno nie czytal tego tematu. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Kurcze.... no to wez lacz tę tabele po tych trzech polach id_topic, id_member, id_msg a nie ty łączysz tylko po jednym i sie dziwisz, ze massz milion rekordow
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.02.2014 Ostrzeżenie: (0%) ![]() ![]() |
Kurcze.... no to wez lacz tę tabele po tych trzech polach id_topic, id_member, id_msg a nie ty łączysz tylko po jednym i sie dziwisz, ze massz milion rekordow Nie mogę, bo nie chcę pobrać tylko tych tematów które założył user ale wszystkie z okreslonego dzialu i finalnie chce zeby liczba rekordow była taka jak dopasowana w tabeli topics z tym, ze kazdy wiersz zawieral informacje z log_topics i to tyle. Nie mam glowy do tej logiki bazodanowej naprawde. |
|
|
![]()
Post
#14
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Nie mogę, bo nie chcę pobrać tylko tych tematów które założył user ale wszystkie z okreslonego dzialu A co ma piernik do wiatraka? JA ci mowie bys sprecywoal w JOIN wszystko....Masz teraz LEFT JOIN .... on raz A masz miec LEFT JOIN .... on (raz and dwa and trzy) Gdzie raz, dwa i trzy to kolejne warunku laczace. I juz. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.02.2014 Ostrzeżenie: (0%) ![]() ![]() |
A co ma piernik do wiatraka? JA ci mowie bys sprecywoal w JOIN wszystko.... Masz teraz LEFT JOIN .... on raz A masz miec LEFT JOIN .... on (raz and dwa and trzy) Gdzie raz, dwa i trzy to kolejne warunku laczace. I juz. Wielkie dzięki, działa tak jak chciałem.. w końcu. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.07.2025 - 01:56 |