PHP Centeri avaleht Skriptikogu Küsimuste-vastuste leht Teadete vaatamine ja saatmine Foorum - koht küsimiseks Otsingumootor Siit saad infot meie kohta

Kasutajanimi:  
  Parool: 
  Registreeri!   Unustasid salasõna?

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

Kokku on 22 postitust, jaotatud 2 leheküljele: 1-2. Praegu näidatakse postitused 16-22.

Autor Abi Postitus Abi

koger


Postitusi: 229
Tase: 5
Olek: Offline

Hinnang: Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10
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
}



26.03.2005 14:23:31 Vajutades siia näed kasutaja koger profiili

eero


Postitusi: 890
Tase: 8
Olek: Offline

Hinnang: Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10
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')



___________________________________________________
This foreign policy stuff is a little frustrating! - George W. Bush

26.03.2005 16:12:48 Vajutades siia näed kasutaja eero profiili

koger


Postitusi: 229
Tase: 5
Olek: Offline

Hinnang: Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10
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?
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?

26.03.2005 17:30:23 Vajutades siia näed kasutaja koger profiili

eero


Postitusi: 890
Tase: 8
Olek: Offline

Hinnang: Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10
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



___________________________________________________
This foreign policy stuff is a little frustrating! - George W. Bush

26.03.2005 17:43:58 Vajutades siia näed kasutaja eero profiili

koger


Postitusi: 229
Tase: 5
Olek: Offline

Hinnang: Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10
RE: Listi väärtuse alla/üles liigutamine sortimiseks

Ahjaa... On küll tõesti
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
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]]);
        }
}



27.03.2005 01:28:05 Vajutades siia näed kasutaja koger profiili

eero


Postitusi: 890
Tase: 8
Olek: Offline

Hinnang: Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10Administratiivhinnang: 9/10
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
}



___________________________________________________
This foreign policy stuff is a little frustrating! - George W. Bush

27.03.2005 09:57:22 Vajutades siia näed kasutaja eero profiili

koger


Postitusi: 229
Tase: 5
Olek: Offline

Hinnang: Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10Administratiivhinnang: 5/10
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.

27.03.2005 14:41:30 Vajutades siia näed kasutaja koger profiili

Kokku on 22 postitust, jaotatud 2 leheküljele: 1-2. Praegu näidatakse postitused 16-22.

Kokku: 25949 registreerunud kasutajat, 9711 teemat, 54603 postitust.
Täna on esmaspäev, 14. oktoober 2019. Kell on 23:29.

    Vaata selle lehe printerisõbralikku versiooni

Avaleht   -    Skriptikogu   -    Teated   -    Foorum   -    Reklaam   -    Tagasiside   -    Kasutamise reeglid

© Copyright 2002-2019 PHP Center. Kõik õigused reserveeritud.