Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Stronicowanie z warunkiem
Forum PHP.pl > Forum > Przedszkole
Kshyhoo
Witam. Borykam się z problemem stronicowania. Chcę dodać warunek do zapytania i wciąż mam błąd:
  1. $start = ($s-1)*$na_strone;
  2. $wynik = mysql_query("SELECT SQL_CALC_FOUND_ROWS *
  3. FROM tutoriale
  4. WHERE tut_stan = 1
  5. LEFT JOIN kategorie
  6. ON (kat_id = tut_kat_id)
  7. ORDER BY tut_id DESC
  8. LIMIT $start, $na_strone");
  9. $rekordow = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0);
  10. $stron = ceil($rekordow/$na_strone);

Chciałbym dodać warunek wykluczający wyświetlanie artykułów, gdzie:
  1. WHERE tut_stan = 1

Co nie wymodzę, mam błąd składni zapytania. Chciałbym tez pozbyć się SQL_CALC_FOUND_ROWS * na rzecz COUNT(*)...
kartin
Zobacz w którym miejscu masz WHERE, a w którym powinno być
Kshyhoo
Powinno być tak:
  1. $start = ($s-1)*$na_strone;
  2. $wynik = mysql_query("SELECT SQL_CALC_FOUND_ROWS *
  3. FROM tutoriale
  4. LEFT JOIN kategorie
  5. ON (kat_id = tut_kat_id)
  6. WHERE tut_stan=1
  7. ORDER BY tut_id DESC
  8. LIMIT $start, $na_strone");
  9. $rekordow = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0);
  10. $stron = ceil($rekordow/$na_strone);

Ale:
Gdy wpiszę warunek WHERE tut_stan=1, wyświetlają mi się wyniki, gdzie tut_stan=0!
Gdy wpiszę warunek WHERE tut_stan=0, wyświetlają mi się wyniki, gdzie tut_stan=0, lecz nie wszystkie...
Gdy wpiszę warunek WHERE tut_stan<>0, wyświetlają mi się wyniki gdzie tut_stan=1, ale zliczy mi wszystkie wyniki.
Gdy wpiszę warunek WHERE tut_stan<>1, wyświetlają mi się wyniki gdzie tut_stan=1, ale zliczy mi wszystkie wyniki.
kartin
Jaką masz strukturę tych tabel?
Kshyhoo
  1. CREATE TABLE `tutoriale` (
  2. `tut_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `tut_nr` smallint(4) UNSIGNED ZEROFILL NOT NULL,
  4. `tut_tytul` varchar(255) collate utf8_polish_ci DEFAULT NULL,
  5. `tut_data` int(10) UNSIGNED DEFAULT NULL,
  6. `tut_autor` text collate utf8_polish_ci,
  7. `tut_zrodlo` text collate utf8_polish_ci,
  8. `tut_tresc` longtext collate utf8_polish_ci,
  9. `tut_kat_id` int(11) DEFAULT NULL,
  10. `tut_stan` enum('0','1') collate utf8_polish_ci NOT NULL DEFAULT '0',
  11. `tut_obraz` varchar(20) character SET latin2 NOT NULL,
  12. `tut_psd` enum('0','1') collate utf8_polish_ci NOT NULL DEFAULT '0',
  13. `tut_notatki` text collate utf8_polish_ci,
  14. `tut_moderator` text collate utf8_polish_ci NOT NULL,
  15. `tut_ktoed` smallint(2) UNSIGNED NOT NULL,
  16. `tut_czased` int(10) UNSIGNED NOT NULL,
  17. `tut_czytano` mediumint(8) UNSIGNED DEFAULT '0',
  18. `tut_zezw_koment` enum('0','1') collate utf8_polish_ci NOT NULL DEFAULT '0',
  19. `tut_zezw_ocenic` enum('0','1') collate utf8_polish_ci NOT NULL DEFAULT '0',
  20. UNIQUE KEY `id` (`tut_id`)
  21. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
kartin
Tylko, że w zapytaniu są używane dwie tabele, a dałeś strukturę jednej.
Kshyhoo
Druga, to tylko kategorie:
  1. CREATE TABLE `kategorie` (
  2. `kat_id` int(11) NOT NULL AUTO_INCREMENT,
  3. `kat_kategoria` varchar(255) collate utf8_polish_ci DEFAULT NULL,
  4. UNIQUE KEY `id` (`kat_id`)
  5. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
nospor
Cytat
Gdy wpiszę warunek WHERE tut_stan=1, wyświetlają mi się wyniki, gdzie tut_stan=0!
Niemożliwe.
Pokaż może przykładowe dane czy coś podobnego.
kartin
Jednak możliwe.
  1. `tut_stan` enum('0','1') collate utf8_polish_ci NOT NULL DEFAULT '0',

to nie jest liczba więc, trzeba użyć apostrofów
  1. WHERE tut_stan ='1'
nospor
@mariuszli w tym co piszesz być może i jest racja.

Nie widzę natomiast większego sensu w tym co zrobil Kshyhoo. PO grzyba robić enum z wartości 0 i 1?
Kshyhoo
Cytat(nospor @ 13.06.2010, 21:35:18 ) *
Nie widzę natomiast większego sensu w tym co zrobil Kshyhoo. PO grzyba robić enum z wartości 0 i 1?

To jest tak, jednemu podoba się żona innemu teściowa...
Gdzie nie wejdę na jakieś forum, są zwolennicy jakiegoś rozwiązania, promujący i zachwalający swoje teorie. To rozwiązanie jest właśnie efektem takiej przygody na forum http://www.forumweb.pl. Chodziło mi o najlepsze rozwiązanie dla włączony/wyłączony. Wcześniej używałem innych rozwiązań. To obecne ma być ponoć mniej pamięciożerne.

Podobnie z SQL_CALC_FOUND_ROWS * bo ponoć COUNT(*) jest niby wydajniejsze (http://mariusz.turek.salon404.pl/post/4,my...ws-kontra-count)... Ja jednak nie mogę poradzić sobie z przejściem na COUNT(*).

  1. $start = ($s-1)*$na_strone;
  2. $wynik = mysql_query("SELECT SQL_CALC_FOUND_ROWS *
  3. FROM tutoriale
  4. LEFT JOIN kategorie
  5. ON (kat_id = tut_kat_id)
  6. WHERE tut_stan = '1'
  7. ORDER BY tut_id DESC
  8. LIMIT $start, $na_strone");
  9. $rekordow = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0);
  10. $stron = ceil($rekordow/$na_strone);


@mariuszli, Twoje rozwiązanie okazało się trafne, za co otrzymasz ode mnie wielkiego +
nospor
Cytat
To jest tak, jednemu podoba się żona innemu teściowa...
Ale tu nie ma co się podobac lub nie podobać. To co teraz robisz to tak jakbyś używał chlebaka do trzymania w nim chlebaka...

ja rozumiem używać ENUM dla wartości "włączony" i "wyłączony" - po to enum powstało. Ale mi się z celem uzywać enum dla wartości "0" i "1". Rownie dobrze zrób sobie pole TINYINT i trzymaj tam 0 i 1. Będzie to jeszcze mniej pamięciożerne od tego enum co teraz zrobiłes smile.gif
Kshyhoo
Pisząc to porównanie, nie miałem na myśli siebie... Jestem początkujący, gdy nie wygoogluję nic konkretnego, szukam pomocy na forach. To ENUM jest wynikiem wizyty tu - no i poszedłem za radą. Zresztą zobacz sobie 7 post na w/w stronie, jakie mają zdanie o Tobie brzydal.gif Ja się pod tym nie podpisuję, nawet w tym wątku przytaczam jeden Twój artykuł, który był mi pomocny. Reasumując, cały problem polega na tym, że nie ma dobrego źródła, gdzie można by nauczyć się "porządnego" php - sam manual nie wystarcza a kursy traktują raczej lakonicznie niektóre rzeczy.

EDIT. Dodam jeszcze, że żyję w przeświadczeniu, że polscy programiści sporo potrafią ale niechętnie dzielą się swoją wiedzą z innymi a już szczególnie za friko. Rozumiem, że lepiej dać komuś wędkę niż rybę, ale dobrze też pokazać łowisko...
nospor
Cytat
Zresztą zobacz sobie 7 post na w/w stronie, jakie mają zdanie o Tobie
Masz na myśli ten tekst:
Cytat
Ten gosc to kafar

? Nom, przejąłem się... winksmiley.jpg

Cytat
że nie ma dobrego źródła, gdzie można by nauczyć się "porządnego" php - sam manual nie wystarcza a kursy traktują raczej lakonicznie niektóre rzeczy.
No i dlatego tłumaczę ci w tym temacie że stosowanie ENUM w tym przypadku jest bez sensu smile.gif

Cytat
Dodam jeszcze, że żyję w przeświadczeniu, że polscy programiści sporo potrafią ale niechętnie dzielą się swoją wiedzą z innymi a już szczególnie za friko.
Wydawało mi się, ze na naszym forum jestes stałym gościem, a tu widzę taką opinię... ludzie to codziennie dzielą się swoją wiedzą za darmo. A to że często dają wędkę zamiast ryby - uwierz, to tylko dla waszego dobra.
Kshyhoo
Ja też bym się nie przejmował. Internet to takie medium, że nie sposób natrafić na wszechwiedzących najlepiej zadufanych w sobie dupków. Ten przykład podałem jedynie po to, żeby pokazać, że im więcej znaczysz, więcej możesz oberwać...

Co do ENUM, wcześniej miałem (mam stare zrzuty bazy):
  1. `stan` int(1) NOT NULL DEFAULT '0',

a jeszcze wcześniej:
  1. `stan` char(1) NOT NULL DEFAULT '0',

Człowiek uczy się na błędach - szkoda tylko, że na swoich ;( Największy problem to język - niestety, uczęszczałem do szkoły w czasie, gdy Polska była zapatrzona daleko i ślepo na wschód - a manuale są po angielsku...
nospor
dobra, jutro uporządkuję ci tę tabelę trochę. teraz idę spac.

ps: czyzbyś był starszy ode mnie? eee, nie winksmiley.jpg

edit:
no to jedziem. Na początek drobne uwagi na podstawie kodu co pokazałeś
- jak coś jest liczbą to masz tam wkładać liczbę a nie tekst.
czyli nie '0', '1' ...
a: 0, 1 ...
- jak coś jest datą, to pole ma być typu datowego (DATE,TIME,DATETIME, TIMESTAMP) a nie int
- jak liczba nie jest ZEROFILL to podawanie np. int(11) niczemu nie służy. samo int wystarczy
- jak coś jest auto_increment, i to coś jest też unikalne, to znaczy ze to jest klucz głowny. rób więc z tego klucz główny
- jak coś ma przyjmowac małe liczby, to rób z tego tinyint
- nie rób enum z wartosci liczbowych. to sie mija z celem. Jak chcesz robic to rób z wartości tekstowych, wtedy ma to sens.
- mogłbys się pokusic o typ INNOD_DB zamiast MyIsam - móglbys robić wówczas relacje. No ale to narazie zostawmy
- twórz indexy na polach, które będą brały udział np. w wyszukiwaniach
- jesli pole będzie miało tylko dodatnie liczby, dodawaj UNSIGNED
  1. CREATE TABLE `tutoriale` (
  2. `tut_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `tut_nr` smallint(4) UNSIGNED ZEROFILL NOT NULL,
  4. `tut_tytul` varchar(255) DEFAULT NULL,
  5. `tut_data` timestamp DEFAULT NULL,
  6. `tut_autor` text , //CZEMU TU MASZ TEXT ?
  7. `tut_zrodlo` text //CZEMU TU MASZ TEXT ?,
  8. `tut_tresc` longtext ,
  9. `tut_kat_id` int UNSIGNED DEFAULT NULL,
  10. `tut_stan` tinyint NOT NULL DEFAULT 0,
  11. `tut_obraz` varchar(20) NOT NULL,
  12. `tut_psd` tinyint NOT NULL DEFAULT 0,
  13. `tut_notatki` text ,
  14. `tut_moderator` text NOT NULL, //CZEMU TU MASZ TEXT ?
  15. `tut_ktoed` smallint UNSIGNED NOT NULL,
  16. `tut_czased` timestamp UNSIGNED NOT NULL,
  17. `tut_czytano` mediumint UNSIGNED DEFAULT 0, //CZEMU TU MASZ mediumint ? Nie powinny byc tinyint? nie wiem co tam bedziesz trzymal.
  18. `tut_zezw_koment` tinyint NOT NULL DEFAULT 0,
  19. `tut_zezw_ocenic` tinyint NOT NULL DEFAULT 0,
  20. PRIMARY KEY (`tut_id`)
  21. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
Kshyhoo
Uuuu, ale konkretów. To może i ja pokomentuję:
  1. CREATE TABLE `tutoriale` (
  2. `tut_id` int UNSIGNED NOT NULL AUTO_INCREMENT, // fakt, jakoś mi się 11 dopisało, sam nie wiem skąd :|
  3. `tut_nr` smallint(4) UNSIGNED ZEROFILL NOT NULL, // chcę mieć liczbę 4-cyfrową
  4. `tut_tytul` varchar(255) DEFAULT NULL,
  5. `tut_data` timestamp DEFAULT NULL, // miałem int(10), bo mam jakieś problemy z przetwarzaniem daty
  6. `tut_autor` text , //CZEMU TU MASZ TEXT ? - tu ma BYć nick, imię autora artykułu
  7. `tut_zrodlo` text //CZEMU TU MASZ TEXT ?, - tu ma BYć adres (www) do źródła
  8. `tut_tresc` longtext ,
  9. `tut_kat_id` int UNSIGNED DEFAULT NULL, // tu takie same jaja, nie wiem skąd TO 11...
  10. `tut_stan` tinyint NOT NULL DEFAULT 0, // poprawię - mam rozumieć, że kod php pozostanie ten sam?
  11. `tut_obraz` varchar(20) NOT NULL, // link do obrazka... (img/00/00/obrazek.jpg)
  12. `tut_psd` tinyint NOT NULL DEFAULT 0,
  13. `tut_notatki` text ,
  14. `tut_moderator` text NOT NULL, //CZEMU TU MASZ TEXT ? - hmmm, TO ma BYć nick dodającego
  15. `tut_ktoed` smallint UNSIGNED NOT NULL, // ID edytującego
  16. `tut_czased` timestamp UNSIGNED NOT NULL, // tu zapisuję czas, w jakim można edytować artykuł (czas z przyszłości)
  17. `tut_czytano` mediumint UNSIGNED DEFAULT 0, //CZEMU TU MASZ mediumint ? Nie powinny byc tinyint? nie wiem co tam bedziesz trzymal. - tu ma BYć licznik, ile razy czytano dany artykuł
  18. `tut_zezw_koment` tinyint NOT NULL DEFAULT 0, // czy zezwolić na komentowanie
  19. `tut_zezw_ocenic` tinyint NOT NULL DEFAULT 0,// czy zezwolić na ocenianie
  20. PRIMARY KEY (`tut_id`)
  21. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


- jak coś jest datą, to pole ma być typu datowego (DATE,TIME,DATETIME, TIMESTAMP) a nie int
Jak już pisałem, miałem problemy w przetwarzaniem daty i teraz zapisuję to po prostu tak:
  1. $data = time();

To samo z czasem edycji:
  1. if ($czased == '') {
  2. $czased = time() + 172800;
  3. } else {
  4. $czased = $_POST['czased'];
  5. }

A potem:
  1. '.showdate('Y m.j', $dane['tut_data']).'

Funkcja (szczerze mówiąc, "kwietnia" przekłamuje:
  1. // Format polskiej daty i godziny
  2. function showdate($format,$timestamp=null){
  3. $to_convert = array(
  4. 'l'=>array('dat'=>'N','str'=>array('Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota','Niedziela')),
  5. 'F'=>array('dat'=>'n','str'=>array('styczeń','luty','marzec','kwiecień','maj','czerwiec','lipiec','sierpień','wrzesień','październik','listopad','grudzień')),
  6. 'f'=>array('dat'=>'n','str'=>array('stycznia','lutego','marca','kwietnia','maja','czerwca','lipca','sierpnia','września','października','listopada','grudnia'))
  7. );
  8. if ($pieces = split('[:/.\ \-]', $format)){
  9. if ($timestamp === null) { $timestamp = time(); }
  10. foreach ($pieces as $datepart){
  11. if (array_key_exists($datepart,$to_convert)){
  12. $replace[] = $to_convert[$datepart]['str'][(date($to_convert[$datepart]['dat'],$timestamp)-1)];
  13. }else{
  14. $replace[] = date($datepart,$timestamp);
  15. }
  16. }
  17. $result = str_replace($pieces,$replace,$format);
  18. return $result;
  19. }
  20. }

- jak liczba nie jest ZEROFILL to podawanie np. int(11) niczemu nie służy. samo int wystarczy
No to łapię...

- jak coś jest auto_increment, i to coś jest też unikalne, to znaczy ze to jest klucz głowny. rób więc z tego klucz główny
Tego nie łapię - myślałem, że właśnie to wykorzystuję...

- jak coś ma przyjmowac małe liczby, to rób z tego tinyint
Czyli na ID kategorii lub ID_kto_edytuje się nada - ja miałem smallint...

- jak coś jest liczbą to masz tam wkładać liczbę a nie tekst.
czyli nie '0', '1' ...
a: 0, 1 ...


- nie rób enum z wartosci liczbowych. to sie mija z celem. Jak chcesz robic to rób z wartości tekstowych, wtedy ma to sens.
W sumie, mógłbym się pokusić o trzymanie w ENUM, wystarczyło by zmienić co nieco w formularzu, bo teraz mam:
  1. <input type="radio" name="stan" value="0" checked="checked" />
  2. <input type="radio" name="stan" value="1" />


- mogłbys się pokusic o typ INNOD_DB zamiast MyIsam - móglbys robić wówczas relacje. No ale to narazie zostawmy
Tak, żart się udał winksmiley.jpg

- twórz indexy na polach, które będą brały udział np. w wyszukiwaniach
Tematu wogóle nie łapię, mam co prawda wyszukiwarkę spłodzoną, ale wzorowałem się na php-fusion...

- jesli pole będzie miało tylko dodatnie liczby, dodawaj UNSIGNED
To już wiedziałem, ale mogłem przeoczyć.
I na koniec:

ps: czyzbyś był starszy ode mnie? eee, nie winksmiley.jpg
Wiek: Kobiet i nospora o wiek się nie pyta winksmiley.jpg Ale swoje lata już mam.
co_jest.gif Serio??
nospor
Cytat
Jak już pisałem, miałem problemy w przetwarzaniem daty
To problemy nalezy rozwiązywać a nie omijać. Taką metodą daleko nie zajdziesz. smile.gif
funkcje do daty w mysql
http://dev.mysql.com/doc/refman/5.1/en/dat...-functions.html
funkce od daty w php
http://pl.php.net/manual/pl/ref.datetime.php
Jak sobie sam nie bedziesz radził to wal na forum.
Kodu co pokazałeś z datami to nie rozumiem o co w nim biega więc póki co się nad nim nie zastanawiam. Jakiś taki skomplikowany się wydaje winksmiley.jpg Może napisz co chciałeś zrobić.


Cytat
poprawię - mam rozumieć, że kod php pozostanie ten sam?
tak
Cytat
- jak coś jest auto_increment, i to coś jest też unikalne, to znaczy ze to jest klucz głowny. rób więc z tego klucz główny
Tego nie łapię - myślałem, że właśnie to wykorzystuję...
No nie. Ty powiedziales tylko ze pole jest autoincrement i ze jest unikalne. Zas by ogreslic kłócz główny, uzywa sie PRIMARY KEY - zawiera ono między innymi z definicji unikalność

Cytat
- jak coś ma przyjmowac małe liczby, to rób z tego tinyint
Czyli na ID kategorii lub ID_kto_edytuje się nada - ja miałem smallint...
No nie do konca. Jesli kategorii lub osob (kto_edytuje) będzie więcej niż 255 to musisz dac większy typ. Musisz patrzec ile czego może być.

Cytat
- twórz indexy na polach, które będą brały udział np. w wyszukiwaniach
Tematu wogóle nie łapię, mam co prawda wyszukiwarkę spłodzoną, ale wzorowałem się na php-fusion...
Indexy służą do szybszego wyszukiwania informacji w bazie danych. Nigdy nie zaglądałeś do spisu treści w ksiązce? To jest właśnie taki index. Zresztą ksiązki naukowe oprócz spisu tresci mają też normalny index - dzięki temu szybciej znajdujesz informacje na temat tego czego szukasz. W bazie danych jest podobny mechanizm. Jesli więc tworzysz wyszukiwarkę, to dobrze jest załozyc indexy na pola po których wyszukujesz - dzieki temu zapytanie szybciej zwróci wynik

Cytat
ps: czyzbyś był starszy ode mnie? eee, nie
Wiek: Kobiet i nospora o wiek się nie pyta Ale swoje lata już mam.
Serio??
No nie wiem ile ty masz lat, ale ja do szkoły też za komuny chodziłem.

Cytat
`tut_moderator` text NOT NULL, //CZEMU TU MASZ TEXT ? - hmmm, TO ma BYć nick dodającego

Hmmm, to nick moderatora bedzie:
askjdhkajshdjkashkdjhasjkhdjkashdkjhakjssssssssssssssssssssssshdkjashdkjsahdkjha
skjdhkjashdkjashdkjhaskjdhaskjhdkashdjashkdjhsakjdhaskjhdkashdhaskdjhasjkdhjkash
d
kjashdkjsahdjkashdjkahsdjkhaskjdhaskjdhaskjhdjashdkjashdkfkjsdfjksahfjksdahfkjsd
h
fkjshdkfjhsdkjfhskjdhfskjhfskjdfhskjdhfskjdhfksjdhfksjdhfjksdhfsdjkfhskjfhskjhfs
j
kashfkjshfsjdf
?
Naprawdę tam musi być TEXT? Nie może byc varchar(32) ?
A najlepiej żeby był tam ID moderatora. Jego nick wyciągniesz z tabeli ludków.
Kshyhoo
Mój wiek, to żadna tajemnica - 43... mam w profilu.

Jak znajdę trochę czasu (po 16 miesiącach znalazłem robotę), pozmieniam kod. Indeksowaniem zajmę się przy wyszukiwarce. Co do nicku moderatora (w zasadzie redaktora) - Administrator zakłada konto a skrypt sprawdza nick, więc nikt mi nie namiesza:
  1. if (!preg_match('/^([A-ZĆÓŁŚŻŹ]{1})([a-zA-ZąśżźćęńłóĄŚŻŹĆŃŁÓ0-9_-]{2,11})$/', $login)) {

Ponadto, nick jest pobrany z bazy przy zapisie artykułu do bazy i służy jedynie dla informacji admina - oczywiście mógłbym zapisywać tylko ID...
nospor
Cytat
Mój wiek, to żadna tajemnica - 43... mam w profilu.
Dobra, aż tak stary nie jestem winksmiley.jpg

Cytat
Administrator zakłada konto a skrypt sprawdza nick, więc nikt mi nie namiesza:
Tu nie chodzi o namieszanie, ale o ideę
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.