Napisane: 6.05.2017, 21:26:36 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Zakładając że wiadomość nieprzeczytana to taka, która ma datę dodania większą (późniejszą) niż ostatnia data oglądania konwersacji przez danego użytkownika i znajduje się w tej konwersacji to można:
Pole wiadomosc_ogladana w tabeli konwersacje_wiadomosci jest do usunięcia, nie ma tam sensu. Nie sprawdzasz też nigdzie czy konwersacja została usunięta, ale to już musisz sam przemyśleć jak to zrobić, bo być może to pole powinno być w tabeli konwersacje albo też użytkownik może chcieć się wypisać z danej konwersacji i tylko dla niego jest ona niewidoczna (usunięta) podczas gdy inni mogą dalej w niej pisać i wtedy to pole jest w dobrym miejscu, choć dziwnie nazwane. |
Forum: Przedszkole · Podgląd postu: #1215366 · Odpowiedzi: 10 · Wyświetleń: 1 020 |
Napisane: 15.02.2017, 01:20:05 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Pomijając zasadność takiej struktury danych, jeśli tak ma być to wystarczy jedno zapytanie
I do zbudowania tabelki w html to jest wszystko co trzeba. Można sobie całość zapisać w tablicy lub też tylko pierwszy wiersz żeby zrobić th a potem po kolei sprawdzamy rekordy i jeśli zmienia się nazwa obiektu to zamykamy tr, otwieramy nowe i wstawiamy na początek dodatkowe td z nazwą obiektu a oprócz tego dla każdego rekordu dodajemy td z nazwą wartości. |
Forum: Przedszkole · Podgląd postu: #1210868 · Odpowiedzi: 4 · Wyświetleń: 614 |
Napisane: 14.02.2017, 23:27:53 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Trudno określić co w tych tabelach siedzi, zazwyczaj podanie struktury tabel to pierwsze co robią ludzie szukający pomocy. Zwłaszcza jeśli wyniki ze screena z phpmyadmina wyglądają podejrzanie jeśli chodzi o wartosc_num. Może to miały być numeryczne odpowiedniki słów TAK NIE WYSOKA itp? W ogóle to zapytanie wygląda dziwnie, choć bez struktury ciężko powiedzieć. Ogólnie do wyświetlania takich tabelek należałoby dodać sortowanie w zapytaniu typu ORDER BY wiersz,kolumna czyli przykładowo ORDER BY nazwa_obiektu, nr_kolumny po czym ciągnąc z bazy poszczególne rekordy przy zmianie nazwy obiektu wstawiamy htmlowy koniec i początek nowego wiersza tabelki. Ewentualnie znając konkretne ilości można dwie pętle jedna w drugiej zrobić. Ale to pod warunkiem absolutnej pewności że jest dokładnie tyle ile trzeba w bazie. Do wyciągania ilości rekordów lepiej używać zapytań typu "SELECT COUNT(*) FROM obiekt" niż brać wszystko z tabeli i odczytywać num_rows. Jeśli się uczysz to staraj się unikać funkcji mysql_ , które są mocno przestarzałe i od razu ucz się przynajmniej mysqli_ , nawet jeśli obiektowe podejście wydaje się na początku niezrozumiałe. Do znalezienia w sieci jest masę poradników z gotowymi kawałkami kodu do podstawowych operacji na bazie. |
Forum: Przedszkole · Podgląd postu: #1210865 · Odpowiedzi: 4 · Wyświetleń: 614 |
Napisane: 2.02.2017, 18:39:23 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Kod Array ( [0] => https://pl.wikipedia.org/wiki/trtert [1] => https://en.wikipedia.org/wiki/fdgdf ) |
Forum: PHP · Podgląd postu: #1209970 · Odpowiedzi: 3 · Wyświetleń: 387 |
Napisane: 17.12.2016, 06:11:53 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Dla każdej tabeli:
oraz
W zapytaniach o najwyższą(najniższą) wartość dzisiaj:
|
Forum: MySQL · Podgląd postu: #1206833 · Odpowiedzi: 21 · Wyświetleń: 2 535 |
Napisane: 15.12.2016, 09:51:10 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Z tego co autor napisał wynika, że tabele są dla różnych czujników, a każda ma dane od początku, więc WHERE jest niezbędny by mieć dane z konkretnego dnia. Co do optymalizacji pierwszym problemem jest tutaj fakt, że w tym warunku WHERE wykonujemy funkcję na kolumnie, co nie kwalifikuje indeksu na tej kolumnie do wykorzystania. Można próbować przepisać to w ogólnej postaci jako na przykład
albo prościej dla dzisiejszego dnia o ile nie ma możliwości by były jakieś późniejsze wpisy:
jednak w najlepszym przypadku dostaniemy w explain type=range, a do tego nie da się potem podczepić następnej części indeksu do sortowania wartości. W zależności od ilości danych może to być szybsze niż pełen skan tabeli (type=all) czy bardziej prawdopodobny skan indeksu (type=index), jednak wciąż w obrębie dnia będziemy mieć sort by znaleźć maksymalną czy minimalną wartość. Dopiero denormalizacja i wprowadzenie dodatkowej kolumny zawierającej wyłącznie datę bez czasu oraz wprowadzenie podwójnego indeksu na (data,wartość) umożliwi nam dla zapytania typu
pełne wykorzystanie tego indeksu (w explain będzie type=ref oraz ref=const) i możemy mieć w tabeli pierdyliard rekordów a wynik dostaniemy bardzo szybko - mysql znajdzie konkretne miejsce z danymi po indeksie btree w logarytmicznym czasie. |
Forum: MySQL · Podgląd postu: #1206687 · Odpowiedzi: 21 · Wyświetleń: 2 535 |
Napisane: 29.06.2015, 23:44:26 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Wprawdzie przy INNER JOIN nie ma różnicy czy warunek złączenia wrzucisz do WHERE czy do ON, ale proponuję jednak korzystać z tej drugiej składni. Bo już przy LEFT JOIN różnica jest, a że będziesz potrzebować właśnie takiego typu złączenia do wyciągnięcia kategorii w sytuacji gdy artykuł może nie mieć przypisanej żadnej kategorii, to lepiej jednak dla czytelności mieć od razu widoczne po jakich kolumnach łączysz. Zresztą to dobra praktyka jest. Jeśli chcesz mieć dla artykułu wiele rekordów każdy z inną kategorią to po prostu dodajesz dwie tabele łącząc articles_categories po id_articles oraz categories po id_category, a jeśli w jednym rekordzie listę kategorii oddzielonych przecinkiem to stosujesz GROUP BY i GROUP_CONCAT w podzapytaniu, czyli przykładowo:
|
Forum: MySQL · Podgląd postu: #1163493 · Odpowiedzi: 2 · Wyświetleń: 336 |
Napisane: 3.02.2015, 12:03:10 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Diagramy pomagają przede wszystkim zrozumieć i ogarnąć zależności między tabelami. Na strukturę tych tabel przekładają się tylko jeśli stosuje się FOREIGN KEY w tabelach InnoDB. Wtedy jeśli jakieś pole z ustawionym FOREIGN KEY na inną tabelę jednocześnie ma primary albo unique key to wtedy można mówić o relacji jeden do jeden, jeśli to zwykły index to jeden do wielu. Przydaje się to jeśli chcemy zachować spójność bazy już na poziomie mysql, na przykład by niemożliwe było usunięcie kontrahenta, na którego wystawione są faktury. W praktyce nie pamiętam kiedy ostatnio w projekcie jakiejś bazy używałem relacji jeden do jeden. Zazwyczaj łatwiej jest po prostu umieścić wszystko w jednej tabeli. Właściwie zdecydowana większość relacji to jeden do wielu, ewentualnie wiele do wielu połączone przez dodatkową tabelę w środku. Do tego większość baz danych jest projektowana w ogóle bez foreign keys, a spójność jest trzymana na poziomie aplikacji (przykładowo w interfejsie nie ma w ogóle możliwości usuwania kontrahentów, ewentualnie ustawia się jakąś flagę nieaktywności, a jeśli jest możliwość usuwania to dodatkowy kod robi coś konkretnego z powiązanymi fakturami). Oczywiście nie staram się nikogo przekonywać do rezygnowania z foreign key, kaskadowe operacje chociażby są całkiem przyjemne w odpowiednich sytuacjach, ale taka jest rzeczywistość, często terminy wygrywają ze sztywnym trzymaniem ACID. |
Forum: Przedszkole · Podgląd postu: #1143416 · Odpowiedzi: 2 · Wyświetleń: 410 |
Napisane: 21.01.2015, 13:52:28 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
... Prosiłbym o odpowiedź i ewentualnie nakierowanie co jest nie tak w skrypcie, że na domyślnym silniku wczytuje się bardzo długo(przypomne, że na mysql5.1 wczytuje się bardzo szybko) Od wersji mysql 5.5 InnoDB jest domyślnym silnikiem tabel tworzonych bez podania konkretnego silnika w CREATE TABLE. Przedmówcy wyjaśnili, że inserty do InnoDB wykonują się szybciej albo zawarte w jednej transakcji, albo jako jeden duży insert, albo też przy wyłączonym na czas insertów autocommit. Bo bez tego każdy insert jest osobną transakcją (InnoDB to silnik transakcyjny, w przeciwieństwie do wcześniejszego domyślnego MyISAM) a każda nawet najmniejsza zakończona transakcja z definicji wymaga zapisania stanu na dysku zamiast trzymania w buforach. Oczywiście powrot do MyISAM przywróci poprzedni stan działania, jednak w roku 2015 wypadałoby znać InnoDB, nie mówiąc o zaprzestaniu używania przestarzałych funkcji z API mysql_. http://dev.mysql.com/doc/refman/5.5/en/inn...default-se.html |
Forum: MySQL · Podgląd postu: #1141260 · Odpowiedzi: 4 · Wyświetleń: 571 |
Napisane: 1.01.2015, 20:42:27 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Ogólna zasada jest taka, że jeśli używamy GROUP BY, to do SELECT możemy wrzucić tylko kolumnę, według której grupujemy (lub jeśli grupujemy po kombinacji to tylko te kolumny) oraz wyrażenia zawierające funkcje agregujące z innymi kolumnami. Mysql jest jedyną bazą, która nie pluje się na użycie dodatkowych kolumn - inne po prostu zwrócą syntax error, ale idą za tym ograniczenia - do wszystkich pozostałych kolumn bierze pierwsze z brzegu wartośći dla każdej grupy, mając przy tym całkowitą dowolność, najczęściej bierze więc wartości z tych rekordów, dla których wykona najmniej operacji I/O na dysku. Jeśli w każdej grupie dla danej kolumny mamy identyczne wartości to problemu nie ma, ale jeśli są różne to nie mamy absolutnie żadnej możliwości wpływania na rezultat, w szczególności ORDER BY na wynik nie wpływa, bo sortuje gotowe rekordy dawno po tym, jak do każdej grupy zostały wzięte jakieś wartości. Nawet jeśli chwilowo wyniki mogą się zgadzać z naszymi oczekiwaniami to proste zmiany w indeksach mogą nam mocno namieszać. Należałoby najpierw znaleźć najnowszą wiadomość dla każdego usera - czyli z tabeli message SELECT user_id, MAX(id) przy GROUP BY user_id, czyli jesteśmy całkowicie pewni wszystkich wyników - user_id siedzi w GROUP BY, a MAX() jest funkcją agregującą, następnie ponownie dołączyć message wg tych dwóch kolumn by otrzymać odpowiadającą im treść wiadomości i dołączyć również tabelę konto by mieć pozostałe informacje o userze z danym user_id. |
Forum: MySQL · Podgląd postu: #1138150 · Odpowiedzi: 3 · Wyświetleń: 717 |
Napisane: 4.04.2014, 01:13:44 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Skoro interesują nas wszystkie możliwe pary rekordów to w najgorszym przypadku będziemy mieć iloczyn kartezjanski przy self-joinie, ale możemy to nieco uprościć. Zakładając, że dwa rekordy są podobne jeżeli dla tego samego owocu mają taką samą ilość, to możemy dodać to jako warunek złączenia. W ten sposób pomijamy wszystkie pary, które nie mają ze sobą nic wspólnego a także dostajemy dane w formacie dość wygodnym do pogrupowania, bo wystarczy w każdej grupie dla identycznych par ID policzyć rekordy i otrzymujemy liczbę zgodnych pozycji zakupów. Czyli:
|
Forum: Microsoft SQL Server / MSDE · Podgląd postu: #1100372 · Odpowiedzi: 2 · Wyświetleń: 2 872 |
Napisane: 20.09.2013, 13:18:56 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
UNIQUE można założyć nie tylko na pojedyncze kolumny, ale również na kombinacje kolumn, czyli na przykład jeśli na razie w tabeli nie ma powtórzeń, których chcesz uniknąć, to wystarczy
Wtedy każda z tych kolumn z osobna może mieć powtarzane wielokrotnie te same wartości, ale ich para musi już być unikalna. INSERT INGORE powinno wówczas prawidłowo zrobić to czego oczekujesz. |
Forum: MySQL · Podgląd postu: #1066363 · Odpowiedzi: 2 · Wyświetleń: 2 934 |
Napisane: 19.09.2013, 07:06:08 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Cytat Jak to zmienić? Fulltext-fine-tuning Cytat nie rozumiem tego zdania, co jest zawartością fultext w takim razie? W indeksie fulltext znajduje się lista słów wraz z odpowiadającymi im informacjami, w którym rekordzie się znajdują, jak często itp. Mysql nie musi szukać pełnych tekstów w rekordach, wystarczy że zajrzy do tego indeksu. |
Forum: MySQL · Podgląd postu: #1066091 · Odpowiedzi: 3 · Wyświetleń: 404 |
Napisane: 26.08.2013, 15:43:50 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Patrząc na ten kod, pomijając ile razy coś tam się wyświetla a ile razy powinno, można sobie wyobrazić następującą sytuację: Przychodzi czytelnik do biblioteki, prosi o wszystkie książki w bibliotece i sprawdza po kolei kto je napisał, porównując nazwisko autora z "X". Gdy znajdzie taką książkę, prosi o listę wszystkich książek napisanych w roku Y i sprawdza czy ta książka znajduje się na tej liście. Niezależnie od wyniku, odnosi listę z powrotem i szuka kolejnej pasującej książki, za każdym razem biorąc tę samą listę i odnosząc ją z powrotem. Bibliotekarka trochę krzywo się patrzy, ale że jest inteligentna to nie odkłada tej listy na półkę, tylko trzyma ją w pogotowiu (query cache). Po miesiącu czytelnik znajduje wszystko to co chciał i dziękuje bibliotekarce za cierpliwość i chce wychodzić, ale słyszy pytanie: - Dlaczego po prostu nie poprosił pan o książki napisane przez X w roku Y? - A to pani tak potrafi? Otóż tak, baza danych (bibliotekarka) potrafi takie rzeczy i robi to o wiele szybciej wykorzystując sobie znane mechanizmy takie jak na przykład indeksy (katalogi książek). Wygląda na to, że napisałeś od nowa implementację WHERE oraz JOIN, wymagającą przesłania całych tabel między mysql a php i bez żadnych usprawnień, które mysql oferuje. A przecież wystarczy odpowiednio zapytać (nie podałeś struktur tabel, więc trzeba je zgadywać z kodu):
Otrzymujesz jeden obcięty zestaw, w całości do wyświetlenia, jedyne co musisz dodać to jakieś przerywniki gdy zmienia się id_panelu by oddzielić od siebie różne wątki. |
Forum: MySQL · Podgląd postu: #1062339 · Odpowiedzi: 1 · Wyświetleń: 315 |
Napisane: 13.06.2013, 19:46:19 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Jeśli użyjemy takiego joina to właściwie cały ten IF możemy zastąpić SELECT 1 AS isFavs, zapewnia to sam warunek złączenia, a nie przypuszczam by o to autorowi chodziło. W ogóle ciężko stwierdzić o co chodziło, bo jesteśmy przygniecieni ogromem informacji zawartych w stwierdzeniu "ale to nie dział". Prawidłową odpowiedzią na najbardziej prawdopodobny scenariusz czyli autorowi chodziło o to, by wyświetlić wszystkie posty oraz informację czy dany post znajduje się w czyichkolwiek ulubionych byłoby poprawienie oczywistego błędu składniowego - zamiana fav_id na post_id, bo pola fav_id nie ma w strukturze tabel. Obawiam się jednak, że nadal możemy otrzymać odpowiedź "wciąż nie dział". Jeśli jednak o to właśnie chodzi, a mamy użyć do tego joina, zamiast całkiem wolnego IN( ), to lepiej byłoby:
|
Forum: MySQL · Podgląd postu: #1050734 · Odpowiedzi: 5 · Wyświetleń: 280 |
Napisane: 3.06.2013, 06:49:46 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
To co aktualnie robi ten kod: 1. Pobierz wszystkie rekordy, w szczególności $haslo. 2. Dla każdego rekordu wykonaj : w kolumnie md5_haslo ustaw md5($haslo) dla całej tabeli. Krótko mówiąc dla każdego hasła wielokrotnie zmieniasz całą tabelę, w związku z tym na sam koniec zostaje w całej tabeli ustawione haslo_md5 na hash ostatniego rekordu. Samo zapytanie mysql:
zrobi dokładnie to co potrzebujesz, to jest update na całą tabelę, dla każdego rekordu ustawi odpowiedni dla jego hasła hash. Nie potrzeba nic z bazy wcześniej wyciągać, nawet php do tego nie jest potrzebny, wystarczy wklepać to w konsoli mysql, phpmyadminie czy jakimkolwiek innym kliencie mysql. |
Forum: Przedszkole · Podgląd postu: #1048708 · Odpowiedzi: 3 · Wyświetleń: 359 |
Napisane: 2.06.2013, 12:20:01 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Szczerze mówiąc oba sposoby przy takiej składni nie powinny działać, czy czasem nie zrobiłeś gdzieś błędu przy wklejaniu kodu? Albo definiujesz zmienną $pdo i wtedy używasz jej w zakresie jej widoczności, czyli tak jak prawdopodobnie wygląda drugi działający sposób:
albo też definiujesz jako property dla klasy i wtedy używasz tak:
Poza tym w obu przypadkach wykorzystujesz istniejące już połączenie z bazą. Gwarantuje to klasa Database zrobiona jako singleton, getDB() zwraca tą samą instancję klasy PDO za każdym razem lub ewentualnie tworzy ją jeśli jej jeszcze nie ma. |
Forum: Przedszkole · Podgląd postu: #1048613 · Odpowiedzi: 2 · Wyświetleń: 238 |
Napisane: 1.06.2013, 06:13:37 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Nie widzę przeszkód by łączyć dwukrotnie do tej samej tabeli (pod innymi aliasami), za pierwszym razem by dostać dane autora, za drugim by dostać dane ostatniego wypowiadającego się w temacie. Wtedy limit 20 będzie dotyczył pojedyńczych tematów. Poza tym, jeśli w każdym temacie oba pola są wypełnione (jeśli nikt nie odpowiedział to post startowy traktujemy jako ostatni, więc oba id są identyczne), a użytkownicy nie są kasowani ani nie zmieniają id, to nie jest potrzebny LEFT JOIN, wystarczy zwykły JOIN ( czyli INNER JOIN precyzyjnie ujmując ). |
Forum: MySQL · Podgląd postu: #1048442 · Odpowiedzi: 6 · Wyświetleń: 299 |
Napisane: 30.04.2013, 07:26:56 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Jeśli zmienia się tylko ostatnia część to wystarczy:
Jeśli zmienia się więcej to trzeba usunąć dwukropki z offsetów przy pomocy str_replace() przed zamianą na dec, a przy wyświetlaniu wstawić z powrotem przez wordwrap(). |
Forum: Przedszkole · Podgląd postu: #1042187 · Odpowiedzi: 2 · Wyświetleń: 262 |
Napisane: 30.04.2013, 06:53:36 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Zapytanie trwa długo, bo robisz wielki left join z kilku tabel, grupujesz wszystko i dopiero filtrujesz gotowe grupy przy pomocy HAVING, czyli robisz wszystko od końca. Left join stosujemy wtedy, gdy chcemy wszystkie rekordy z lewej tabeli wraz z odpowiadającymi wg warunku ON rekordami z prawej tabeli, a gdy takich w prawej tabeli nie ma to wciąż chcemy rekordy z lewej, tyle że w prawej zamiast wartości będa NULL. Natomiast INNER JOIN ( można pisać sam JOIN ) wybiera tylko te rekordy, które potrzebujemy - jeśli w obu tabelach nie ma takich wspólnie spełniajacych warunek złączenia to prostu są ignorowane. W tym wypadku powinieneś zacząć od warunku w nazwą podkategorii w zwykłym WHERE i powoli rozbudowywać swój rowset dodając potrzebne JOIN, nie widzę potrzeby by to były LEFT JOIN. Jeśli potrzebujesz zapytania, to wyjaśnij dokładniej o co chodzi, najlepiej na konkretnym przykładzie zawierającym kilka profili, kategorii i podkategorii i podaj oczekiwany wynik. |
Forum: Przedszkole · Podgląd postu: #1042181 · Odpowiedzi: 2 · Wyświetleń: 338 |
Napisane: 27.04.2013, 22:53:55 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
|
Forum: MySQL · Podgląd postu: #1041752 · Odpowiedzi: 5 · Wyświetleń: 260 |
Napisane: 24.04.2013, 23:36:47 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
|
Forum: Przedszkole · Podgląd postu: #1041234 · Odpowiedzi: 20 · Wyświetleń: 464 |
Napisane: 24.04.2013, 23:14:33 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
Skoro już znalazłeś taką funkcję to mam nadzieję, że przeczytałeś do niej manual, gdzie w wielkim czerwonym oknie na samej górze napisane jest, że już w tej chwili wszystkie funkcje z mysql_ są przestarzałe, a w przyszłych wersjach będą w ogóle usunięte. W zasadzie nie rozumiem dlaczego dyskutujecie na temat jak zabezpieczyć kod typu mysql_ zamiast dyskutować o tym że w ogóle nie należy go stosować. Serio, PDO nie jest takie straszne jak się wydaje, a parametryzowane wywołania zupełnie eliminują problem SQL injection. Wciąż trzeba uważać na XSS jeśli wypluwamy na stronę jakikolwiek html z bazy, ale to i tak duży postęp w stosunku do tego na co trzeba uważać z mysql_. |
Forum: Przedszkole · Podgląd postu: #1041230 · Odpowiedzi: 20 · Wyświetleń: 464 |
Napisane: 24.04.2013, 20:49:26 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
To jest do zrobienia, ale prawdę powiedziawszy nie powinieneś dostać odpowiedzi, bo widząc taką strukturę danych to nóż się otwiera w kieszeni. Raczkujesz, więc nie utrwalaj sobie złych nawyków. Jeśli przykładowo skasujesz jakąś datę to co z pozostałymi danymi? Mają przejść na poprzednią? Czy znowu masz szukać następnej i kasować również wszystko aż do niej? Prawidłowo powinno wyglądać to tak, że masz dwie tabele, w jednej trzymasz dane z datami i tymi 'ok' a w drugiej odpowiadające im 'a','b' i tak dalej. Przykładowo tabela `pytania` (to tylko domysł co te dane mają modelować) mogłaby mieć kolumny id, czas, sprawdz, natomiast tabela `odpowiedzi` id, id_pytania, dane. Czyli klasyczna relacja jeden do wielu, gdzie id_pytania w tabeli odpowiedzi jest zewnętrznym kluczem do id w tabeli pytania. Wówczas wystarczyłoby:
Swoją drogą te daty (i czasy) powinny być typu DATETIME, mysql udostępnia tłum funkcji i operatorów do działań na datach nie po to żeby zapełnić czymś manual i nie świecił pustkami. Zwykłe odjęcie jakiegoś odstępu czasu by odpowiedzieć na proste pytanie które rekordy powstały w ciągu ostatniego miesiąca to w przypadku pola DATETIME: czas - INTERVAL 1 MONTH, a na stringu wymaga to konwersji i wielu obliczeń, pamiętania o jakichś bzdurach typu rok przestępny itp, ewentualnie korzystania z funkcji zewnętrznego języka. I po co, skoro mysql robi to bezbłędnie i szybko? Oczywiście jeśli w tym samym polu trzymasz jakieś 'a' to naturalnie ustawienie DATETIME nie jest możliwe, ale po rozdzieleniu można przynajmniej zrobić to prawidłowo. |
Forum: MySQL · Podgląd postu: #1041203 · Odpowiedzi: 1 · Wyświetleń: 254 |
Napisane: 24.04.2013, 14:04:25 | |
Grupa: Zarejestrowani Postów: 282 Dołączył: 12.04.2011 Ostrzeżenie: (0%) |
|
Forum: MySQL · Podgląd postu: #1041116 · Odpowiedzi: 7 · Wyświetleń: 289 |
Nowe odpowiedzi Brak nowych odpowiedzi Popularny temat (Nowe) Popularny temat (Brak nowych) |
Sonda (Nowe) Sonda (Brak nowych) Zamknięty temat Przeniesiony temat |
Wersja Lo-Fi | Aktualny czas: 21.05.2024 - 06:31 |