Jump to content
php.lv forumi

datu bīdīšana


ezs

Recommended Posts

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

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 by bubu
Link to comment
Share on other sites

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 by bubu
Link to comment
Share on other sites

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

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

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

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

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 by bubu
Link to comment
Share on other sites

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

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

×
×
  • Create New...