PHP Center
http://phpcenter.eu/
Foorumi teema printimine


Foorumid Programmeerimine PHP & MySQL Listi väärtuse alla/üles liigutamine sortimiseks
Autor Postitus
koger

Postitusi: 229
Tase: 5
Olek: Offline

11.01.2005 11:58:23
Listi väärtuse alla/üles liigutamine sortimiseks

Tere,

hakkasin admin paneeli tegema ühele lehele, kuid jäin hätta kohas, kus menüü ja vaja jaotusi või ütleme ridasi üles ja alla liigutada.
Tegemist siis süsteemiga kus väärtused võetakse MySQL-ist. Kõik tundus kena, kui tuli idee, et kui keegi vajutab lingile et see rida liigutada üles, siis süsteem võtab selle rea "ID" andmebaasi tabelist ja lisab sellele ühe juurde või võtab ühe vähemaks vastavalt sorteerimis järjekorrale ja uuendab ID lahtrit MySQL-is. Selle toimingu juures peab siis sorteerimine käima lahtri ID järgi ja vastavalt kas kasvavas või kahanevas järjekorras.
Kuid see tekitab probleeme, sest paljud read võivad nüüd olla sama ID väärtusega, sest lisades on kõik read saanud järjest "auto_increment" abil ID väärtuse.
Et kõik toimiks siis kui muutes ühe rea ID väärtust, muudetaks kõigi olemasolevate ridade ID väärtusi, suurte andmebaaside puhul koormab see aga serverit.

Kas on ideid?

bluefish
Tige Kala

Postitusi: 843
Tase: 8
Olek: Offline

11.01.2005 12:48:26
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Siin kirjutasin natuke kuidas asja teha http://php.center.ee/vaatafoorumiteemat.php?id=5436
Ja id järgi ei ole mõtet nüüd küll sortida, selle jaoks peaks olema ikka eraldi veerg.

muidumeez
Ignorantia non est
argumentum

Postitusi: 3864
Tase: Administraator
Olek: Offline

11.01.2005 13:17:12
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Samuti võiks kasutada otsingut. Vaata ka http://php.center.ee/vaatafoorumiteemat.php?id=5385

koger

Postitusi: 229
Tase: 5
Olek: Offline

11.01.2005 16:29:01
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Need juba nähtud, bluefishi pakutud link on peaaegu et sobiv, kuigi seal on mingi poolik näide, mis vajaks pigem algusest peale ümber kirjutamist, probleeme tekitas liigendamata ja kommenteerimata kood, mul viskas küll silme eest kirjuks...
mudumeez pakkus välja oma funktsiooni, kuid sama ka siin, võtab silme eest kirjuks, mingil määral küll liigentatud aga siiski kommenteerimata ja tundub et seal funktsioonis ka palju asju, mis minu jaoks oleks üleliigsed.

Ma ei taha olla selline viriseja ja te võite öelda et kui ei sobi siis tee ise parem jne, aga minu idee oleks siiski see et saaks korraliku ja arusaadava koodiga valmis, mida hiljem kasvõi õpetustesse postitada...

Selles suhtes ma usun et mõistlik oleks hakata esimest koodi lahkama, kuna teine on liiga suur ja ülepaisutatud...

Toon siin ära q2boy loomingu: (ise muutes seda natukene, loodan et ta ei pahanda)

PHP kood:


// siin kohas on loodud ühendus juba MySQL-iga ja on kõik teised scriptid ja sisu mis meid ei puuduta hetkel
// script algab (rea üles liigutamiseks)

$meny array(); // määrame muutujaks array()
$count 0// määrame muutuja väärtuseks 0

$pagequery mysql_query("SELECT * FROM meny ORDER BY str"); // päring andmebaasist
     
while($data mysql_fetch_array($pagequery)) // lihtsustame päringut muutujate saamiseks
     
{
          
$meny[] = $data// viime päringu tulemused array()-sse
          
$count++; // suurendame muutujat ühe võrra (algselt oli 0)
     
}

// $pagequery = mysql_query("delete from meny"); - selle rea kommenteerisin välja

$gcount $_GET['count']; // kuskilt saadakse GET abil mingi väärtus muutujale gcount - jääb mulle arusaamatuks
$massiiv $meny[$gcount]; // määratakse muutujale väärtuseks array()-st tulenev väärtus, mis on sama gcount-iga

$meny[$gcount] = $meny[$gcount+1]; // väärtusele liidetakse juurde 1
$meny[$gcount+1] = $massiiv// määratakse uuesti muutuja

for($i 0$i count($meny); $i++) 
// tsükkel, mille jooksul count($menu) peab olema suurem kui 0 ja muutujale i liidetakse juurde 1
     
$uuendamine mysql_query("UPDATE meny SET id='".addslashes($meny[$i][0])."',nimi='".addslashes($meny[$i][1])."',str='".addslashes($meny[$i][2])."'"); // uuendame tabelis "meny" id, nimi, str lahtrit
          
if (!$result2) { // kui päring ei funka
               
die('Invalid query: ' mysql_error()); // viga
          
} else {}
}

mysql_query("OPTIMIZE TABLE meny"); // optimiseerime tabelit

print 'Menüü järjekord on muudetud'// väljastame tulemuse
break; 



MySQL-is näeb tabel "meny" välja selline, et seal on lahtrid "id" mis on int ja auto_increment ning index, "nimi" mis on varchar(50) ja "str" mis on samuti int ja auto_increment ilmselt.
Sorteerimine käib lahtri "str" järgi kasvavas järjekorras.

Nonii, see oli kõik mida minu pea välja mõtles, äkki saate täiendada/parandada mis väga mööda...

bluefish
Tige Kala

Postitusi: 843
Tase: 8
Olek: Offline

11.01.2005 17:07:35
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Mööda on see, et mis mõttega sa tervet baasi uuendad iga liigutamise peale? Kui on vähe andmeid siis ei teki probleeme aga mõtle mis siis saab kui baasis on sadu või tuhandeid ridasid?

Nagu sealt minu poolt antud lingist leida võis, siis ainuke asi mis sul on vaja teada, on liigutatava elemendi id ja järjekorra nr ning järgmise või eelmise elemendi id ja nr, vastavalt siis sellele mis suunas liigutamine toimub.

Lisaks ei toimi sul see update käsk sellisel kujul. Antud olukorras uuendatakse igal tsükli läbimisel kõik tabeli read. Ning auto_incrment ja index väli ei ole mõeldud selleks, et neid käsitsi muuta. Kasuta järjekorra määramiseks mõnda teist veergu.

eero

Postitusi: 890
Tase: 8
Olek: Offline

11.01.2005 17:17:57
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Asja loogika võib ju ka lihtsam olla:
INT tüüpi veerg 'list', milles igal real on erinev number (kui just ei ole tegu astmelise menüüga). Loed kogu veeru massiivi, võtad hetkenumbri ning vahetad selle ära eelmise/järgmisega nimekirjas.
Üks minu enda funktsioon sellise muudatuse tegemiseks, sees on küll mõningaid lisafunktsioone, kuid põhimõte tuleb välja (lisasin paar kommentaari ning lühendasin pisut - funktsioon on originaalis mõeldud lõpmatult astmetega menüüle):
PHP kood:

function upd_page_list($id$dir) { // lehe ID, liigutamise suund
         // $array - massiiv järjekorrasnumbritega
         // $list - tolle ID praegune koht järjekorras
         
sort($array);
         
$key array_search($list$array);
         
// db_select - veerg, tabel, WHERE; väljastab kahemõõtmelise massiivi tulemustega
         // db_update - tabel, massiiv muudatustega, WHERE
         
if ($dir == 'up') {
                  
$res db_select('id''pages''list='.$array[$key 1]);
                  
db_update('pages'array('list' => $array[$key 1]), 'id='.$id);
                  
db_update('pages'array('list' => $list), 'id='.$res[0]['id']);
         }
         elseif (
$dir == 'down') {
                  
$res db_select('id''pages''list='.$array[$key 1]);
                  
db_update('pages'array('list' => $array[$key 1]), 'id='.$id);
                  
db_update('pages'array('list' => $list), 'id='.$res[0]['id']);
         }
}

PS. Eelmise koodi kommentaarid olid pisut naljakad... ('lihtsustame päringut muutujate saamiseks' etc)

koger

Postitusi: 229
Tase: 5
Olek: Offline

12.01.2005 11:43:04
RE: Listi väärtuse alla/üles liigutamine sortimiseks

tänud eero, seda mul just vaja olekski, kuid mis jäi veel arusaamatuks on muutuja $list, et kus süsteem selle väärtuse omastab ning muutuja $id on siis liigutatava rea ID eks (sul kirjas lehe ID)...
kuid muidu väga hea loogika ;)

uugu21

Postitusi: 380
Tase: 6
Olek: Offline

12.01.2005 12:48:17
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Ma ei saa aru, miks peab igat asja kümneid kordi läbi nämmutama... Bluefish viitas siin ühele eelmisele teemale, kus ta oli nimetet probleemilahenduse väga korralikult lahti kirjutanud:
Tsiteeritud tekst:
Üles liigutamisel:
1. Küsid tabelist liigutatava menüüpunkti järjekorranumbri. Loed näiteks muutujasse $curr_nr
2. Küsid tabelist kõik menüüpunktid kus järjekorranr. on väiksem kui selle mida liigutada tahad. Sorteerid tulemuse kahanevas järjekorras ning võtad tulemusest esimese rea. Nii saad kätte järjekorras eelmise menüüpunkti. Kui nr puudub, on tegemist esimese elemendiga ning siit edasi ei tee enam midagi.
3. Võtad selle menüüpunkti järjekorranr. Loed selle näiteks muutujasse $prev_nr
4. Kirjutad liigutatava punkti järjekorranr-ks eelmise punkti järjekorranr. ($prev_nr) ning eelmise punkti järjekorranr. asmele kirjutad liigutatava punkti järjekorranr ($curr_nr)

Minu soovitus - võta nüüd see jutt ette ning kirjuta punkt-punkti haaval php kood taha. Kui siis nüüd ka veel hätta jääd saad juba konkreetse punkti kohta abi küsida.

koger

Postitusi: 229
Tase: 5
Olek: Offline

12.01.2005 14:07:59
RE: Listi väärtuse alla/üles liigutamine sortimiseks

no kood on olemas, miks ma peaks hakkama teist koodi kasutama, aga ma proovin läbi teha jah, äkki saab sellest ka asja...

PHP kood:


// muutuja $id saadakse aadressiribalt, eelnevalt lingile vajutades, tegemist siis liigutatava rea ID-ga
// tabelis on lahter 'sort' mille järgi käib sorteerimine

$res1 mysql_query("SELECT * FROM tabel WHERE (id='$id')"); // päring tabelist sort.nr. saamiseks
    
if (!$res1) { // kui päring ei toiminud
        
die('Invalid query: ' mysql_error()); // viga
    
} else { // kui toimis
        
while ($r mysql_fetch_array($res1)) 
        {
            
$curr_nr $r["sort"]; // liigutatava rea nr
        
}
    }

$res2 mysql_query("SELECT * FROM tabel WHERE (sort < $curr_nr) ORDER BY sort DESC LIMIT 1"); // päring tabelist, kus sort numbrid on väiksemad kui liigutataval
$mitu_tulemust mysql_num_rows($res2); // loeme kokku, mitu tulemust saadi
    
if ($mitu_tulemust=="0") {
        
// die("tegemist on esimese elemendiga ning siit edasi ei tee enam midagi");
    
} else {
        if (!
$res2) { // kui päring ei toiminud
            
die('Invalid query: ' mysql_error()); // viga
        
} else { // kui toimis
            
while ($r mysql_fetch_array($res2)) 
            {
                
$prev_nr $r["sort"]; // eelmise rea nr
                
$prev_id $r["id"]; // eelmise rea id
            
}
        }
    }

$res mysql_query("UPDATE tabel SET sort='$prev_nr' WHERE (id='$id')"); // uuendame tabelis rida, mida pidi liigutama
    
if (!$res) { // kui päring ei funka
        
die('Invalid query: ' mysql_error()); // viga
    
} else {
        
$res mysql_query("UPDATE tabel SET sort='$curr_nr' WHERE (id='$prev_id')"); // uuendame tabelis eelmist rida
            
if (!$res) { // kui päring ei funka
                
die('Invalid query: ' mysql_error()); // viga
            
}  else {
                
// print 'Kõik töötab, rida liigutatud';
            
}
    }



Midagi taolist peaks vist olema, või mis? Endale tekitab kahtlusi päringus see osa, kus: WHERE (sort < $curr_nr)
Sest ma ei mäleta kas MySQL-is sai linnukestega näidata suurenemist ja vähenemist, aga muu peaks vist olema kõik õige...

Aga siiski, see eero kood tundus parem, kuigi ma ei tea kas ka on parem... sest seal pole vist kontrolli...

uugu21

Postitusi: 380
Tase: 6
Olek: Offline

12.01.2005 16:06:33
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Tsiteeritud tekst:
no kood on olemas, miks ma peaks hakkama teist koodi kasutama, aga ma proovin läbi teha jah, äkki saab sellest ka asja...

Aga justnimelt selleks, et sa suudaksid ise koodi kribada ning teiste kirjutatud koodist aru saada.
Niisiis:
1. Liigutatava järjekorra number
Sa oled sql päringud liiga 'lahti' kirjutanud. Samuti pole mõtet kõiki lahtreid küsida, kui kasutad vaid ühte. Ning eeldades, et sort väli on ikka numbriline, pole talle ka jutumärke vaja.
PHP kood:

$res1 mysql_query('SELECT sort FROM tabel WHERE id='.$id)
or die(
'mingi jama');


2. 'Kõrvalseisja' leidmine
Siia võiksid kõigepealt sisse kirjutada loogika, kas nihutamine toimub ette- või tahapoole. Vastavalt sellele tuleb muuta ka päringut (suurem või väiksem ning ASC või DESC).
Edasi - mysql_num_rows ära (antud juhul) kasuta, kontrolli parem hiljem prev_nr (või prev_id) on väärtustatud või mitte. Tõsine viga on: if($mitu_tulemust=="0"). MITTE IIAL ÄRGE PANGE NUMBRIT JUTUMÄRKIDESSE. Tulemus on ettearvamatu.
3. Andmete uuendamine
Taaskord see eelnev jutt - numbrilistel väärtustel jutumärgid ära ning kood pisut lihtsamaks.

Polnudki nii raske, eksole. Lõpetuseks võiksid selle koodi veel funktsiooniks kirjutada, mida saad hiljem välja kutsuda stiilis: LiigutaJrk($id, 'ette')

Edu

eero

Postitusi: 890
Tase: 8
Olek: Offline

12.01.2005 17:07:51
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Tsiteeritud tekst:
Tõsine viga on: if($mitu_tulemust=="0"). MITTE IIAL ÄRGE PANGE NUMBRIT JUTUMÄRKIDESSE. Tulemus on ettearvamatu.
Niikaua, kui kasutada tavalist võrdlemist (kaks võrdusmärki, ==), ei ole vahet, kas võrreldav on jutumärkides või mitte. 3 == "3" annab täiesti tõese tulemuse.
Vahe tekib aga siis, kui võrrelda kolme võrdusmärgiga, st kontrollitakse ka võrreldavate tüüpi (integer, string). 3 === "3" tulemus on negatiivne.

uugu21

Postitusi: 380
Tase: 6
Olek: Offline

12.01.2005 18:44:43
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Hakkab pihta... :-)
On vahe, ja see vahe on väga suur. "0" ei ole number (integer) 0, vaid on ASCII märk nr. 48 (string). Kuigi php mootor annab üldjuhul oodatud tulemuse, ei ole see hea programmeerimine.
Vastu ma küsiks siis, et mille kuradi pärast ma pean <table> <body> jne tag'e sulgema kui browser näitab ka ilma nendeta lehte...
Kui on võimalik asi ära teha õieti ja hästi siis kasuta seda võimalust.

Illustreerimiseks panen väikse koodijupi - tegemist küll ei ole üheselt selle probleemiga, aga peaks 'feelingu' kätte andma küll:
PHP kood:

<?
$asi 2/3;
if(
$asi == "$asi")
    echo 
'võrdsed';
else
    echo 
'sae pekki, laulurästas';
?>



koger

Postitusi: 229
Tase: 5
Olek: Offline

12.01.2005 18:45:49
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Üks küsimus: Et kas see nagu on halb kui kirjutada päringud liiga lahti, teeb see midagi aeglasemaks vms? Või on see lihtsalt enda mugavus, et vähem teksti ja vähem kirjutamist...

Ning teinegi: Et mis erinevus on peale päringut mysql_num_rows()-i kasutamisel ja hiljem $prev_nr väärtustamise kontrollimisel? Et nagu mina valisin esimese variandi, aga miks teine parem on, et kas asi stiilis või mõjutab konkreetselt tulemuste õigsust?

eero-l õigus, ma olen varemgi kasutanud numbrit jutumärkide sees, nagu samas olukorras, aga tulemus on alati õige olnud, võib-olla asi stiilis aga otseselt see küll tulemusi ei mõjuta, kõik toimib... siin tuleb mängu see "algaja ja professionaalne php progreja" erinevus...

funktsiooni koha pealt nii palju, et juba tegutsen selle kallal, et kogu värk funktiooni saada.

Tänud abi eest rahvas!

uugu21

Postitusi: 380
Tase: 6
Olek: Offline

12.01.2005 18:53:51
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Näeh, krt, inimene on ikka ekslik loom. Lause pidi olema tegelikult hoopis: mysql_num_rows ära kasuta (antud juhul küll võib). Teema selles, et mõningate päringutega on num_rows > 0 ka tegelikult tühja vastuse korral. Tavalise SELECT'i puhul töötab.

See lahtikirjutamine on jah rohkem mugavuse asi. Eks ta mingil määral mõjutab ka kiirust aga see on mingi nanosekund-tüüpi teema (ehk siis pole oluline).

eero

Postitusi: 890
Tase: 8
Olek: Offline

12.01.2005 18:55:00
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Tsiteeritud tekst:
On vahe, ja see vahe on väga suur. "0" ei ole number (integer) 0, vaid on ASCII märk nr. 48 (string). Kuigi php mootor annab üldjuhul oodatud tulemuse, ei ole see hea programmeerimine.
Nõustun täielikult, kuid "ilus kood" ei olnud hetkel küsimus. PHP funktsioonid, mille tulemuseks on numbriline väärtus (hetkel mõtlen täisarve), väljastavad alati oma tulemuse integerina ning nii peaks ka neid võrdlema (näiteks siis kõnealune mysql_num_rows()). Kuid minu postituse point oli siiski vaid kontrolli õigsus, mitte PHP standarditele vastavus.



koger

Postitusi: 229
Tase: 5
Olek: Offline

26.03.2005 14:23:31
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Pöördun tagasi vana teema juurde. Sain tööle kuidagimoodi ridade liigutamise, kuid probleem on nüüd veel selles, et pole määratud piire. Ehk siis saab liigutada esimest rida ettepoole ja viimast rida tahapoole jne. See aga omakorda keerab kogu süsteemi sassi, muutes andmebaasis osad väärtused nullideks jne.
Äkki keegi saab anda ideid või vihjeid, kuidas saada teada, kas üldse alustada rea liigutamisega, et ega viimast rida ei soovita liigutada allapoole või esimest rida ettepoole, või üldse mis kontroll teha, et süsteemi ei saaks dumb-user ära rikkuda.
Üritasin eemaldada ka vead või iluvead mida siin eelnevalt mainiti.
PHP kood:


/**
 * @param $tabel string
 * @param $suund string
 * @param $curr_id int 
 * @param $lahter string
 * @desc Funktsioon, mis vahetab MySQL-is kahe rea väärtused sort tulbas, kutsutakse välja näiteks nii: liiguta($prefix.'_lehed', 'up', $_GET["m1"], 'id');
 */
function liiguta($tabel$suund$curr_id$lahter) {
    
$e1 mysql_query('SELECT sort FROM '.$tabel.' WHERE '.$lahter.'='.$curr_id) or die('Invalid query: '.mysql_error());
        while (
$r mysql_fetch_array($e1))
        {
            
$curr_nr $r['sort']; // liigutatava rea nr
        
}
                
mysql_free_result($e1);

        if (
$suund=="up") { // liigutatakse üles
            
$e2 mysql_query('SELECT '.$lahter.',sort FROM '.$tabel.' WHERE (sort < '.$curr_nr.') ORDER BY sort DESC LIMIT 1') or die('Invalid query: '.mysql_error());
            
$mitu_tulemust mysql_num_rows($e2); // loeme kokku, mitu tulemust saadi
        
} else { // kui soovitakse liigutada allapoole
            
$e2 mysql_query('SELECT '.$lahter.',sort FROM '.$tabel.' WHERE (sort > '.$curr_nr.') ORDER BY sort ASC LIMIT 1') or die('Invalid query: '.mysql_error());
            
$mitu_tulemust mysql_num_rows($e2); // loeme kokku, mitu tulemust saadi
        
}
    
        if (
$mitu_tulemust==0) {
                     
// tegemist on esimese elemendiga ning siit edasi ei tee enam midagi
        
} else {
            while (
$r mysql_fetch_array($e2))
            {
                
$prev_nr $r['sort']; // eelmise rea nr
                
$prev_id $r[$lahter]; // eelmise rea id
            
}
                        
mysql_free_result($e2);
        }

    
mysql_query('UPDATE '.$tabel.' SET sort="'.$prev_nr.'" WHERE '.$lahter.'='.$curr_id) or die('Invalid query: '.mysql_error()); // praeguse lahtri nr vahetame eelmise lahtri omaks
    
mysql_query('UPDATE '.$tabel.' SET sort="'.$curr_nr.'" WHERE '.$lahter.'='.$prev_id) or die('Invalid query: '.mysql_error()); // eelmise lahtri nr vahetame praeguse lahtri omaks
}



eero

Postitusi: 890
Tase: 8
Olek: Offline

26.03.2005 16:12:48
RE: Listi väärtuse alla/üles liigutamine sortimiseks

No asja annab teha kõvasti lihtsamalt:
PHP kood:

$list $mysql->one_dim('SELECT id,list FROM pages ORDER BY list'array('list' => 'id'));
// $mysql->one_dim - üks databaasi abifunk., väljastab ühemõõtmelise massiivi sellisel kujul, nagu määratud teise parameetriga
//         antud juhul siis massiiv, kus võtmeks 'list' ja väärtuseks 'id'; nt:
//         array(2 => 1, 3 => 2, 1 => 3) etc
$keys array_keys($list);
$now array_search($res['list'], $keys);
// $res['list'] - praeguse valitud ID 'list'-väärtus
// $keys massiivi sissetoomine on vajalik selleks, et saaks väärtused lihtsalt 'ära vahetada', st 'list' väärtused ei pea olema järjestikkused arvud
if ($actions['down'] == $_GET['aid'] and $res['list'] != max($keys)) {
        
$mysql->update('pages'array('list' => $keys[$now 1]), 'id='.$res['id']);
        
$mysql->update('pages'array('list' => $res['list']), 'id='.$list[$keys[$now 1]]);
}
elseif (
$actions['up'] == $_GET['aid'] and $res['list'] != min($keys)) {
        
$mysql->update('pages'array('list' => $keys[$now 1]), 'id='.$res['id']);
        
$mysql->update('pages'array('list' => $res['list']), 'id='.$list[$keys[$now 1]]);
}
// $mysql->update('tabeli_nimi', 'massiiv_muudatustega (väli => uus väärtus)', 'WHERE-klausel')



koger

Postitusi: 229
Tase: 5
Olek: Offline

26.03.2005 17:30:23
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Tsiteeritud tekst:
No asja annab teha kõvasti lihtsamalt:
PHP kood:

$list $mysql->one_dim('SELECT id,list FROM pages ORDER BY list'array('list' => 'id'));
// $mysql->one_dim - üks databaasi abifunk., väljastab ühemõõtmelise massiivi sellisel kujul, nagu määratud teise parameetriga
//         antud juhul siis massiiv, kus võtmeks 'list' ja väärtuseks 'id'; nt:
//         array(2 => 1, 3 => 2, 1 => 3) etc
$keys array_keys($list);
$now array_search($res['list'], $keys);
// $res['list'] - praeguse valitud ID 'list'-väärtus
// $keys massiivi sissetoomine on vajalik selleks, et saaks väärtused lihtsalt 'ära vahetada', st 'list' väärtused ei pea olema järjestikkused arvud
if ($actions['down'] == $_GET['aid'] and $res['list'] != max($keys)) {
        
$mysql->update('pages'array('list' => $keys[$now 1]), 'id='.$res['id']);
        
$mysql->update('pages'array('list' => $res['list']), 'id='.$list[$keys[$now 1]]);
}
elseif (
$actions['up'] == $_GET['aid'] and $res['list'] != min($keys)) {
        
$mysql->update('pages'array('list' => $keys[$now 1]), 'id='.$res['id']);
        
$mysql->update('pages'array('list' => $res['list']), 'id='.$list[$keys[$now 1]]);
}
// $mysql->update('tabeli_nimi', 'massiiv_muudatustega (väli => uus väärtus)', 'WHERE-klausel')



Üldiselt oleks enda tehtud scriptid ikka paremad (mitte toimimise poolest, vaid põhimõtte), aga kui sa lubad seda koodijuppi näiteks kasutada mootoris, mida ma hakkan ärilistel eesmärkidel kasutama, siis suured tänud, aga siin tulebki küsimus, et kas lubad? :D
Ahjaa, veel see asi ka, et kas selles sinu koodis siis dumb-user ei saa esimest väärtust ettepoole liigutada vms? Vist ei saa, kuna tegemist massiiviga eks?

eero

Postitusi: 890
Tase: 8
Olek: Offline

26.03.2005 17:43:58
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Tsiteeritud tekst:
Üldiselt oleks enda tehtud scriptid ikka paremad (mitte toimimise poolest, vaid põhimõtte), aga kui sa lubad seda koodijuppi näiteks kasutada mootoris, mida ma hakkan ärilistel eesmärkidel kasutama, siis suured tänud, aga siin tulebki küsimus, et kas lubad?
No nii pisikese koodijupi (või pigem isegi õpetava suuna) pärast ma nüüd küll võitlema ei hakka. Seega, kasuta-kasuta...
Tsiteeritud tekst:
Ahjaa, veel see asi ka, et kas selles sinu koodis siis dumb-user ei saa esimest väärtust ettepoole liigutada vms? Vist ei saa, kuna tegemist massiiviga eks?
Selle jaoks on järgmised kontrollid nendes IF-lausetes:
PHP kood:

$res['list'] != max($keys)
// liigutamisel alla
$res['list'] != min($keys)
// liigutamisel üles



koger

Postitusi: 229
Tase: 5
Olek: Offline

27.03.2005 01:28:05
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Ahjaa... On küll tõesti :D
Tänud, tänud :)

Aga võõras kood ikka võõras kood, ma ei saanud osadest asjadest aru, nii et fantaseerisin, kommenteerisin koodi ja muutsin oma süsteemi järgi väheke, kisub ikka pikemaks...
Vabandust et nii palju nõuan, aga tahaks saada asja tööle korralikult [:hmmm:]
PHP kood:

/**
* $curr_id on liigutatava rea id,
* $lahter on id veerg, mis on hetkel erinevatel tabelitel erinev,
* $tabel on tabeli nimi ja
* $suund on liigutamise suund
*/
function liiguta($tabel$suund$curr_id$lahter) {
    
$e0 mysql_query('SELECT sort FROM '.$tabel.' WHERE '.$lahter.'='.$curr_id.' ORDER BY sort');
    
$res mysql_fetch_array($e0); // see vajalik, et omistada väärtus muutujale $res['sort'];
        
    
$e1 mysql_query('SELECT '.$lahter.',sort FROM '.$tabel.' ORDER BY sort');
    while (
$r mysql_fetch_array($e1)) {
        
$muutuja .= $r["sort"].' => '.$r[$lahter].', '// see koht on väga kahtlane, ei oska ette kujutada, mis moodi sul see mysql-i klass sama asja teeb
    
}
        
    
$keys array_keys(array($muutuja));
    
$now array_search($res['sort'], $keys);

        if (
$suund=="down" && $res['sort'] != max($keys)) { // see ka kahtlane, sinu versioon $actions['down'] == $_GET['aid'] oli mõistmatu, et mis massiiv see on ja mis muutuja aid
            
mysql_query('UPDATE '.$tabel.' SET sort='.$keys[$now 1].' WHERE id='.$curr_id);
            
mysql_query('UPDATE '.$tabel.' SET sort='.$res['sort'].' WHERE id='.$muutuja[$keys[$now 1]]);
        } 
// viimane where klausel tekitas ka kahtlusi
        
elseif ($suund=="up" && $res['sort'] != min($keys)) {
            
mysql_query('UPDATE '.$tabel.' SET sort='.$keys[$now 1].' WHERE id='.$curr_id);
            
mysql_query('UPDATE '.$tabel.' SET sort='.$res['sort'].' WHERE id='.$muutuja[$keys[$now 1]]);
        }
}



eero

Postitusi: 890
Tase: 8
Olek: Offline

27.03.2005 09:57:22
RE: Listi väärtuse alla/üles liigutamine sortimiseks

PHP kood:

function liiguta($tabel$suund$curr_id$lahter) { 
    
$e0 mysql_query('SELECT sort FROM '.$tabel.' WHERE '.$lahter.'='.$curr_id); 
    
$res mysql_fetch_row($e0); // kuna vaja ainult ühte rida

    
$e1 mysql_query('SELECT '.$lahter.',sort FROM '.$tabel.' ORDER BY sort'); 
    
$muutuja array();
    while (
$r mysql_fetch_array($e1)) { 
        
$muutuja[$r['sort']] = $r[$lahter];
        
// tekib massiiv: võtmeks sort, väärtuseks $lahter (ID)
    

         
    
$keys array_keys($muutuja); 
    
$now array_search($res[0], $keys); 

    if (
$suund == 'down' and $res[0] != max($keys)) { 
        
// $actions['down'] == $_GET['aid'] -> CMS-sisene süsteem, aid = actionID; põhimõte sama mis sinu $suund = 'suund'
        
mysql_query('UPDATE '.$tabel.' SET sort='.$keys[$now 1].' WHERE id='.$curr_id); 
        
mysql_query('UPDATE '.$tabel.' SET sort='.$res[0].' WHERE id='.$muutuja[$keys[$now 1]]);
        
// WHERE-klausel näitab tolle rea ID'd, mille listi väärtust muudetakse; 
        // järgmise võtme väärtusega number antakse muudetavale reale
        // muudetava rea väärtus antakse aga järgmise võtme taga peituvale reale
        // kõige lihtsam -> tee print_r kõikidele massiividele ja saad siis pointist aru...
    
}
    elseif (
$suund == 'up' and $res[0] != min($keys)) { 
        
mysql_query('UPDATE '.$tabel.' SET sort='.$keys[$now 1].' WHERE id='.$curr_id); 
        
mysql_query('UPDATE '.$tabel.' SET sort='.$res[0].' WHERE id='.$muutuja[$keys[$now 1]]); 
    }
    
// kui tahad toda $lahter-varianti kasutada, siis WHERE klauslites pead väljanime 'id' ära vahetama $lahter väärtusega
    // üldse oleks sul vist pisut lihtsam, kui MySQL'iga suhtlemiseks mõne abifunktsiooni / class'i kirjutaksid
}



koger

Postitusi: 229
Tase: 5
Olek: Offline

27.03.2005 14:41:30
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Aitäh, sain kõik ilusti tööle ja teen ka kõik tasapisi klassi peale, see MySQL-iga suhtelmise osa, nii lihtsam tõesti.