mysql_query("CREATE TEMPORARY TABLE fercsike select * from $SQL_TOPIC_TABLE, $SQL_FORUM_TABLE where $SQL_TOPIC_TABLE.forum=$SQL_FORUM_TABLE.f_id && $SQL_TOPIC_TABLE.active>0 order by $SQL_FORUM_TABLE.$listByF,$SQL_TOPIC_TABLE.$listByT limit $honnan,$MCP");
$r=mysql_query("select fercsike.*, $SQL_FORUM_TABLE.forum_name from fercsike, $SQL_FORUM_TABLE where fercsike.forum=$SQL_TOPIC_TABLE.f_id order by $SQL_FORUM_TABLE.$listByF,$SQL_TOPIC_TABLE.$listByT");
És ezt a választ kaptam rá:
Warning: Supplied argument is not a valid MySQL result resource in /var/www/bandijanos/mucsinak/trefforum2/index.php on line 160
Hát a CREATE TABLE segítségével egy ugyanolyan táblát hozol létre, mint mondjuk a forums vagy topics tábla, amit ugyanúgy használhatod, mint bármelyik másik táblát: egy SELECT utasításban megnevezheted a FROM kitétel után, vagy INSERT utasításban az INTO után, stb.
A mysql_query("create ..."); eredményére legfeljebb csak hibaellenőrzéshez van szükséged.
Ilyesmikkel próbálkoztam tegnap, de nem bírtam kitalálni,
1) hogyan kell php-ban kiadni a create parancsot (tehát így, hogy $r=mysql_query("create ....");, egyáltalán kell-e a $akármi= a mysql_query elé)
2) és hogyan tudok utána egy $r=mysql_query("select ...")-el hivatkozni erre? Itt vajon mire kell hivatkozni, a temptable nevére, vagy inkább a (ha kell egyáltalán a create-es query-t elnevezni valaminek) a $akármire?
A legtöbb embernek, akivel eddig találkoztam, aki nem szereti a mysql-t, úgy véli, hogy a mysql kombinációs lehetőségei ma még viszonylag szerények, és ezért az adatbázist használó programozót sok kódolásra, az igazából egybetartozó műveletek apró darabokra lebontására kényszeríti. Ettől néha olyan élvezetes a használata, mintha felmosórongy helyett fogkefével kellene tisztára mosnod a folyosót. :)
Bocsánat, csúnya leszek: mekkora az egész rendszer és az adatbázis? hány tábla? hány sor a PHP-s adatbáziskezelő rész? szeretnélek rábeszélni ugyanis, és segíteni, hogy válts mysql-ről. minél hamarabb. szerintem te is és mi is jobban járunk.
ha az sql mysql nalad akkor a subselect-et feletsd el, de a temp tablaval megoldhatod, vagy tobb query-vel php-bol es te allitod ossze az adatokat, nem csak 1, select * from mindenlegyenbenneugyahogyenakarom :)
Szóval a forums és topics táblák között forum-mező (topics tábla) és az f_id-mező (forums tábla) teremt kapcsolatot (a topikok rendelkeznek egy fórum-azonosítóval, ami alapján vmelyik fórumhoz tartoznak).
Ezenkívül ugye több táblából egyszerre kell listázni, amivel kapcsolatban eddig jutottam:
$r=mysql_query("select * from $SQL_TOPIC_TABLE,
$SQL_FORUM_TABLE where $SQL_TOPIC_TABLE.forum=$SQL_FORUM_TABLE.f_id &&
$SQL_TOPIC_TABLE.active>0 order by
$SQL_FORUM_TABLE.$listByF,$SQL_TOPIC_TABLE.$listByT limit $honnan,$MCP");
(Ahol a listby-okat a felhasználok által beállítottak szerint állítom elő (ezek értéke lehet pl lastdate desc / lastuser stb), a $honnan és $mcp pedig az adott oldalszám és az user által beállított listázásmaximum/oldal segítségével áll elő.)
Ezzel ugye az a gond, hogy először sorrendbe rakja őket a fórumok szerint, és csak utána dátum szerint, ez pedig nem az, amit én szeretnék.
CREATE TABLE content (
c_id bigint(20) unsigned NOT NULL,
t_id bigint(20) unsigned NOT NULL,
user_id varchar(4) NOT NULL,
content text NOT NULL,
date varchar(20) NOT NULL,
previous_id bigint(20) unsigned,
member int(1),
link text
);
#
# Table structure for table 'forums'
#
CREATE TABLE forums (
f_id bigint(10) unsigned NOT NULL auto_increment,
forum_name varchar(30) NOT NULL,
description varchar(100) NOT NULL,
lastdate varchar(20) NOT NULL,
active int(1),
lastuser varchar(16),
PRIMARY KEY (f_id)
);
#
# Table structure for table 'topics'
#
CREATE TABLE topics (
t_id bigint(20) unsigned NOT NULL auto_increment,
topic_name varchar(30) NOT NULL,
description varchar(100) NOT NULL,
lastdate varchar(20) NOT NULL,
active int(1),
prevdate varchar(20),
lastuser varchar(16),
creator varchar(16) NOT NULL,
forum char(3),
PRIMARY KEY (t_id)
);
És van még az users table.
Ezek a php-ban az alábbi módon vannak meghivatkozva:
$SQL_USERS_TABLE=users,
$SQL_CONTENT_TABLE=content,
$SQL_FORUM_TABLE=forums,
$SQL_TOPIC_TABLE=topics.
Az én problémám a következő:
Szeretnék úgy kilistázni topikokat a fórum kezdőoldalára, hogy a dátum szerinti (lastdate) legutolsó x db hozzászólást vegye listázza ki, de úgy, hogy ezeket (miután ugye kiszedte az adatbázisból a 10 legutsó topikot) először a hozzájuk tartozó fórum szerint rakja csoportba, és azon belül dátum szerint. (Illetve ez a két legutolsó szempont mindegy, mert ezt állíthatják az userek abc-sorrendre, akármire, a lényeg, hogy a legutolsó x db-on tudjak rendezést csinálni.)
Addig jutottam tegnap a netes kereséssel, hogy valami nested query-t, vagy subselect-et vagy temporary table-t kéne nekem csinálni ahhoz, hogy a dátum szerint kiszedett x-db topikot utána kedvem szerint rendezgessem. De megvalósítani nem tudtam.
Ja és mindezt php-ból meghívott sql-utasítással kéne megcsinálni.
Nem igazan vagyok hive en sem az effele dolgoknak, de egyelore nem akarom atirni az egesz sz?art, mert akkor mas alapokra kellene helyezni az egeszet! (Majd ha lesz ra keret meg elhatarozas.)
Amugy teljesen igazatok van, favagas helyett inkabb atirtam a jelenlegi cgi-t (ez egy sima c progi). Mukodik, bar en inkabb a php fele huznek.
Kérlek tedd meg a kedvünkért, hogy ideírod a kérdéses tábláknak a struktúráját (mondjuk a létrehozásukhoz használt SQL utasításokat), utána pedig próbáljuk meg kisütni együtt a listázáshoz neked szükséges SQL utasítást, és utána abba helyezd be a változókat.
Szeretnék listázni topikokat egy fórum kezdőlapjához. A topikok adatait $SQL_TOPIC_TABLE tábla tartalmazza, a helyzetet azonban bonyolítom azzal, hogy van egy $SQL_FORUM_TABLE is, amely egyfajta alfórumokat tartalmaz, azaz a topikok mindegyike valamelyik alfórumhoz tartozik (mint itt az indexen a Törzsasztal/Politika stb).
Na most én azt szeretném, hogy a legutolsó x db topikot listázza ki a fórum, de úgy megjelenítve, hogy ezeket alfórumonként csoportosítja...
Eddig erre jutottam, de ez csak az összes topik kilistázásakor működik, ha kevesebbet akarok, akkor nem.
$r=mysql_query("select * from $SQL_TOPIC_TABLE, $SQL_FORUM_TABLE where $SQL_TOPIC_TABLE.forum=$SQL_FORUM_TABLE.f_id && $SQL_TOPIC_TABLE.active>0 order by $SQL_FORUM_TABLE.$listByF,$SQL_TOPIC_TABLE.$listByT limit $honnan,$MCP");
(Itt az aktív topikokat listázom ki, elsődlegesen a fórumok szerint [$listbyf értéke itt date desc], másodlagosan a topikok dátuma [$listbyt] szerint.)
Hogyan tudnék úgy listázni, hogy a dátum szerinti legutolsó x db topikot (elsődleges szempont) fórumazonosítójuk szerint (másodlagos) válogassa szét, majd ezen belül alkalmazza újra a dátum szerinti sorrendet (harmadlagos)?
Lehet, hogy kicsit érthetetlen a dolog, de hátha valaki érti, mit zagyválok... :)
Ja ez mukszeni fog, de erzed bmafte ugye hogy mennyire favago megoldas?
Lassu, es nem biztonsagos. Nem kerulsz be a webdevelopment hall of fame-be az biztos. Ird meg inkabb PHP-ban ugyanazt amit a cgi csinalt, aztan torold le. Szar Perl.
Kell-e vegul a kigeneralt parancson extra ellenorzeseket vegezni (bar cgi-hivassal kezdodik, ugyhogy valoszinuleg tok mindegy, mit ir be a felhasznalo, legfeljebb "sorry" lesz a vegeredmeny.)
Hat ugy ahogy a manual-ba is leirjak. exec("parancs",$visszatomb); -> $visszatomb-be soronkent a visszaterese a parancs-nak.
exec("ls -l",$tomb);
-> $tomb[0] = '.';
-> $tomb[1] = '..';
stb stb.
Erthetoen csak te nem erted a mukodeset a dolgoknak :) Ahhoz hogy "ugyan oda" keruljon valami ahol a form volt a html-be ahhoz annak a cgi-nek, php-nak akinek a form-ot elkuldted kell kiirnia oda ahova szeretned. Gondolom ez ertheto. Tehat a php-nak kell kiadnia egy olyan oldalt ami ezt megvalositja kiirja azt a html es oda ahova neked kell kiirja erdmeny stb stb.
Masik megoldas esetleg, ha egy iframe-be van ez a form, ami lehet egy tablazatba is, es akkor az iframe-be levo form elkuldi a php-nak ami visszaadja az eredmeny, es visszairja a form-ot is kitoltve. Legegyszerubb ha ezt a ket muveletet 1 php vegzi. Tehat ha nincs get adat akkor kiir form uresen, ha van akkor kiir eredmeny es kitolt form.
Vagy nincs iframe-be a form de van 1 iframe-ed es a form target-jet beallitod eme iframe-re ahol mar csak a php kell hogy kiirja az eredmeny es akkor se a php-n se a html-en nem kell sokat valtoztatni. Egy hatrany, hogy regebbi bongeszok az iframe-t nem tamogatjak.
Van egy mukodo cgi progi. Uj weboldal kerul fele. A meghivo form-nal method="get" + az action a regi cgi-re.
A formot (a regit) egy tablazaton belulre beraktam, igy mukodik ugye, csak a kimenet egy uj oldalon jon fel es teljes egeszeben ua, mint a regi (mi is lenne mas).
A celom, hogy abba a tablazatreszbe keruljon a regi cgi altal visszadobott eredmeny ahova most a formot raktam.
(A regi cgi progibol kiszedem a felesleges tag-eket, marad a csupasz eredmeny.)
A formot at szeretnem adni egy php-nek, ami visszaadja a weboldalt, ugy, hogy a form kitoltve + az eredmeny a fent emlitett tablazatba bekeruljon.
Hogyan lehet a regi cgi-t meghivni es az eredmenyet visszaadni php-vel.
Hát kérlek szépen alássan, hartaiak jól vagyunk, amúgy meg a leckét rendesen feladtad, bár az én tippem Kanada :)
De ez csak egy nagyon gyenge próbálkozás :)