ezs Posted October 5, 2004 Report Share Posted October 5, 2004 man ir mysql tabula id| neme |pid | --+--------+---+ 1|pēteris | 1 | 2| jānis | 2 | 3| anna | 3 | 6| kārlis | 6 | dati tiek kārtoti pēc pid nevaru izdomāt skriptu kas veidotu bīdīšanas iespēju UP & Down itkā nekam sarežģītam tur nevajadzētu būt var kaut vai šitā <? if($act == "up"){ $query1 = "update $table set pid = $row[pid] where id = ($row[id] - 1)"; $query2 = "update $table set pid = $id - 1 where id = $row[id]"; } #kods ir mazliet greis bet galvenā doma ir saprotama ?> problēma rodas situācijā ja kāds ieraxts trūkst kā tas ir redzams tabulas piemērā (sk. sākumā) tātad ja vēlēšos pacelt 6 ieraxtu uz augšu mans skripts vērsīsies pie 5 ieraksta, bet tāds neeksitē vajadzētu kautkādu ciklu kurš pārbauda vai tāds ieraxts eksitē vai nē, bet tur arī ir mana problēma nevaru idomāt tādu kurš derētu šai situācijāi :( lūdzu ja jums gudrajiem ir kādas idejas palīdziet jau iepriekš pateicos Link to comment Share on other sites More sharing options...
bubu Posted October 5, 2004 Report Share Posted October 5, 2004 (edited) Triviāli! Ja tekošais $id ir tas, kuru vajag pabīdīt uz augšu: $res = mysql_query("SELECT pid FROM tabula WHERE id = $id"); list($ord) = mysql_fetch_row($res); mysql_free_result($res); $res = mysql_query("SELECT id, pid FROM tabula WHERE pid > $ord ORDER BY pid LIMIT 1"); if (mysql_num_rows($res) <> 0) { list($id2, $ord2) = mysql_fetch_row($res); mysql_unbuffered_query("UPDATE tabula SET pid = $ord2 WHERE id = $id"); mysql_unbuffered_query("UPDATE tabula SET pid = $ord WHERE id = $id2"); } mysql_free_result($res); (Jāņem vērā, ka abi UPDATE būtu jānodrošina vienā tranzakcijā, kura tev var būt arī nepieejama atkarībā no MySQL versijas/tabulas tipa) Un analoģiski: ja tekošais ieraksts ir $id, kuru vajag pabīdīt uz leju: $res = mysql_query("SELECT pid FROM tabula WHERE id = $id"); list($ord) = mysql_fetch_row($res); mysql_free_result($res); $res = mysql_query("SELECT id, pid FROM tabula WHERE pid < $ord ORDER BY pid DESC LIMIT 1"); if (mysql_num_rows($res) <> 0) { list($id2, $ord2) = mysql_fetch_row($res); mysql_unbuffered_query("UPDATE tabula SET pid = $ord2 WHERE id = $id"); mysql_unbuffered_query("UPDATE tabula SET pid = $ord WHERE id = $id2"); } mysql_free_result($res); Edited October 5, 2004 by bubu Link to comment Share on other sites More sharing options...
ezs Posted October 5, 2004 Author Report Share Posted October 5, 2004 :( izmantoju tavus piedāvātos variantus bet pilnībā nekas niestājās man liekas ka problēma ir mysql_unbuffered_query jo šo funkciju vispār redzu pirmo reizi Link to comment Share on other sites More sharing options...
bubu Posted October 5, 2004 Report Share Posted October 5, 2004 (edited) Tām unbuffered_query fjām nav ne vainas! Nu tak nevajg 1:1 visu kopēt, paskaties kādas kļūdas atgriež kveriji, tb ieslēdz error_reporting(E_ALL); un izvadi mysql_error(); Neesu gaišreģis, nemāku tev no zila gaisa pateikt, kas nestrādā! Edited October 5, 2004 by bubu Link to comment Share on other sites More sharing options...
рпр Posted October 5, 2004 Report Share Posted October 5, 2004 galvenais ideja, ko bubu piedaavaa. atselektee abus ierakstus, ko tev vajag un peec tam samainu to pid veertiibas. Link to comment Share on other sites More sharing options...
ezs Posted October 5, 2004 Author Report Share Posted October 5, 2004 kautkas tomēr nau netaradu nekur nevienu pašu +vai - kas izdarītu kautkādas darbības :( un ko dara tas list() tipa mauālī lasīju tikuntā neierubuju Link to comment Share on other sites More sharing options...
рпр Posted October 5, 2004 Report Share Posted October 5, 2004 raksti pats no saakuma, ja gribi kautko saprast. ar list piehkjir veertiibas dazjaadiem mainiigajiem no viena masiiva. list($masiivaatsleega, $masiivaveertiiba) = each($masiivs); vai arii list($masiivapirmaiselements, $masiivavaotraiselements) = $masiivs; Link to comment Share on other sites More sharing options...
bubu Posted October 5, 2004 Report Share Posted October 5, 2004 list($a) = $b; ir ekvivalents pieraksts šādam: $a = $b[0]; un list($a,$b) = $c; ir ekvivalents pieraksts šādam $a = $c[0]; $b = $c[1]; Tad kas īsti tev neiet? Kādas kļūdas izmet neteiksi? Link to comment Share on other sites More sharing options...
bubu Posted October 5, 2004 Report Share Posted October 5, 2004 Tikko izdomāju, ka šā vietā: mysql_unbuffered_query("UPDATE tabula SET pid = $ord2 WHERE id = $id"); mysql_unbuffered_query("UPDATE tabula SET pid = $ord WHERE id = $id2"); var rakstīt: $t = $ord + $ord2; mysql_unbuffered_query("UPDATE tabula SET pid = $t - pid WHERE id IN ($id, $id2)"); Link to comment Share on other sites More sharing options...
рпр Posted October 5, 2004 Report Share Posted October 5, 2004 tikai taadaa gadiijumaa tev jaapaarabuda vai ieraksti nav pirmie, lai nesanaak negatiivs vai nulle tas pid. Link to comment Share on other sites More sharing options...
ezs Posted October 5, 2004 Author Report Share Posted October 5, 2004 a Tev pašam tas scripts darbojas? me te cīnās un cīnās bet nekas nesanāk :( izmantoju šādu skriptu: <?php error_reporting(E_ALL); if($act == "up"){ $ress = mysql_query("SELECT poz FROM nav WHERE id ='$id'") or die (mysql_error()); list($ord) = mysql_fetch_row($ress); mysql_free_result($ress); $res = mysql_query("SELECT id, poz FROM nav WHERE poz > $ord ORDER BY poz LIMIT 1") or die (mysql_error()); if (mysql_num_rows($res) <> 0) { $t = $ord + $ord2; mysql_unbuffered_query("UPDATE nav SET pid = $t - poz WHERE id IN ('$id', '$id2')") or die (mysql_error()); } mysql_free_result($res) or die (mysql_error()); echo "tasam UP"; $refer = $_SERVER['HTTP_REFERER']; ?> tasam UP <meta http-equiv="refresh" content="1;URL=<? echo $refer; ?>"> <?php } ?> kautko esmu salaidi s plnīgi greizi :unsure: Link to comment Share on other sites More sharing options...
bubu Posted October 5, 2004 Report Share Posted October 5, 2004 tikai taadaa gadiijumaa tev jaapaarabuda vai ieraksti nav pirmie, lai nesanaak negatiivs vai nulle tas pid. Nav jāpārbauda, jo ja jau ierakts būs pirmais/pēdējais, tad viņam nevarēs atrast ar to ODER BY ... LIMIT 1 blakus esošo ierkastu! Link to comment Share on other sites More sharing options...
bubu Posted October 5, 2004 Report Share Posted October 5, 2004 (edited) a Tev pašam tas scripts darbojas?me te cīnās un cīnās bet nekas nesanāk :( izmantoju šādu skriptu: Nu pag, vispirms pārbaudi vai iet ar tiem diviem unbuffered_query, ja iet, tad tik liec šito otro variantu! Un kāda jēga uz mysql_free_result() tasīt to or die() ??? Man pašam tie pirmējie skriptu, kurus es tev devu strādāja, protams ar drusku citādāku tabulu un kolonnu nosakumiem ;) Tev vispār $id ir inicializēts? Šajā fragmentā vismaz tas nav redzams! Un tu esi asprātis! Šāda koda vietā: list($id2, $ord2) = mysql_fetch_row($res); mysql_unbuffered_query("UPDATE tabula SET pid = $ord2 WHERE id = $id"); mysql_unbuffered_query("UPDATE tabula SET pid = $ord WHERE id = $id2"); esi ielicis: $t = $ord + $ord2; mysql_unbuffered_query("UPDATE nav SET pid = $t - poz WHERE id IN ('$id', '$id2')") or die (mysql_error()); Es tak neteicu to list(...) = ... vākt nost! Es tik divus kverijus kā ar vienu aizvietot parādīju! Kā tu domā cik ir $ord2? Uz šito tak kļūda uzreiz garantēta (vai vismaz notice). Tu kļūdas paziņojumus, ko php tev saka vispār lasi kādreiz? Edited October 5, 2004 by bubu Link to comment Share on other sites More sharing options...
ezs Posted October 5, 2004 Author Report Share Posted October 5, 2004 tagad viss smki strādā tikai vienīgā nelaime ir tā ka tas scripts tasa nevis pa viena up vai down bet ja taizu up 6 ieraxtam uzmet to pašā augšā :( tapēc arī jautāju par to + un - jo tas nekur neparādijās :( kurā vietā būtu jāliek tas +1 vai -1? :unsure: Link to comment Share on other sites More sharing options...
bubu Posted October 5, 2004 Report Share Posted October 5, 2004 Eh būs tev jārāda ar konkrētu piemēru. (Tavu paša doto, piemēram). Pieņemsim, ka ierakstam id=3, tu izsauc pārvietošanu uz augšu (UP). Tātad: $res = mysql_query("SELECT pid FROM tabula WHERE id = $id"); list($ord) = mysql_fetch_row($res); mysql_free_result($res); Ko darīs? Dabūs to p_id iekš mainīgā $ord. Tātad $ord = 3; Pēc tam: $res = mysql_query("SELECT id, pid FROM tabula WHERE pid > $ord ORDER BY pid LIMIT 1"); Ko darīs? Dabūs id un pid ierakstam, kura pid ir nākamais pēc kārtas nekā $ord, tātad to, kuram pid=6, tātad tagad $id2=6 un $ord2=6. Un nākamie divi kveriji dara to, ka $id ierakstam pieškir pid = $pid2 un $id2 ieraksta piešķir pid=$pid, tātad apmaina tos pid vietām. Manuprāt ļoti pareizi. Analoģiski darbojās arī uz leju pārvietošana. Starp citu, man tie augšā/lejā virzieni ir otrādi. Man tur bija laikam prioritātes. Pārvietot uz augšu nozīmēja palielināt prioritāti - pid (tātad ORDER BY secībā uz leju), bet browserī es visu atselektēju ORDER BY .. DESC, tātad attēlojot man viņš 'kustējās' uz augšu. Nezinu vai skaidrāk kļuva, bet nu darboties tas viss darbojās, ka tik pašam tev nau kāds cits bags ieviesies. Link to comment Share on other sites More sharing options...
Recommended Posts