spynode Posted July 1, 2004 Report Share Posted July 1, 2004 Teiksim man ir komentari mysql tabulaa, kur katram komentaaram ir lauks raksta_id. problema (tiesa neesmu parbaudijis, bet vajadzeetu taadai problemai buut) rodas, kad es dzeeshu rakstu (tiiri teoreetiski). Ja es izdzeeshu rakstu, tad tak naakamaa raksta id samazinaas pa 1. Tas noziimee, ka vinjam raadiisies izdzeestaa raksta komentaari (pienjemot, ka neesmu vinjus izdzeesis), un attieciigi katram naakamajam rakstam raadiisies komentaari no raksta, kas agraak bija vinja id vietaa. Kaa juus atrisinaatu shaadu probleemu ? Link to comment Share on other sites More sharing options...
Kaklz Posted July 1, 2004 Report Share Posted July 1, 2004 nekas nekur nesamazinās, nefantazē :D Lieta tāda, ka ja tu izdzēsīsi savu rakstu, tad tie tavi komentāri tā arī paliks karājoties gaisā nevienam rakstam nepiesaistīti. Šādos gadījumos pie saprātīgākām datubāzu pārvaldības sistēmām ir tāda lieta kā cascaded delete vai kā to sauc, kad tiek automātiski dzēsti arī tie ieraksti, kuri ir piesaistīti tavam rakstam. Ar MySQL attiecīgi, ja ir vēlme attīrīt savu datubāzi no šī raksta pilnībā, tad ir vērts pie reizes izdzēst arī visus komentārus ar attiecīgo raksta_id. Link to comment Share on other sites More sharing options...
spynode Posted July 1, 2004 Author Report Share Posted July 1, 2004 tnx ;) .tachu rodas jauna probleema. paradoksaali, bet tas, ka id nemainaas man ttraucee vienai citai saita funkcijai. respektiivi ir izveidota primitiiva saita navigaacija celjoshanai no raksta uz rakstu apmeeram shitaa : $nakam_raksts_id = $rid + 1; // iepr. un nakam. raksts $iepr_raksts_id = $rid - 1; // iepr. un nakam. raksts $nakam_raksts_kverijs = mysql_query ("SELECT virsraksts FROM raksti WHERE id=". $nakam_raksts_id); // iepr. un nakam. raksts $nakam_raksts_nos = mysql_fetch_array ($nakam_raksts_kverijs); // iepr. un nakam. raksts if (mysql_num_rows ($nakam_raksts_kverijs) != 0) // iepr. un nakam. raksts {$nakam_raksts_out = "<a class=\"talak\" style=\"font-size: 18px;\" href=\"index.php?darbs=raksts&id=$nakam_raksts_id\">| $nakam_raksts_nos[0] |→<a>";} // iepr. un nakam. raksts else {$nakam_raksts_out = "";} // iepr. un nakam. raksts $iepr_raksts_kverijs = mysql_query ("SELECT virsraksts FROM raksti WHERE id=". $iepr_raksts_id); // iepr. un nakam. raksts $iepr_raksts_nos = mysql_fetch_array ($iepr_raksts_kverijs); // iepr. un nakam. raksts if (mysql_num_rows ($iepr_raksts_kverijs) != 0) // iepr. un nakam. raksts {$iepr_raksts_out = "<a class=\"talak\" style=\"font-size: 18px;\" href=\"index.php?darbs=raksts&id=$iepr_raksts_id\">←| $iepr_raksts_nos[0] |<a>";} // iepr. un nakam. raksts else {$iepr_raksts_out = "";} Tatad ja es izdzeshu kaadu rakstu par vidu teiksim starp 13. un 15., tad 14 .raksts iztruukst, un atrodoties 15. rakstaa es ar taada tipa navigaacijas palidziibu nevaru nokljuut uz 13., jo skripts domaa, ka vairaak rakstu nav. Kaa vareetu ciiniities ar shaadu probleemu ? Link to comment Share on other sites More sharing options...
Venom Posted July 2, 2004 Report Share Posted July 2, 2004 Nu tad izvēlies no visiem pieejamiem, vienkārši norādot kārtas numuru, e.g.: "SELECT virsraksts FROM raksti LIMIT ".$kartas_numurs.",1" izvéléties visus pieejamos virskrakstus (neatkarīgi no Id), no tiem atgriezt n-to NB: koda profesionalitātes paaugstināšanai/optimizācijai 1) īsāki mainīgo nosaukumi (vēlams līdz 6-8 simb) 1.a) mainīgo nosaukumi angliski, vai vismaz anglificēti (nekad nezini ar kādu vajadzēs apmainīties kodiem, un vispār jāmācas tā anglene). 2) iekš php vērtības 0 un 0.0, "", '', NULL pielīdzināmas false, bet nenulles vērtības (arī -1.2) tiek uzskatītas par true, tāpēc if (mysql_num_rows ($nakam_raksts_kverijs) != 0) vēlams rakstīt kā if (mysql_num_rows ($nakam_raksts_kverijs)) (pirmajā gadījumā tiek izpildīts numr_rows, tā vietā atgriesta vērtība un vērtība salīdzināta ar 0, rezultāts tiek atgriests un novērtēts if-ā; otrajā - tiek atgr. num_rows vērtība un nodota if-am - viena operācija ietaupīta) 3) "<a class=\"talak\" style=\"font-size: 18px;\" href=\"index.php?darbs=raksts&id=$nakam_raksts_id\">| $nakam_raksts_nos[0] |→<a>" tu pats neesi nomocījies addslashojot " iekš ""? vai nav vieglāk '<a class="talak" style="font-size: 18px;" href="index.php?darbs=raksts&id='.$nakam_raksts_id.'">| '.$nakam_raksts_nos[0].' |→<a>' 4) HMLT entītijām jāliek tomēr tas ; beigās, resp. → jāraksta kā → (un tāpat ar visādiem € © utt. es zinu, IE rāda, bet daži citi pārlūki - nē) 5) no šitādām konstrukcijām: if (mysql_num_rows ($iepr_raksts_kverijs) != 0) // iepr. un nakam. raksts {$iepr_raksts_out = "<a class=\"talak\" style=\"font-size: 18px;\" href=\"index.php?darbs=raksts&id=$iepr_raksts_id\">←| $iepr_raksts_nos[0] |<a>";} // iepr. un nakam. raksts else {$iepr_raksts_out = "";} vēlams izvairīties. Šajā gadījumā vissam vieņmēr jābūt ok, bet kad būs vairāki else nosacījumi, var gadīties, ka neviens no tiem neizpildīsies un mainīgais $iepr_raksts_out vispār netiks definēts (es ceru, tev iekš php.ini erro_reporting=E_ALL?). Bet šajā gadījumā es atkal piesiešos liekām operācijām, resp. {} atsviešanai, it īpaši, ja iekš {} ir tikai viens nosacījums $iepr_raksts_out=''; if (mysql_num_rows ($iepr_raksts_kverijs)) $iepr_raksts_out = '<a classs ... /a>'; ir daudz īsāk un novērš to, ka mainīgais var tikt nenodefinēts 6) forums nesaglabā visu koda formatējuma, bet no tā cik saglabā, var saprast, ka viš tev navaid īpaši identots (noformēts ar atsrapēm). Mans ieteikums mācīties taisīt atstarpes, loģiski strukturējot kodu, pie tam vēlams } novietot tieši zem { un tajā atrodošos operācijas novirzīt pa labi ar vismaz 1 atstarpi: if (...) { _$a=1; _if (...) _{ __$b=1; __$c=2; _} } It īpaši šito novērtēsi koda redaktorā, kuram ir funkcija kad {} var "salocīt" ar +/-. Link to comment Share on other sites More sharing options...
Aleksejs Posted July 2, 2004 Report Share Posted July 2, 2004 Nu Venom baigi pacenties :D Respect. Vienīgais, kam negribētu īsti piekrist ir 5-tajā punktā tā lieta par { } atmešanu, ja ir tikai viena rindiņa aiz ifa. Saskatu problēmu tajā, ka: 1) Bieži ir tā, ka sākumā zarā ir tikai viena rindiņa, bet vēlāk vajag pievienot vēl kādu. Tad gadās cīņas karstumā aizmirst ielikt { }. 2) Vieglāk, manuprāt, saprast koda loģiku, ja visi ifi tiek veidoti vienādi, nevis viens vienā veidā, otrs otrā. Tas arī palīdz nākamā minētā punkta - koda loģiskās strukturēšanas - izpildē. Link to comment Share on other sites More sharing options...
Venom Posted July 2, 2004 Report Share Posted July 2, 2004 Bus stops at busstation,Train stops at trainstation, Work stops at... workstation. nice one. Piezīmēm var piekrist, bet tas vairāk ir atkarīgs no pieraduma. Es uzskatu, ka tad kad vajadzēs, tad jau gan par {} neaizmirsis, jo par tādu nepieciešamību tik un tā norāda indentācija (kļūda no tās pašas kategorijas, kā agrāk cīņas karstumā gadījas == vietā = ierakstīt), tā paša indentācija parāda, ka operācija ir augstāknorādā pārbadudījuma izpildījums, turklāt tiek saudzēti pirksti: if () { _ } izmantotās pogu operācijas - i,f,space,shift pieturot,(,),enter,shift pieturot,{,},left arrow,enter,enter,arrow-up, space/tab - kad if () _ ir - i,f,space,shift pieturot,(,),enter, space/tab Link to comment Share on other sites More sharing options...
spynode Posted July 2, 2004 Author Report Share Posted July 2, 2004 (edited) OK nu lekcija par koda kultuuru bija ljoti pamacosha paldies :). Tagad jautaajums par tavu risinaajumu. Cik es saprotu, man vajag parbaudit pec tam vai ir kads mazaks vai lielaks mainigais ieraksta (mysql_fetach_array) no tada tipa kverijijiem. $nentries = mysql_query ("SELECT virsraksts FROM raksti LIMIT ".$rid.",-1" ); $lentries = mysql_query ("SELECT virsraksts FROM raksti LIMIT ".$rid.",1" ); Kada veidaa PHP parbauda vai ir kads lielaks mainigais par doto, un ka varetu apzimet nakamo (vai iepriekshejo) eksistejosho mainigo pec dota (ka vinju definee) ? Aa nu to vai ir es varetu parbaudit elementari $nentry = mysql_fetch_array ($nentries); $lentry = mysql_fetch_array ($lentries); if ($nentry) {un*} if ($lentry) {un*} un* - ?. Ka es varetu panakt, ka ja ir kaads lielaks eksistejosh raksta id par doto (vai mazaaks, tad izvadam to un to, bet ja nav tad to un to... Nu es ceru, ka jus sapratat. Ja ne pacentishos izklaastiit saprotamaak. Edited July 2, 2004 by spynode Link to comment Share on other sites More sharing options...
Aleksejs Posted July 2, 2004 Report Share Posted July 2, 2004 Ja pašreizējais raksta id tev ir $rid, tad tev ir jāpārbauda, cik ierakstus atgriež: $nentries = mysql_query ("SELECT virsraksts FROM raksti LIMIT ".$rid-1.",1" ); un $lentries = mysql_query ("SELECT virsraksts FROM raksti LIMIT ".$rid+1.",1" ); LIMIT [sākot no kura], [cik gab] Link to comment Share on other sites More sharing options...
Venom Posted July 2, 2004 Report Share Posted July 2, 2004 $artcnt=mysql_num_rows(mysql_query("SELECT COUNT(*) FROM raksti")); if ($rid>1) ... ir pirms tam if ($rid<$artcnt) ... ir pēc tam Link to comment Share on other sites More sharing options...
Aleksejs Posted July 2, 2004 Report Share Posted July 2, 2004 Nu fuj, Venom :) Tas vaicājums tak atgriež tikai vienu rindu ;) Link to comment Share on other sites More sharing options...
Venom Posted July 2, 2004 Report Share Posted July 2, 2004 ... trīs pieprasījumu/rinu vietā tālāk rakstu skaitu var izmantot lai izvadīt rakstus pa lapām, ķipa: 1...5 6...10 ... pieņemam, ka lapas nr. tiek nodots caur $_GET['page'], tad: /* nodefinējam lapas nr, ja nav uzstādīts (0), vai nolasām esošo pārvēršot to par integer (ja ņu kādam prātā ienāks adresslauciņā ar rociņām paspēlēties */ $_GET['page']=(empty($_GET['page'])?0:(int)$_GET['page']; /* cik raksti vispār iraid ja raksti tiek pievienoti relatīvi reti, tad iesaku izmantot kešošanu sesijā (of course, ja ir saprašana un tiek izmantoti vēl citur projektā, piem.: if (empty($_SESSION['artcnt'])) $_SESSION['artcnt']=... un tālāk $artcnt vietā izmantojām tieši šo variābli */ $artcnt=mysql_num_rows(mysql_query("SELECT COUNT(*) FROM raksti")); $perpage=10;//cik rakstus rādīt lapā $pages=ceil($artcnt/$perpage); //izvadām to 1..10 for ($tmp=0;$tmp<=$pages;++$tmp) echo ($_GET['page']==$tmp?'›':''). //iezīmējam tekošo lapu ar > ($tmp*perpage+1).' - '. //1,11,21... ( ($tmp+1)*perpage>$artcnt? $artcnt:($tmp+1)*perpage).' '; //10,20 vai, pēdejam - piem. 24 if (empty($_GET['raksta_id'])) - ja neskatāmies konkrētu rakstu, tad atlasām rakstu kopsavilkumus kā "SELECT * FROM raksti LIMIT ".($_GET['page']*$perpage).','.$perpage; //0,10 ; 10,10 ; 20,10 utt. universāli, vecīt Link to comment Share on other sites More sharing options...
Aleksejs Posted July 2, 2004 Report Share Posted July 2, 2004 Bet es vēlreiz atgādinu, ka mysql_num_rows(mysql_query("SELECT COUNT(*) FROM raksti")); atgriež skaitli 1, pie jebkura rakstu skaita. Link to comment Share on other sites More sharing options...
Venom Posted July 2, 2004 Report Share Posted July 2, 2004 ak jā (vienkārši sen darbojos ar pašrakstītu mysql klasi un piemirsu standarta funkcijas), tad no selecta nofetchot abildi (COUNT(*) AS `artcnt`) vai mysql_affected_rows("SELECT `id` FROM tabula"); Link to comment Share on other sites More sharing options...
spynode Posted July 2, 2004 Author Report Share Posted July 2, 2004 (edited) veel man radas shitaada ideja $nentries = mysql_query ("SELECT * FROM raksti WHERE id > ".$rid); $lentries = mysql_query ("SELECT * FROM raksti WHERE id < ".$rid); $nentry = mysql_fetch_array ($nentries); $lentry = mysql_fetch_array ($lentries); $nout = ""; if ($nentry) $nout = "<a class=\"talak\" style=\"font-size: 18px;\" href=\"index.php?darbs=raksts&id=$nentry[0]\">| $nentry[2] |→<a>"; if ($lentry) $lout = "<a class=\"talak\" style=\"font-size: 18px;\" href=\"index.php?darbs=raksts&id=$lentry[0]\">←| $lentry[2] |<a>"; Straadaa tikai vienaa virzienaa, kad meklee nakamo lielako rakstu. Mazakais raksts nezinkapeec vienmeer ir pats mazaakais raksts (peec id) kaads ir datubaazee. Any ideas kapeec taa ? Man shitais variants liekas visvieglakais un pasham visertakais. Varetu pateikt kapec neiet id < ".$rid shitas variants ? Es sapratu, ka man jadabun pedejais ieraksts no $lentries resursa (elementari dooh). Kaa ? Edited July 2, 2004 by spynode Link to comment Share on other sites More sharing options...
bubu Posted July 2, 2004 Report Share Posted July 2, 2004 atlastot datus, tev vajag arī sakārtot tos ierakstus pēc kautkā (ORDER BY ...), jo pliks SELECT negarantē agriežamo ierakstu kautkādu kārtību. Link to comment Share on other sites More sharing options...
Recommended Posts