![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witajcie!
Idea jest prosta, mam tabelę grup wyglądającą tak: (IMG:http://wstaw.org/m/2011/03/17/Screen_shot_2011-03-17_at_21.31.38.png) Jak pewnie każdy się domyśla pole isDef gdy jest równe 1 mówi skryptowi, że dana kategoria jest domyślną. Problem jest taki, że użytkownicy to kombinatorzy i nawet jak zabezpieczam to od kodu ktoś może grzebać w sqlu (lub któryś plugin). Chciałbym od strony sqla zabezpieczyć to tak, aby "1" nie mogło wystąpić więcej niż raz. Zwykłe unique tu nie zadziała bo zera przecież mogą się powtarzać. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 387 Pomógł: 66 Dołączył: 31.03.2005 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Problem jest taki, że użytkownicy to kombinatorzy i nawet jak zabezpieczam to od kodu ktoś może grzebać w sqlu (lub któryś plugin). Co ?!? Jeśli ktoś może coś zmienić bez uprawnień lub cokolwiek robić co nie zostało zaplanowane w aplikacji to jest to potężna! luka w zabezpieczeniach (IMG:style_emoticons/default/exclamation.gif) ! Nawet nie pisz takich rzeczy (IMG:style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 1 Dołączył: 16.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Nie ma zabezpieczeń nie do przejścia. Jeśli zakładasz, że użytkownicy będą grzebać w skryptach lub SQLu, to każde zabezpieczenie które założysz na SQLa (np. uniq o którym pisałeś - jeśli by działało; lub triggery), może zostać przez "osobę grzebiącą" ściągnięte (ominięte).
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Luk staram sie aby nie było (IMG:style_emoticons/default/wink.gif)
Generalnie z tym sqlem chodziło mi raczej o jakiegoś grzebule od phpmyadmina albo zwyczajnego buta w kodzie (IMG:style_emoticons/default/wink.gif) Wpadł mi ciekawy pomysł do głowy który pilnować nie będzie ale zniesione skutki: przy edycji dowolnej kategorii robię dodatkowo select po isDef z limit 1, zapamietuje od grupy, robię update isDef na 0 i następnie kolejny update tyle ze ustawiam isDef na 1 tylko zapamietanemu idkowi. Metoda może trochę na około ale nie znalazłem żadnego mechanizmu w mysqlu służącego do tego celu (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 92 Dołączył: 6.02.2011 Ostrzeżenie: (0%) ![]() ![]() |
1. triggery(ale o szczegóły mnie nie pytaj (IMG:style_emoticons/default/wink.gif) )
2. w php dajesz podstawowe zapytanie
Potem tylko sprawdzasz przez zwykły if, czy zapytanie zwróciło wyniki i reagujesz na sytuację |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Obecnie isDef używam tylko do dodawania napisu "Domyslna" ale chce dopisać zabezpieczenia typu nieusuwalnosc domyslnej czy przenoszenie userow ze skasowanej do domyslnej wiec fajnie żeby była unikalną (IMG:style_emoticons/default/wink.gif)
Twój sposób nie zadziała bo ja potrzebuje mieć porządek w sql a nie tylko w tym co dostanie user. A o triggerach pogooglam (domyślam sie ze chodzi tu o ustawienie watchdoga który pilnuje danych) |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Normalnie użyłbyś CHECK(), ale MySQL tego nie obsługuje. Dosyć łatwo możesz to osiągnąć poprzez kombinację ENUMa i NULLa, tj:
NULLe traktujesz jako "nie", YES traktujesz jako "tak". Takie coś umożliwia nieistnienie żadnej domyślnej grupy, ale gwarantuje tylko jedną domyślną. PS. W MySQL (właściwie to ogólnie w SQL) stosuje się konwencję "underscore", czyli is_def, nie isDef. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Normalnie użyłbyś CHECK(), ale MySQL tego nie obsługuje. Dosyć łatwo możesz to osiągnąć poprzez kombinację ENUMa i NULLa, tj: NULLe traktujesz jako "nie", YES traktujesz jako "tak". Takie coś umożliwia nieistnienie żadnej domyślnej grupy, ale gwarantuje tylko jedną domyślną. PS. W MySQL (właściwie to ogólnie w SQL) stosuje się konwencję "underscore", czyli is_def, nie isDef. Hmm sprytne, dopilnowanie tego aby zawsze była domyślna tu już nie taki duży problem (IMG:style_emoticons/default/smile.gif) Co do notacji - wszystkie underscory przeprawiłem na notację somethingNice bo w każdym kodzie tak pisze więc po co w bazie danych kombinować (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Nie cytuj całych wypowiedzi, a już w szczególności, gdy odpowiadasz na ostatni post.
2. Cytat Co do notacji - wszystkie underscory przeprawiłem na notację somethingNice bo w każdym kodzie tak pisze więc po co w bazie danych kombinować (IMG:style_emoticons/default/smile.gif) Bo właśnie to Ty kombinujesz. (IMG:style_emoticons/default/wink.gif) Kod pisze się zawsze z uwzględnieniem konwencji dla danego języka i tak w takim PHP czy Javie zmienne nazywasz stosując konwencję camel case (nazwaZmiennej), a w takim C czy SQLu zmienne / kolumny nazywasz stosując konwencję underscore (nazwa_zmiennej). Inaczej prędzej czy później doprowadzisz do burdelu w kodzie.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Tak ale skoro stosuje CC w kodzie to dlaczego mam go nie używać w SQLu? (IMG:style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Powtórzę:
Cytat Kod pisze się zawsze z uwzględnieniem konwencji dla danego języka [...] A SQL ma utartą konwencję nazewnictwa, gdzie słowa kluczowe pisze się wielkimi literami, a identyfikatory zapisuje w_ten_sposób.
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Powtórzę:A SQL ma utartą konwencję nazewnictwa, gdzie słowa kluczowe pisze się wielkimi literami, a identyfikatory zapisuje w_ten_sposób. No to w takim razie w php też_należy_pisać_tak patrząc na stdlib co nie zmienia faktu, że każdy pisze jak chce klamry oraz nazwy kluczowe. Ważne jest w sumie nie tyle forma zapisu co jego czytelność i spójność - idąc tym tropem wg. mnie powinno się pisać w całym projekcie w jeden sposób (baza danych jest częścią projektu, right?). Kolejna sprawa - nie nazwałbym SQLa językiem - formalnie się do nich zalicza ale nie pisze się w nim jako takich funkcji, pętli, przekształceń (a bynajmniej nie powinno się - jest to możliwe ale wciąż trzeba pamiętać, że to BAZA danych a nie PREPROCESOR danych). Ten post edytował kiler129 19.03.2011, 02:02:57 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
PHP w to nie wciągaj. PHP to książkowy przykład burdelu spowodowanego tym, że każdy robił jak chciał. Pomijamy fakt, że obecnie PHP jest w fazie przejściowej, tj. cały nowy kod powinien być pisany wg notacji camelCase.
Cytat idąc tym tropem wg. mnie powinno się pisać w całym projekcie w jeden sposób (baza danych jest częścią projektu, right?). Kod PHP pisze się inaczej, kod CSS pisze się inaczej, kod XML pisze się inaczej, kod YAML pisze się inaczej, kod SQL pisze się inaczej, kod Javy pisze się inaczej, kod Basha pisze się inaczej - wszystkie pisze się inaczej mimo iż nie ma najmniejszego problemu by wystąpiły wszystkie w jednym projekcie.Cytat Kolejna sprawa - nie nazwałbym SQLa językiem - formalnie się do nich zalicza ale nie pisze się w nim jako takich funkcji, pętli, przekształceń (a bynajmniej nie powinno się - jest to możliwe ale wciąż trzeba pamiętać, że to BAZA danych a nie PREPROCESOR danych). Język SQL jest pełnoprawnym deklaratywnym językiem programowania w którym występują przekształcenia, pętle czy funkcje (no, te ostatnie to raczej zaliczają się do rozszerzeń SQLa, ale ogólnie przyjmuje się to wszystko za jedność). Nie wiem też co tutaj mają preprocesory do rzeczy.W skrócie: nie rób burdelu i dostosuj się do ogólnie przyjętych konwencji. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Faktycznie skończymy już temat cc/us - do niczego nie dojdziemy (IMG:style_emoticons/default/wink.gif)
Jeśli chodzi o język SQL to nie odpuszcze swojej racji - owszem, można w nim pisać pełnoprawny kod ale nie do tego on służy! Od przetwarzania danych mamy stronę aplikacji a nie bazę danych. Dużo lepszym wyjściem jest pobranie w prostrzy sposób nawet nieco większej porcji danych i przetworzenie jej po stronie PHP niż pisanie zapytania które na zwrócenie wyniku potrzebuje kilku sekund. Baza służy do gromadzenia i zwracania danych a nie do obróbki danych - tyle w temacie. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@kiler129: W tej chwili skompromitowałeś się. Celem istnienia baz danych jest... gromadzenie i przetwarzanie danych. Zadaniem aplikacji jest przetwarzanie tylko tego czego z poziomu bazy danych się nie da, albo jest to efektywniejsze. Chociażby dla zachowania spójności danych czy pisania kodu raz i wykorzystywania go wielokrotnie (w przypadku gdy kilka aplikacji korzysta z jednej bazy). To, że Ty się ograniczasz do operacji CRUD na bazie danych to tylko i wyłącznie Twoja sprawa, ale nie wypisuj głupot, że bazy służą wyłącznie do tego.
Cytat [...] niż pisanie zapytania które na zwrócenie wyniku potrzebuje kilku sekund. Tak, bo PHP przetworzy te dane w jedną tysięczną sekundy...Cytat Baza służy do gromadzenia i zwracania danych a nie do obróbki danych - tyle w temacie. Do poczytania: http://en.wikipedia.org/wiki/PLSQL (i inne warianty innych baz danych).
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
A to PLSQL jest częścią standardu SQL? Bo czysty SQL chyba jednak nie jest pełnoprawnym językiem programowania.
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@everth:
Cytat Język SQL jest pełnoprawnym deklaratywnym językiem programowania w którym występują przekształcenia, pętle czy funkcje (no, te ostatnie to raczej zaliczają się do rozszerzeń SQLa, ale ogólnie przyjmuje się to wszystko za jedność).
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 782 Pomógł: 153 Dołączył: 21.07.2010 Ostrzeżenie: (0%) ![]() ![]() |
No i masz rację, rację ma też @kiler129, wszystko zależy od tego co wpiszecie sobie pod skrót SQL (IMG:style_emoticons/default/wink.gif)
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ja to ujmę inaczej - można ale żadko wydajniej jest przetwarzać coś na bazie danych niż w aplikacji. Szczególnie ta zasada ma się do PHP gdzie kod jest odpalany w większości na shared-hostach gdzie bazy są bardzo obciążone.
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Ja to ujmę inaczej - można ale żadko wydajniej jest przetwarzać coś na bazie danych niż w aplikacji. Chciałeś chyba powiedzieć coś dokładnie odwrotnego?1. Transport danych z bazy do aplikacji jest dosyć kosztowny. 2. PHP samo w sobie będzie raczej minimalnie wolniejsze od bazy danych (mimo iż testów nie przeprowadzałem). Cytat Szczególnie ta zasada ma się do PHP gdzie kod jest odpalany w większości na shared-hostach gdzie bazy są bardzo obciążone. Tak, tylko w przypadku aplikacji odpalanych na współdzielonych maszynach ten aspekt wydajności jest kompletnie bez znaczenia.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.09.2025 - 15:44 |