Dłuższe zapytanie

2013-01-30 18:38:35 Post #1 gość_gosc

 
Witam, mam takie zapytanie:
SELECT n.id, n.nazwa, n.`data` , n.autor, n.tresc, n.typ, n.link, COUNT( k.id ) AS ilosc
FROM newsy_strony n
LEFT JOIN komentarze k
USING ( id ) 
WHERE n.typ =1
GROUP BY n.id
ORDER BY n.data DESC 
LIMIT 0 , 3


i trochę, się już w nim zagubiłem... potrzebuje pobrać newsy z określonej kategorii. Mam 2 tabele takie:
CREATE TABLE `kategorie_newsy` (
  `id` int(11) NOT NULL auto_increment,
  `kategoria_id` int(11) NOT NULL,
  `news_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=3 ;

-- 
-- Zrzut danych tabeli `kategorie_newsy`
-- 

INSERT INTO `kategorie_newsy` VALUES (1, 2, 102);
INSERT INTO `kategorie_newsy` VALUES (2, 1, 102);

-- --------------------------------------------------------

-- 
-- Struktura tabeli dla  `newsy_strony`
-- 

CREATE TABLE `newsy_strony` (
  `id` smallint(6) NOT NULL auto_increment,
  `nazwa` text collate utf8_polish_ci NOT NULL,
  `data` datetime NOT NULL default '0000-00-00 00:00:00',
  `autor` varchar(255) collate utf8_polish_ci NOT NULL default '',
  `tresc` text collate utf8_polish_ci NOT NULL,
  `typ` text collate utf8_polish_ci NOT NULL,
  `link` text collate utf8_polish_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=134 ;

-- 
-- Zrzut danych tabeli `newsy_strony`

Czyli dajmy na to potrzebuje pobrać newsy, z kategorii o id 1 to pobierają mi się te dwa 102
kategorie_newsy.news_id jest to id newsa
kategorie_newsy.id kategoria moja która podaje w zapytaniu...



Gdy próbuje cokolwiek dodać to od razu błąd.. Można prosić o pomoc?

2013-01-31 10:13:39 Post #2 nospor

 
SELECT n.id, n.nazwa, n.`data` , n.autor, n.tresc, n.typ, n.link, COUNT( k.id ) AS ilosc 
FROM newsy_strony n 
LEFT JOIN komentarze k 
USING ( id )
left join  kategorie_newsy kn on kn.news_id=n.id
WHERE n.typ =1 and kn.kategoria_id=1
GROUP BY n.id 
ORDER BY n.data DESC  
LIMIT 0 , 3

2013-01-31 17:30:25 Post #3 gość_xxdrago

 
Dzięki ty to mnie czasami zaskakujesz... Może kiedyś w końcu ogarnę tego mysql porządnie...
Zaczynam uczyć się obiektowego i zastanawiam, się po co pisać obiektowo?

Mam taki system newsów:
http://pastebay.net/1179212

i tak kminie to tam przerobić, na ten obiektowy i stwierdzam, że chyba nic

2013-01-31 17:42:17 Post #4 nospor

 
Obiektówka ułatwia naprawdę wiele rzeczy.
Chcesz - to się ucz. Nie chcesz - to się nie ucz

2013-01-31 17:46:28 Post #5 gość_xxdrago

 
No ale kurde nie wiem, co mam w niej zamieścić? o to mi chodzi

2013-01-31 17:51:29 Post #6 nospor

 
No np. w kodzie co pokazałeś, powinna być klasa NEWS, która odpowiada między innymi za pobranie newsów.

2013-01-31 18:01:01 Post #7 gość_xxdrago

 
tylko, że tam jest taki problem , że jest jeszcze użyta twoja klasa cache parę innych nie będzie to kolidować?

2013-01-31 18:08:54 Post #8 nospor

 
A od kiedy obiektówka ze sobą koliduje?

2013-01-31 18:36:18 Post #9 gość_xxdrago

 
A mógłbyś podpowiedzieć jak mniej więcej zainicjować twoją klasę cache , w mojej klasie?

<?php

class NEWS {

    public function wyswietl($aktualna_strona) {
        
		// Dodajemy newsy do cache
		$news = $cache->Get('news'.$aktualna_strona, '@queries');
		
		
		
    }

}

?>

2013-01-31 18:37:48 Post #10 nospor

 
Przekaz moj obiekt $cache w konstruktorze klasy NEWS

2013-01-31 21:42:02 Post #11 gość_xxdrago

 
Czyli mniej więcej mam zrobić coś takiego?:

http://pastebay.net/1179300

i używać np. tak:
$news->wyswietl('',1,$cache,$pdo,$pagers,$nastronie,$tpl);

2013-02-01 08:01:11 Post #12 nospor

 
NIe do końca.

1)$cache miałeś przekazywać w konstruktorze klasy a nie w funkcji wyswietl()
2)Obiekt mojego pagera, czyli twoje $pagers możesz spokojnie utworzyć w funkcji wyswietl()
3) Funkcja wyswietl() ma się nazywać get() i ma ona zwracać tablicę newsów a nie je wyświetlać. Klasa NEWS nie ma służyć do wyświetlania tylko do pobierania i zarządzania.

2013-02-01 15:57:18 Post #13 gość_xxdrago

 
Kurde, zostawiłem tamto w spokoju i mam zamiar całość napisać obiektowo i przy tym się czegoś nauczyć, dzięki , że poświecisz mi chwilkę. Robię aktualnie klasę, do rejestracji/logowania/wylogowania , w niej uwzględniłem twoje poprawki. Chciałbym się dowiedzieć nad czym powinienem jeszcze popracować? Szablon klasy:
<?php

class register {

    public $db;     // Baza danych

    public function setRegister($db) {
        $this->baza = $db;
    }

    public function rejestracja($login, $haslo) {
        $db = $this->baza; // Polaczenie z baza danych
        // Wykonujemy akcje dodajemy rekord i zwracamy true lub false
        
    }

    public function logowanie() {
        echo 'ok login';
    }

}

?>


Oraz przykładowo jak będę rejestrował użytkownika:
$db = db_connect($type, $host, $dbname, $login, $haslo);

$r = new register;
$r->setRegister($db);

// Zarejestruj uzytkownika
$r->rejestracja('Login','Haslo');


Do klasy myślę dodać jeszcze wyjątki(błędy)

2013-02-04 08:59:37 Post #14 nospor

 
Jak na początek może być

2013-02-04 20:48:03 Post #15 gość_xxdrago

 
Mam już takie coś:
<?php

class register {

    public $db;     // Baza danych

    public function setRegister($db) {
        $this->baza = $db;
    }

    public function rejestracja($login, $email, $haslo) {
        $db = $this->baza; // Polaczenie z baza danych
        // Sprawdzamy czy login jest dostępny
        $sql = $db->prepare('SELECT * FROM users WHERE login =:login');
        $sql->bindValue(':login', $login, PDO:ARAM_STR);
        $sql->execute();
		
        $dostepnosc_loginu = $sql->fetch();
		
        if ($dostepnosc_loginu == 0) {
            // Sprawdzamy czy podany e-mail istnieje
            $sql = $db->prepare('SELECT * FROM users WHERE email =  :email');
            $sql->bindValue(':email', $email, PDO:ARAM_STR);
            $sql->execute();
            $dostepnosc_email = $sql->fetch();

            if ($dostepnosc_email == 0) {
                // Szyfrowanie HASLA
                // Jesli jest wszystko OK! 
                // Szyfrujemy haslo
                $haslo = password($haslo, $login);

                // Dodajemy uzytkownika do bazy! 
                $sql = $db->prepare('INSERT INTO users SET login=:login, haslo=:haslo, email=:email, data_r=NOW(), ip=:ip, przegladarka=:przegladarka, prawa=0');
                $sql->bindValue(':email', $email, PDO:ARAM_STR);                                 // - Email
                $sql->bindValue(':login', $login, PDO:ARAM_STR);                                 // - Login
                $sql->bindValue(':haslo', $haslo, PDO:ARAM_STR);                                 // - Hasło
                $sql->bindValue(':ip', $_SERVER['REMOTE_ADDR'], PDO:ARAM_STR);                   // - IP
                $sql->bindValue(':przegladarka', $_SERVER['HTTP_USER_AGENT'], PDO:ARAM_STR);     // - Przegladarka

                if ($sql->execute()) {
                    return true;
                } else {
                    return false;
                }
            } else {
                throw new Exception('Konto o podanym e-mail już istnieje!');
            }
        } else {
            throw new Exception('Konto o podanym loginie już istnieje!');
        }
    }

    public function logowanie() {
        echo 'ok login';
    }

}

?>


A co myślisz, aby zwracać tablice w razie błędu? zamiast Exception?

2013-02-05 07:23:49 Post #16 nospor

 
Tablicę czego?
Wyjątki jak masz teraz są ok. Wyłapujesz przy okazji błędy bazy przy pomocy jednego mechanizmu

2013-02-06 16:50:32 Post #17 gość_xxd

 
A zerknij jeszcze na to jak mniej więcej mi to wychodzi:

<?php

class walidation {

    public function login($ciag, $a) {
        if (!strlen($ciag) < $a['min']) {
            if (strlen($ciag) > $a['max']) {
                if (preg_match('/^[a-zA-Z0-9]+$/', $ciag)) {
                    return true;
                } else {
                    throw new Exception('Pole login może zawierać znaki typu [a-zA-Z0-9]'); // Max znakow przekroczone
                }
            } else {
                throw new Exception('Pole login może zawierać ' . $a['max'] . ' znaków'); // Max znakow przekroczone
            }
        } else {
            throw new Exception('Pole login musi zawierać' . $a['min'] . ' znaków'); // Min znaków przekroczone
        }
    }

}

?>


if($walidation->login($_POST['pole_z_loginem_usera'],array('min' => 4,'max' => 7,)))
{
echo 'OK';
}

Bo zaczynam widzieć zalety obiektowego programowania

2013-02-07 09:51:54 Post #18 nospor

 
Jak już używasz angielskiego to patrz jak się pisze dane słowa

Klasa ok

2013-02-07 15:17:39 Post #19 gość_xxdrago

 
hehe, dzięki a co tam wyłapałeś? z tym angielskim? )

2013-02-07 15:29:13 Post #20 nospor

 
Masz dwa słowa na krzyż... zajrzyj do słownika

Odpowiedz

1 2 >

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer