Avatar billede wolstrup Nybegynder
15. januar 2006 - 16:28 Der er 29 kommentarer og
1 løsning

sortering i venteliste

Dette er en venteliste hvor det skulle være muligt at ændre på folks placering, men den funker ikke:

<?
$PageOp = (int)@$_GET['PageOp'];
$PageNed = (int)@$_GET['PageNed'];

if ($PageOp>0) {

  // $PageOp skal flyttes op.
  $id1 = $PageOp;

  // Find nuværende "sort";
  $sql = "SELECT sort FROM login WHERE id=$id1";
  $result = mysql_query($sql);
  $row = mysql_fetch_row($result);
  $sort1 = $row[0];

  // Find punkt der skal byttes med
  $sql = "SELECT id, sort FROM login WHERE sort>$sort1 ORDER BY sort ASC LIMIT 1";
  $result = mysql_query($sql);
  $row = mysql_fetch_row($result);
  $id2 = $row[0];
  $sort2 = $row[1];

} elseif ($PageNed>0) {

  // $PageNed skal flyttes ned.
  $id1 = $PageNed;

  // Find nuværende "sort";
  $sql = "SELECT sort FROM login WHERE id=$id1";
  $result = mysql_query($sql);
  $row = mysql_fetch_row($result);
  $sort1 = $row[0];

  // Find punkt der skal byttes med
  $sql = "SELECT id, sort FROM login WHERE sort<$sort1 ORDER BY sort DESC LIMIT 1";
  $result = mysql_query($sql);
  $row = mysql_fetch_row($result);
  $id2 = $row[0];
  $sort2 = $row[1];

}

if ($PageOp>0 || $pageNed>0) {

  // Der skal byttes
  $sql = "UPDATE login SET sort='$sort2' WHERE id='$id1'";
  mysql_query($sql);
  $sql = "UPDATE login SET sort='$sort1' WHERE id='$id2'";
  mysql_query($sql);
}
?>
<table bgcolor="#F0F6F9" style="border:1px solid #9CC1D0;" width="500">
    <tr>
<td width="100" align="left"><b>Efternavn,</b></td>
        <td width="100" align="left"><b>Fornavn</b></td>
        <td width="100" align="left"><b>Opgang</b></td>
        <td width="50" align="left"><b>Nr.</b></td>
        <td width="150" align="left"></td>
</tr>
</table>
<?
        $sql = "SELECT * FROM login ORDER BY id";

    $user = mysql_query($sql) or die(mysql_error());

    while ($users = mysql_fetch_assoc($user))
    {
        $bg2 = "#F0F6F9";
        $bg = "#FFFFFF";
        if ($color == "$bg")
        {
            $color = $bg2;
        }
        else
        {
            $color = $bg;
        }

?>
<table style="border:1px solid #9CC1D0; border-top-style: none" border="0" bgcolor="<?=$color?>" width="500" height="30">
    <tr>
        <td align="left" valign="middle" width="100"><?=$users[efternavn]?></td>
        <td align="left" valign="middle" width="100"><?=$users[fornavn]?></td>
        <td align="left" valign="middle" width="100"><?=$users[opgang]?></td>
        <td align="left" valign="middle" width="50"><?=$users[lejlighedsnr]?></td>
        <td align="right" valign="middle" width="150">

<img onclick="location.href='?p=venteliste&PageOp=<?=$users[id]?>'" id="PageOp<?=$users[id]?>" onmouseover="mod_over(this.id);" onmouseout="mod_out(this.id);" alt="Ret" border="0" style="border:1px solid #FFFFFF;" src="gfx/op.jpg" width="16" height="17">

<img onclick="location.href='?p=venteliste&PageNed=<?=$users[id]?>';" id="PageNed<?=$users[id]?>" onmouseover="mod_over(this.id);" onmouseout="mod_out(this.id);" alt="Slet" border="0" style="border:1px solid #FFFFFF;" src="gfx/ned.jpg" width="17" height="17">

        </td>
    </tr>
</table>
<?}?>
Avatar billede nielle Nybegynder
15. januar 2006 - 17:52 #1
Prøv dette:

<?
$PageOp = (int) $_GET['PageOp'];
$PageNed = (int) $_GET['PageNed'];

if ($PageOp > 0)
{
    // $PageOp skal flyttes op.
    $id1 = $PageOp;

    // Find nuværende "sort";
    $sql = "SELECT sort FROM login WHERE id=$id1";
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);
    $sort1 = $row["sort"];

    // Find punkt der skal byttes med
    $sql = "SELECT id, sort FROM login WHERE sort>$sort1 ORDER BY sort ASC LIMIT 1";
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);
    $id2 = $row["id"];
    $sort2 = $row["sort"];
}
elseif ($PageNed > 0)
{
    // $PageNed skal flyttes ned.
    $id1 = $PageNed;

    // Find nuværende "sort";
    $sql = "SELECT sort FROM login WHERE id=$id1";
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);
    $sort1 = $row["sort"];

    // Find punkt der skal byttes med
    $sql = "SELECT id, sort FROM login WHERE sort<$sort1 ORDER BY sort DESC LIMIT 1";
    $result = mysql_query($sql);
    $row = mysql_fetch_assoc($result);
    $id2 = $row["id"];
    $sort2 = $row["sort"];
}

if ($PageOp > 0 || $pageNed > 0)
{
    // Der skal byttes
    $sql = "UPDATE login SET sort='$sort2' WHERE id='$id1'";
    mysql_query($sql);
    $sql = "UPDATE login SET sort='$sort1' WHERE id='$id2'";
    mysql_query($sql);
}
?>
<table bgcolor="#F0F6F9" style="border:1px solid #9CC1D0;" width="500">
<tr>
<td width="100" align="left"><b>Efternavn,</b></td>
<td width="100" align="left"><b>Fornavn</b></td>
<td width="100" align="left"><b>Opgang</b></td>
<td width="50" align="left"><b>Nr.</b></td>
<td width="150" align="left"></td>
</tr>
</table>
<?
    $sql = "SELECT * FROM login ORDER BY sort";

    $user = mysql_query($sql) or die(mysql_error());

    $bg = "#FFFFFF";
    $bg2 = "#F0F6F9";
    while ($users = mysql_fetch_assoc($user))
    {
        $color = ($color == "$bg") ? $bg2 : $bg;
?>
<table style="border:1px solid #9CC1D0; border-top-style: none" border="0" bgcolor="<?=$color?>" width="500" height="30">
<tr>
<td align="left" valign="middle" width="100"><?=$users[efternavn]?></td>
<td align="left" valign="middle" width="100"><?=$users[fornavn]?></td>
<td align="left" valign="middle" width="100"><?=$users[opgang]?></td>
<td align="left" valign="middle" width="50"><?=$users[lejlighedsnr]?></td>
<td align="right" valign="middle" width="150">

<img onclick="location.href='?p=venteliste&PageOp=<?=$users[id]?>'" id="PageOp<?=$users[id]?>" onmouseover="mod_over(this.id);" onmouseout="mod_out(this.id);" alt="Ret" border="0" style="border:1px solid #FFFFFF;" src="gfx/op.jpg" width="16" height="17">

<img onclick="location.href='?p=venteliste&PageNed=<?=$users[id]?>';" id="PageNed<?=$users[id]?>" onmouseover="mod_over(this.id);" onmouseout="mod_out(this.id);" alt="Slet" border="0" style="border:1px solid #FFFFFF;" src="gfx/ned.jpg" width="17" height="17">

</td>
</tr>
</table>
<?
}
?>
Avatar billede wolstrup Nybegynder
15. januar 2006 - 20:00 #2
Hehe... Nu er der da noget der virker, når man klikker på en rykker den sig, men ikke som den skal, den får nærmest en vilkårlig placering. Når man har klikket lidt rundt, kan man pludselig ikke mere, da de alle har fåer værdien 0 i sort?
Avatar billede nielle Nybegynder
15. januar 2006 - 20:06 #3
Prøv at tjekke efter hvad det er der sker ved at sætte noget debug-udskrit ind over alt som her:

$sql = "SELECT id, sort FROM login WHERE sort>$sort1 ORDER BY sort ASC LIMIT 1";
echo "DEBUG: [" . $sql . "]<br>";
$result = mysql_query($sql) or die(mysql_error());

Og prøv også at udskrive en eventuel mysql_error().
Avatar billede wolstrup Nybegynder
15. januar 2006 - 20:10 #4
DEBUG: [SELECT sort FROM login WHERE id=254]
DEBUG: [SELECT id, sort FROM login WHERE sort>0 ORDER BY sort ASC LIMIT 1]
Avatar billede nielle Nybegynder
15. januar 2006 - 20:17 #5
Alle steder!

Høre de to debug-udskrifter sammen? Og hvis de gør - er sort=0 for id=254?
Avatar billede wolstrup Nybegynder
15. januar 2006 - 20:30 #6
Det går jeg ud fra, og ja alle brugere oprettet i login har 0 i sort.
Avatar billede nielle Nybegynder
15. januar 2006 - 20:32 #7
Det skulle de vel ikke have. Skulle de ikke have en værdi som svarede til hvor at de skal likke i sorterings-rækkefølgen?
Avatar billede wolstrup Nybegynder
15. januar 2006 - 20:45 #8
Jo. Ved ikke hvorfor men hvis jeg tildeler dem værdier, ender de alle alligevel med at have 0, efter at man har rykket dem lidt op og ned.
Avatar billede nielle Nybegynder
15. januar 2006 - 20:52 #9
Ja, der er en fejl et eller andet sted som gør at de bliver til 0.

Men for at kunne finde den at vi nødt til at starte med den rigtige udgangs-situation og så debugge på den. Ellers kan vi ikke se hvor eller hvornår det går galt.
Avatar billede wolstrup Nybegynder
15. januar 2006 - 20:58 #10
Jeg har smidt DEBUG på de fire steder jeg kan se er nødvendige, men der kommer kun det som jeg skrev før...
Avatar billede nielle Nybegynder
15. januar 2006 - 21:00 #11
Prøv at rette sort-værdierne sådan at de ikke er lig med 0, men har hver deres værdi.
Avatar billede wolstrup Nybegynder
15. januar 2006 - 21:03 #12
Nu har jeg tildelt værdierne 1,2,3 og hvis jeg så prøver at flytte en af dem op kommer følgende:
DEBUG: [SELECT sort FROM login WHERE id=266]
DEBUG: [SELECT id, sort FROM login WHERE sort>2 ORDER BY sort ASC LIMIT 1]
Avatar billede wolstrup Nybegynder
15. januar 2006 - 21:06 #13
266 har værdien 2, og får så værdien 3?
Avatar billede nielle Nybegynder
15. januar 2006 - 21:08 #14
Lyder rigtigt...

Kom der ikke noget debug ud for de to UPDATE-sætninger:

$sql = "UPDATE login SET sort='$sort2' WHERE id='$id1'";
mysql_query($sql);
$sql = "UPDATE login SET sort='$sort1' WHERE id='$id2'";
mysql_query($sql);
Avatar billede wolstrup Nybegynder
15. januar 2006 - 21:16 #15
Ups, havde ikke indsat debug der... Så ser den sådan ud...
DEBUG: [SELECT sort FROM login WHERE id=266]
DEBUG: [SELECT id, sort FROM login WHERE sort>2 ORDER BY sort ASC LIMIT 1]
DEBUG: [UPDATE login SET sort='3' WHERE id='266']
DEBUG: [UPDATE login SET sort='2' WHERE id='261']
Avatar billede wolstrup Nybegynder
15. januar 2006 - 21:17 #16
Id 261 er sort 3
Avatar billede nielle Nybegynder
15. januar 2006 - 21:19 #17
Det ser jo ud som det skal gøre. Det er vist ikke der at fejlen er. :^)

Hvor så?! Jeg vil gætte på at der er potentielle problemer for den aller første og den aller sidste række i rækkefølgen.
Avatar billede wolstrup Nybegynder
15. januar 2006 - 21:23 #18
Forstår det heller ikke.. Synes den burde virke nu...
Avatar billede nielle Nybegynder
15. januar 2006 - 21:30 #19
Så må du jo prøve dig frem og se hvornår det går galt. Umiddlebart vil jeg vurdere at der opstår problemer når du f.eks. har flyttet en række helt op i toppen (eller helt ned i bunden).
Avatar billede wolstrup Nybegynder
15. januar 2006 - 21:34 #20
Tror du har ret. Jeg bøvler lidt videre med den... Men tak for hjælpen, du kan lige smide et svar så du kan få nogle point. Mend hensyn til mit andet spørgsmål, skriver den "Query was empty" når man ikke har valgt noget bogstav, altså der hvor den egentlig skulle poste alle?
Avatar billede nielle Nybegynder
15. januar 2006 - 21:37 #21
Et svar her ... men du skal selvfølgeligt bare spørge videre. :^)

Det andet problem synes jeg at vi skal tage i det relevante spørgsmål.
Avatar billede nielle Nybegynder
15. januar 2006 - 22:38 #22
Ja?
Avatar billede wolstrup Nybegynder
15. januar 2006 - 22:39 #23
Har prøvet at gøre den mere simpel, er den gangbar? Dog er der lidt fejl i...

Fejl: Parse error: parse error, unexpected '{' venteliste.php on line 2

<?
if(!empty($_GET['place']){
$placering = $_GET['place'];

if($_GET['opned'] == "op"){
$nyplacering = $placering + 1;
$r = $placering + 1;
$q = $r - 1;
}else{
$nyplacering = $placering - 1;
$r = $placering - 1;
$q = $r + 1;
}
mysql_query("UPDATE login SET sort=$q WHERE place='$r'");
mysql_query("UPDATE login SET sort=$nyplacering WHERE place='$placering'");
}
?>
<table bgcolor="#F0F6F9" style="border:1px solid #9CC1D0;" width="500">
    <tr>
<td width="100" align="left"><b>Efternavn,</b></td>
        <td width="100" align="left"><b>Fornavn</b></td>
        <td width="100" align="left"><b>Opgang</b></td>
        <td width="50" align="left"><b>Nr.</b></td>
        <td width="150" align="left"></td>
</tr>
</table>
<?
        $sql = "SELECT * FROM login ORDER BY id";

    $user = mysql_query($sql) or die(mysql_error());

    while ($users = mysql_fetch_assoc($user))
    {
        $bg2 = "#F0F6F9";
        $bg = "#FFFFFF";
        if ($color == "$bg")
        {
            $color = $bg2;
        }
        else
        {
            $color = $bg;
        }

?>
<table style="border:1px solid #9CC1D0; border-top-style: none" border="0" bgcolor="<?=$color?>" width="500" height="30">
    <tr>
        <td align="left" valign="middle" width="100"><?=$users[efternavn]?></td>
        <td align="left" valign="middle" width="100"><?=$users[fornavn]?></td>
        <td align="left" valign="middle" width="100"><?=$users[opgang]?></td>
        <td align="left" valign="middle" width="50"><?=$users[lejlighedsnr]?></td>
        <td align="right" valign="middle" width="150">

<img onclick="location.href='?p=venteliste&place=<?=$users[sort]?>&opned=op'" id="PageOp<?=$users[id]?>" onmouseover="mod_over(this.id);" onmouseout="mod_out(this.id);" alt="Ret" border="0" style="border:1px solid #FFFFFF;" src="gfx/op.jpg" width="16" height="17">

<img onclick="location.href='?p=venteliste&place=<?=$users[sort]?>&opned=ned';" id="PageNed<?=$users[id]?>" onmouseover="mod_over(this.id);" onmouseout="mod_out(this.id);" alt="Slet" border="0" style="border:1px solid #FFFFFF;" src="gfx/ned.jpg" width="17" height="17">

        </td>
    </tr>
</table>
<?}?>
Avatar billede nielle Nybegynder
15. januar 2006 - 22:46 #24
Fejlen er her:

Ret:

if(!empty($_GET['place']){

- til:

if(!empty($_GET['place'])){
Avatar billede nielle Nybegynder
15. januar 2006 - 22:48 #25
Den kode vil kun virke hvis der aldrig kommer huller i rækkefølgen - dette kan blive et problem hvis du nogenside skal slette noget.
Avatar billede wolstrup Nybegynder
15. januar 2006 - 22:53 #26
Puha.. Så er den jo ikke rigtig egnet..
Avatar billede nielle Nybegynder
15. januar 2006 - 22:56 #27
Desuden så har den vist de samme problemer som den foregående kode - altså med de to yderpunkter.
Avatar billede wolstrup Nybegynder
15. januar 2006 - 22:58 #28
Ja, det har jeg også lige set... Nå men tror sgu lige jeg vil sove på den... :-)
Avatar billede nielle Nybegynder
15. januar 2006 - 23:04 #29
Ditto ... vi kan jo eventuelt fortæstte i morgen aften.
Avatar billede wolstrup Nybegynder
15. januar 2006 - 23:05 #30
Bare i orden, skriver lige hvis jeg finder en løsning i løbet af imorgen..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester