Poslao: 18 Sep 2006 19:53
|
offline
- ][v][ A T R I X™
- Legendarni građanin
- Pridružio: 28 Apr 2005
- Poruke: 3686
- Gde živiš: The Circle
|
Zelim npr. da napravim prikaz arhive dogadjaja (arhiva=stari dogadjaji u bazi osim onih koji su aktuelni na sajtu):
Primer SQL upita koji to radi:
SELECT *
FROM `dogadjaji_news`
WHERE kategorija_name NOT LIKE 'sajt_aktuelno';
Ovaj upit normalno radi na samoj bazi.
Medjutim treba preko PHP-a to prikazati odnosno implementirati u vec postojecu web aplikaciju.
Kod za prikaz glasi:
<?php
include_once '../system/prikaz.php';
arhiva(10);
?>
broj 10 u zagradi je promenljiva koja odredjuje broj prikazanih najnovijih item-a na stranici. To radi normalno i lepo. Promenom broja u zagradi menja se i broj dogadjaja koji ce se pojaviti na stranici.
u fajlu prikaz.php se nalazi funkcija koja prihvata gornje promenljive iz zagrade:
Pocetak funkcije koji je najbitniji za ovo sto meni treba ako se ne varam:
function arhiva($broj, $kategorija = ' ')
Dakle $broj ce prikazati 10 najnovijih dogadjaja iz baze kako je definisano, a $kategorija ostavlja prazno kako bi izlistali sve dogadjaje iz svih kategorija. Ako se u zagradu posle broja doda:
arhiva(10,ime_kategorije);
sistem ce prikazati 10 dogadjaja iz SAMO navedene kategorije.
Ja zelim da definisem za prikaz arhive da se iz baze vuku XY dogadjaja SAMO BEZ prikaza jedne, imenovane kategorije odnosno polja.
Dakle zelim da mi upit vrati sve redove iz neke tabele ISKLJUCUJUCI samo jedan red koji ne zelim da se prikaze u upitu.
Da ponovim, direktno na bazi to se postize vrlo lako upitom:
SELECT *
FROM `dogadjaji_news`
WHERE kategorija_name NOT LIKE 'sajt_aktuelno';
Ali mi problem pravi gde da ovaj upit implementiram, (NOT LIKE deo) da li u fajl prikaz.php gde je funkcija za prihvatanje promenljivih ili u sam prikaz stranice posle broja 10? Probao sam ali mi uvek javlja gresku na toj liniji...
Oci mi ispadose od guglanja za EXCEPT klauzulom medjutim izgleda to ne f-nise tj. ne postoji u SQL-u?
Nabasao sam jedva na ovo:
Citat:A compound SELECT is formed from two or more simple SELECTs connected by one of the operators UNION, UNION ALL, INTERSECT, or EXCEPT.
EXCEPT Clause
The EXCEPT clause has this general form:
select_statement EXCEPT [ ALL ] select_statement
select_statement is any SELECT statement without an ORDER BY, LIMIT, or FOR UPDATE clause.
The EXCEPT operator computes the set of rows that are in the result of the left SELECT statement but not in the result of the right one.
The result of EXCEPT does not contain any duplicate rows unless the ALL option is specified. With ALL, a row that has m duplicates in the left table and n duplicates in the right table will appear max(m-n,0) times in the result set.
Multiple EXCEPT operators in the same SELECT statement are evaluated left to right, unless parentheses dictate otherwise. EXCEPT binds at the same level as UNION.
Ako se ne varam mozda moze nesto i sa operandom: <> (Not equal) ali mi nesto ne ide najbolje a i preumoran sam trenutno..
Nadam se da ce neko iskusan znati o cemu se ovde radi... isto se nadam da sam dobro i detaljno objasnio sve... ako treba mogu jos detalja da postujem.
Dopuna: 18 Sep 2006 19:52
Anyone?
Dopuna: 18 Sep 2006 19:53
Mozda je tema trebala da ide u Web programiranje (PHP) pre nego ovde u baze?
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 18 Sep 2006 20:10
|
offline
- snoop
- Genghis Khan
- Pridružio: 18 Apr 2003
- Poruke: 8134
- Gde živiš: U kesici gumenih bombona...
|
Znaci, f-ja arhiva(x, y) vraca x zapisa za y kategoriju?
Ako je tako, onda ne mozes tu staviti not like, jer ako to uradis onda ti ona moja recenica gore nece raditi....
Mislim da je <> samo za integer...
Ono sto mozes da uradis, jeste da dodas jos jedan parametar f-ji tipa boolean i da pitas ako je true, onda znaci da treba da izbacis kategoriju koja je navedena u suprotnom stavi upit koji ce vratiti x zapisa za y kategoriju.
Ako sam ja celu problematiku lepo shvatio...
|
|
|
|
Poslao: 18 Sep 2006 20:37
|
offline
- ][v][ A T R I X™
- Legendarni građanin
- Pridružio: 28 Apr 2005
- Poruke: 3686
- Gde živiš: The Circle
|
Na dobrom si putu.. ali:
f-ja arhiva(x,y) vraca X zapisa dok je y po defaultu prazno sto rezultuje da f-ja vrati zapise iz SVIH kategorija. Ja hocu samo da mi ne vraca iz svih vec jednu katgoriju zelim da izostavim, samo jednu (za sada).
U sustini ne volim da cackam po vec gotovom kodu odnosno aplikaciji koja radi u production envoirment-u... kao sto je ovde slucaj... tako da to za boolean i true/false ne znam kako bi ispalo mora da ima neko prostije resenje
Razmisljao sam da mu nekako modifikujem upit...na drugom sistemu sam na ne mogu sada da postujem deo koda koji radi SELECT SQL-a..
10x u svakom slucaju na paznji
|
|
|
|
Poslao: 18 Sep 2006 21:11
|
offline
- snoop
- Genghis Khan
- Pridružio: 18 Apr 2003
- Poruke: 8134
- Gde živiš: U kesici gumenih bombona...
|
Mislim da ti fali % znak pre apostrofa (NOT LIKE %'ime_kategorije') ili koji je vec asteriks znak za bazu nad kojom radis...
A probaj i ovo:
SELECT *
FROM `dogadjaji_news`
WHERE kategorija_name LIKE %'' AND kategorija_name NOT LIKE %'sajt_aktuelno';
Gde ces sajt_aktuelno da zamenis sa parametrom f-je - y.
Nisam siguran da li treba %.
Probaj izvrsiti upit u bazi, npr.
SELECT * FROM MyCity_Users WHERE Username LIKE %'sno';
Ovaj upit bi trebao da vrai sve korisnike kojima username pocinje sa 'sno'.
Ako to radi u bazi, onda jos proveri da li radi u aplikaciji .
|
|
|
|
Poslao: 20 Sep 2006 22:35
|
offline
- ][v][ A T R I X™
- Legendarni građanin
- Pridružio: 28 Apr 2005
- Poruke: 3686
- Gde živiš: The Circle
|
OK, ali meni onaj prvi upti savrseno radi na samoj bazi, bilo preko konzole ili preko phpmyadmin-ovog SQL window-a. Tako da to nije problem, on vrati sve osim NOT LIKE stoga upit je dobar.
Mene zeza programska implementacija dakle PHP deo. Zato sam i rekao mozda je tema trebalo pre da ide u Web programiranje-PHP nego u Baze, ali u trenutku pisanja nisam imao kompletan upit...
Idem sada na drugi OS da napisem deo koda koji radi select..
evo ga... originalni oblik pa se funkcija zove headers i ostalo je na engleskom..
////////////////////////////////////////////////////////////////////////////
// HEADERS - Show item headers
////////////////////////////////////////////////////////////////////////////
function headers($number, $cat = '') {
global $CONFIG;
if ($CONFIG['enablecats'] == 'yes') {
if (is_array($cat)) {
$cat_stuff = "WHERE ";
for ($i = 0; $i < count($cat); $i++) {
$cat_stuff .= "cat_name='" . addslashes($cat[$i]) . "' ";
if (($i + 1) < count($cat)) {
$cat_stuff .= "OR ";
}
}
} elseif ($cat != '') {
$cat_stuff = "WHERE cat_name='" . addslashes($cat) . "' ";
} else {
$cat_stuff = '';
}
}
$sql = "SELECT * FROM " . $CONFIG['tblPrefix'] . "news $cat_stuff ORDER by postedOn DESC LIMIT " . $number;
$headers = mysql_query($sql) or die(displayerror(mysql_error()));
if ($header = mysql_fetch_array($headers)) {
do {
$hitem = gettemplate('header');
$hitem = str_replace('<id>', $header['id'], $hitem);
$hitem = str_replace('<subject>', stripslashes(htmlspecialchars($header['subject'])), $hitem);
Dopuna: 20 Sep 2006 22:35
Resenje je dodati NOT LIKE u deo koji radi upit:
$cat_stuff = "WHERE cat_name='" . addslashes($cat) . "' ";
........
$cat_stuff = "WHERE cat_name NOT LIKE '" . addslashes($cat) . "' ";
|
|
|
|