Avatar billede aquafisken Nybegynder
18. februar 2006 - 00:41 Der er 20 kommentarer og
1 løsning

Problemer med op og ned flytnings funktion

Hej.
Jeg er groet lidt fast i denne kode, som jeg har været igang med, at prøve, at få til at virke.
Jeg har en database der hedder army, i den er der nogle kategorier hvorunder der er nogle underkategorier. De kategorier og underkategorier skal skrives ud seperat sådan at de rigtige underkategorier kommer sammen under den rigtige kategori.
Den del har jeg fået til at virke, men så kommer problemet fordi jeg vil gerne have det sådan at jeg kan trykke op og ned sådan at det info der ligger i en underkategori kan bytte plads, hvis der nu er noget der skal stå først i forhold til noget andet.
Min kode:
<!-- code sort start -->
<?php
require_once("../connect.php");

if(is_numeric($_GET['id']) && !empty($_GET['sort']))
{
    $currentSort = 0;
    $currentID = mysql_real_escape_string($_GET['id']);
   
    $moveSort = 0;
    $moveID = 0;
   
    $query = mysql_query("SELECT sort FROM army WHERE id = " . $currentID . " LIMIT 1");
    if(mysql_num_rows($query)>0)
    {
        $currentSort = mysql_result($query,0);
    }
   
    switch($_GET['sort'])
    {
        case "op":
            $query = mysql_query("SELECT id, sort FROM army WHERE sort < ".$currentSort." ORDER BY sort DESC LIMIT 1");
            break;
        case "ned":
            $query = mysql_query("SELECT id, sort FROM army WHERE sort > ".$currentSort." ORDER BY sort ASC LIMIT 1");
            break;
        default:
            $moveSort = 0;
            $moveID = 0;
    }
   
    if(mysql_num_rows($query)>0)
    {
        $row      = mysql_fetch_assoc($query);
        $moveID  = $row['id'];
        $moveSort = $row['sort'];
    }
   
    if($moveSort > 0)
    {
    $query = mysql_query("UPDATE army SET sort = ".$moveSort." WHERE id = ".$currentID." LIMIT 1");
    $query = mysql_query("UPDATE army SET sort = ".$currentSort." WHERE id = ".$moveID." LIMIT 1");
    }
}
?>
<!-- code sort finish -->
<?php
    include "../bbcode.php";
    include "../buttons.js";
    include "../connect.php";

if( isset( $_GET['id'] ) )
  $id = $_GET['id'];
else
  $id = null;


if( $id !== null ) {
  // Hent først data ud
  $resultat = mysql_query("select * FROM army WHERE id = '$id'");

  // Kør så igennem for hver række
  $raekke = mysql_fetch_array($resultat);
  if( $raekke == null )
    die("Fandt ikke rækken");

  extract($raekke);
?>

<table>
<?php
$query = mysql_query("SELECT * FROM army WHERE unit_race='WH40KTyranid' AND unit_section='WH40KHQ' ORDER BY sort");
if(mysql_num_rows($query)>0)
{
    while($row = mysql_fetch_assoc($query)){
$unit_navn             = stripslashes($row[unit_navn]);
$unit_text          = stripslashes($row[unit_text]);
$unit_positiv         = stripslashes($row[unit_positiv]);
$unit_negativ        = stripslashes($row[unit_negativ]);
$newtext             = nl2br($newtext);
$thumbnail            = $row["thumbnail"];
$originalpic        = $row["originalpic"];
$dato                = $row["dato"];
?>
<tr align="left" valign="middle">
<td colspan="2"><font class="dato"><?php echo "$dato" ?></font><br /><font class="unithead"><?php $htmlunit_navn = bbcode($unit_navn); echo "$htmlunit_navn" ?></font></td>
</tr>
<tr>
<td width="130" rowspan="4" align="left" valign="top"><a href="../addunit/images/<?php echo "$originalpic" ?>" target="_blank"><img src="../addunit/images/<?php echo "$thumbnail" ?>" border="0"></a><br />
  <a href="../addunit/images/<?php echo "$originalpic" ?>" target="_blank"><img src="http://www.barricade.dk/Images/pushpic.gif" width="41" height="9" border="0"/></a></td>
<td width="605"><font class="text"><?php $htmlunit_text = bbcode($unit_text); echo "$htmlunit_text" ?></font></td>
</tr>
<tr>
<td>
<font class="text"><b>Positiv</b></font>
<br>
<font class="text"><?php $htmlunit_positiv = bbcode($unit_positiv); echo "$htmlunit_positiv" ?></font></td>
</tr>
<tr>
<td>
<font class="text"><b>Negativ</b></font>
<br>
<font class="text"><?php $htmlunit_negativ = bbcode($unit_negativ); echo "$htmlunit_negativ" ?></font>
<p></td>
</tr>
<tr>
  <td align="right" valign="middle"><a href="<?php echo ($_SERVER['PHP_SELF']?id=$row['id']&sort=op); ?>">OP</a>&nbsp;|&nbsp;<a href="<?php echo ($_SERVER['PHP_SELF']?id=$row['id']&sort=ned); ?>">NED</a></td>
<?php
}
   
}
?>
</tr>
<tr>
</table>

Jeg håber der er nogen der kan hjælpe mig med at finde fejlen.
Selv vil jeg gætte på at det er noget i den del hvor den skal sortere eller også hvor Op og Ned linksene er...?
Avatar billede nielle Nybegynder
18. februar 2006 - 07:45 #1
Jeg gætter på at fejlen ligger i disse to SQL-sætninger:

        case "op":
            $query = mysql_query("SELECT id, sort FROM army WHERE sort < " . $currentSort . " ORDER BY sort DESC LIMIT 1");
            break;
        case "ned":
            $query = mysql_query("SELECT id, sort FROM army WHERE sort > " . $currentSort . " ORDER BY sort ASC LIMIT 1");
            break;

Du skriver jo at dine poster er organiseret i kategorier, og dine 2 SQL-sætninger tager jo ikke højde for detet - resultatet er at du sikkert får fat på sort-værdier som høre til en anden kategori.

De burde snare se nogenlunde sådan her ud:

        case "op":
            $query = mysql_query("SELECT id, sort FROM army WHERE sort < " . $currentSort . " AND kat_id = " . $katId . " ORDER BY sort DESC LIMIT 1");
            break;
        case "ned":
            $query = mysql_query("SELECT id, sort FROM army WHERE sort > " . $currentSort . " AND kat_id = " . $katId . " ORDER BY sort ASC LIMIT 1");
            break;

eller (med bedre performance):

        case "op":
            $query = mysql_query("SELECT id, Max(sort) AS moveSort FROM army WHERE sort < " . $currentSort . " AND kat_id = " . $katId);
            break;
        case "ned":
            $query = mysql_query("SELECT id, Min(sort) AS moveSort FROM army WHERE sort > " . $currentSort . " AND kat_id = " . $katId);
            break;
Avatar billede aquafisken Nybegynder
18. februar 2006 - 08:56 #2
Hej, jeg har prøvet at erstatte koden med den nederste du skrev der, men jeg får bare en hel blank skærm.
Jeg har prøvet at lægge hele filen ud her:
http://x-itin.dk/helfil.txt
Avatar billede nielle Nybegynder
18. februar 2006 - 10:57 #3
Nu skrev jeg jo bare "$katId" of "kat_id" for at demonstrere hvor der manglede noget. Du skal ikke skrive direkte af, men bruge det du selv har kaldt dine felter.

Værdien i variablen $katId skal hentes ud af databssen der hvor at du henter værdien til $currentSort:

$query = mysql_query("SELECT sort FROM army WHERE id = " . $currentID . " LIMIT 1");

- rettes til:

$query = mysql_query("SELECT sort, kat_id FROM army WHERE id = " . $currentID . " LIMIT 1");

Vær også opmærksom på at når du ændre dine SQL-sætningsr, så skal resten af koden justeres tilsvarende.
Avatar billede aquafisken Nybegynder
18. februar 2006 - 15:06 #4
Jeg har nu fået noget indhold på siden frem igen, og "Op | Ned" kan jeg også se, der sker bare ikke noget når jeg prøver at trykke på et af de to, infoen bliver bare på samme sted.
Jeg har prøvet at definere "$katId" fordi ellers kunne jeg ik rigtig se en mening bare at skrive det.
Og der hvor $currentSort bliver hentet:
  $query = mysql_query("SELECT sort, unit_race FROM army WHERE id = " . $currentID . " LIMIT 1");
  if(mysql_num_rows($query)>0)
    {
        $currentSort = mysql_result($query,0);
       
    while($row = mysql_fetch_assoc($query)){
        $WH40KTyranid = $row['WH40KTyranid'];
        }
    }

    switch($_GET['sort'])
    {
            case "op":
            $query = mysql_query("SELECT id, Max(sort) AS moveSort FROM army WHERE sort < " . $currentSort . " AND unit_race = " . $WH40KTyranid);
            break;
        case "ned":
            $query = mysql_query("SELECT id, Min(sort) AS moveSort FROM army WHERE sort > " . $currentSort . " AND unit_race = " . $WH40KTyranid);
            break;

Hvad er det jeg har gjort galt?
I koden har jeg fjernet den funktion med, at hvis man trykker på rediger så vises den box hvor man så kan redigere teksten i, men den bliver jeg nødt til at få lavet på en side for sig selv fordi ellers kommer den box istedet for Op og ned funktionen pga. $_SERVER['PHP_SELF'] nede ved Op og Ned linksene.
Avatar billede nielle Nybegynder
18. februar 2006 - 15:18 #5
Hvordan ser den komplette kode ud?
Avatar billede aquafisken Nybegynder
18. februar 2006 - 15:24 #6
den er på dette link: http://x-itin.dk/helfil.txt
Jeg har så bare ikke tilføjet flere underkategorier endnu, fordi jeg vil lige se at få det til at virke på den første der hedder WH40KHQ den næste underkategori inden under "overkategorien" WH40KTyranid hedder så WH40KElite.
Avatar billede nielle Nybegynder
18. februar 2006 - 17:14 #7
Prøv dette:

<!-- code sort start -->
<?php
require_once("../connect.php");

if (is_numeric($_GET['id']) && !empty($_GET['sort']))
{
    $currentSort = 0;
    $currentID = mysql_real_escape_string($_GET['id']);
   
    $moveSort = 0;
    $moveID = 0;
   
    $query = mysql_query("SELECT sort, unit_race FROM army WHERE id = " . $currentID . " LIMIT 1");
    if (mysql_num_rows($query) > 0)
    {
        $row = mysql_fetch_assoc($query);
        $currentSort = $row["sort"];
        $unit_race = $row["unit_race"];
    }

    switch ($_GET['sort'])
    {
        case "op" :
            $query = mysql_query("SELECT id, Max(sort) AS moveSort FROM army WHERE sort < " . $currentSort . " AND unit_race = " . $unit_race);
            break;
        case "ned" :
            $query = mysql_query("SELECT id, Min(sort) AS moveSort FROM army WHERE sort > " . $currentSort . " AND unit_race = " . $unit_race);
            break;
    }
   
    if (mysql_num_rows($query) > 0)
    {
        $row = mysql_fetch_assoc($query);
        $moveID = $row['id'];
        $moveSort = $row['moveSort'];
    }
   
    if ($moveSort > 0)
    {
        $query = mysql_query("UPDATE army SET sort = " . $moveSort . " WHERE id = " . $currentID);
        $query = mysql_query("UPDATE army SET sort = " . $currentSort . " WHERE id = " . $moveID);
    }
}
?>
<!-- code sort finish -->
Avatar billede nielle Nybegynder
18. februar 2006 - 17:20 #8
Nej, det vil ikke virke ordentligt. Sådan:

<!-- code sort start -->
<?php
require_once("../connect.php");

if (is_numeric($_GET['id']) && !empty($_GET['sort']))
{
    $currentSort = 0;
    $currentID = mysql_real_escape_string($_GET['id']);
   
    $moveSort = 0;
    $moveID = 0;
   
    $query = mysql_query("SELECT sort, unit_race FROM army WHERE id = " . $currentID . " LIMIT 1");
    if (mysql_num_rows($query) > 0)
    {
        $row = mysql_fetch_assoc($query);
        $currentSort = $row["sort"];
        $unit_race = $row["unit_race"];
    }

    switch ($_GET['sort'])
    {
        case "op" :
            $query = mysql_query("SELECT id, sort FROM army WHERE sort < " . $currentSort . " AND unit_race = " . $unit_race . " ORDER BY sort DESC LIMIT 1");
            break;
        case "ned" :
            $query = mysql_query("SELECT id, sort FROM army WHERE sort > " . $currentSort . " AND unit_race = " . $unit_race . " ORDER BY sort ASC LIMIT 1");
            break;
    }
   
    if (mysql_num_rows($query) > 0)
    {
        $row = mysql_fetch_assoc($query);
        $moveID = $row['id'];
        $moveSort = $row['sort'];
    }
   
    if ($moveSort > 0)
    {
        $query = mysql_query("UPDATE army SET sort = " . $moveSort . " WHERE id = " . $currentID);
        $query = mysql_query("UPDATE army SET sort = " . $currentSort . " WHERE id = " . $moveID);
    }
}
?>
<!-- code sort finish -->
Avatar billede nielle Nybegynder
18. februar 2006 - 17:24 #9
Du kan forresten rette:

$query = mysql_query("SELECT sort, unit_race FROM army WHERE id = " . $currentID . " LIMIT 1");

- til:

$query = mysql_query("SELECT sort, unit_race FROM army WHERE id = " . $currentID);

- for hvorfor have "LIMIT 1" hvis der alligevel kun er den ene post?
Avatar billede aquafisken Nybegynder
18. februar 2006 - 19:22 #10
Jeg har nu prøvet at sætte koden ind og rette  "LIMIT 1" væk, men når jeg trykker på Op eller Ned så vises den rigtige URL i adresse linien, men siden opdatere sig, bare uden at infoen bytter plads...?
Inde i MySQL databasen har jeg været manuelt inde og sætte numre ind for "sort", fordi de data der står der skal beholdes.
Avatar billede nielle Nybegynder
18. februar 2006 - 21:37 #11
Har du prøvet at kigge efter i din database om ændringerne er slået igennem korrekt der?
Avatar billede aquafisken Nybegynder
18. februar 2006 - 22:40 #12
Der er desværre heller ik sket noget i databasen...?
Du kan se hvordan det tér sig her: http://www.barricade.dk/admin/editunit/Edit_WH40KTyranid.php
Avatar billede nielle Nybegynder
19. februar 2006 - 07:55 #13
Jeg kan ikke umiddelbart se hvad det er der er galt, men prøv at indføre nogle debug-udskrivninger sådan at det er muliget at se hvad der sker internt i programmet:

<!-- code sort start -->
<?php
require_once("../connect.php");

if (is_numeric($_GET['id']) && !empty($_GET['sort']))
{
    $currentSort = 0;
    $currentID = mysql_real_escape_string($_GET['id']);
   
    $moveSort = 0;
    $moveID = 0;

    $sql = "SELECT sort, unit_race FROM army WHERE id = " . $currentID;
    echo "DEBUG #1: " . $sql . "<br>";
    $query = mysql_query($sql) or die(mysql_error());
    if (mysql_num_rows($query) > 0)
    {
        $row = mysql_fetch_assoc($query);
        $currentSort = $row["sort"];
        $unit_race = $row["unit_race"];
    }

    switch ($_GET['sort'])
    {
        case "op" :
            $sql = "SELECT id, sort FROM army WHERE sort < " . $currentSort . " AND unit_race = " . $unit_race . " ORDER BY sort DESC LIMIT 1";
            echo "DEBUG #2a: " . $sql . "<br>";
            $query = mysql_query($sql) or die(mysql_error());
            break;
        case "ned" :
            $sql = "SELECT id, sort FROM army WHERE sort > " . $currentSort . " AND unit_race = " . $unit_race . " ORDER BY sort ASC LIMIT 1";
            echo "DEBUG #2b: " . $sql . "<br>";
            $query = mysql_query($sql) or die(mysql_error());
            break;
    }
   
    if (mysql_num_rows($query) > 0)
    {
        $row = mysql_fetch_assoc($query);
        $moveID = $row['id'];
        $moveSort = $row['sort'];
    }
   
    if ($moveSort > 0)
    {
        $sql = "UPDATE army SET sort = " . $moveSort . " WHERE id = " . $currentID;
        echo "DEBUG #3a: " . $sql . "<br>";
        $query = mysql_query($sql) or die(mysql_error());

        $sql = "UPDATE army SET sort = " . $currentSort . " WHERE id = " . $moveID;
        echo "DEBUG #3b: " . $sql . "<br>";
        $query = mysql_query($sql) or die(mysql_error());
    }
}
?>
<!-- code sort finish -->
Avatar billede aquafisken Nybegynder
19. februar 2006 - 12:12 #14
Så kommer den med disse fejlmeddelser:
DEBUG #1: SELECT sort, unit_race FROM army WHERE id = 112
DEBUG #2a: SELECT id, sort FROM army WHERE sort < 2 AND unit_race = WH40KTyranid ORDER BY sort DESC LIMIT 1
Unknown column 'WH40KTyranid' in 'where clause'
Avatar billede nielle Nybegynder
19. februar 2006 - 15:12 #15
Ok, det betyder at din unit_race-felt er et tekstfelt. Jeg regnede egentlig med at det var et takfelt.

Du skal derfor tilrette alle de SQL-sætninger hvor at du bruger unit_race "på højre siden" sådan at de tager  høje dofe dette:

F.eks. skal denne:

$sql = "SELECT id, sort FROM army WHERE sort < " . $currentSort . " AND unit_race = " . $unit_race . " ORDER BY sort DESC LIMIT 1";

- rettes til:

$sql = "SELECT id, sort FROM army WHERE sort < " . $currentSort . " AND unit_race = '" . $unit_race . "' ORDER BY sort DESC LIMIT 1";
Avatar billede aquafisken Nybegynder
19. februar 2006 - 16:39 #16
Yes! Nu virker det, det eneste der er med det nu er at disse fejlmeddelser kommer frem når jeg trykker på den af dem:
DEBUG #1: SELECT sort, unit_race FROM army WHERE id = 110
DEBUG #2a: SELECT id, sort FROM army WHERE sort < 3 AND unit_race = 'WH40KTyranid' ORDER BY sort DESC LIMIT 1
DEBUG #3a: UPDATE army SET sort = 2 WHERE id = 110
DEBUG #3b: UPDATE army SET sort = 3 WHERE id = 111

Jeg tænkte på når jeg bruger tilføj funktionen som jeg har lavet, kan den så selv finde ud af hvilket tal den skal sætte ind ved sort, eller gør den det bare automatisk, og så kan man gå ind og flytte den ned hvor den skal være?
Jeg kan huske jeg i databasen satte en standart værdi for sort som var 0, men vil den ændre sig når man så tilføjer flere?
Avatar billede aquafisken Nybegynder
19. februar 2006 - 16:44 #17
jeg har lige prøvet at tilføje noget mere info, men der kan den ikke flytte op og ned ved det jeg har tilføjet, det er vel noget der skal tilføjes til koden hvor man tilføjer?
Du kan se her, hvordan det ser ud og virker: http://www.barricade.dk/admin/editunit/Edit_WH40KTyranid.php
Avatar billede nielle Nybegynder
19. februar 2006 - 17:46 #18
1) For at slippe for debug-udskrivningerne, skal du simpelthen slette de PHP-linjer, som er ansvarlig for at udskrive dem. Det kan du gøre på to forskellige måder:

a) Du kan slette dem, eller

b) Du kan udkomentere dem. Dette gøres ved at ændre:

echo "DEBUG #1: " . $sql . "<br>";

- til:

// echo "DEBUG #1: " . $sql . "<br>";

(og tilsvarende for de 4 andre).

Fordelen ved at udkommentere dem, er at ud hurtigt kan fjerne kommentaren hvis du har brug for at fp dem vist igen (altså når noget ikke virkere korrekt).

2) Når du indsætter en ny post, skal du benytte en værdi for "sort" som ikke har været brugt før. Dette gøres nemmest ved at finde den største værdi for "sort" for de eksisterende poster i tabellen, lægge 1 til denne, og så bruge denne "sort" for den nye post.
Avatar billede aquafisken Nybegynder
24. februar 2006 - 12:12 #19
Tak for svaret, jeg har nu fået det til at virke. Du må lige ligge et svar så du ka få nogle point.
Avatar billede nielle Nybegynder
24. februar 2006 - 17:32 #20
Cool :^)
Avatar billede nielle Nybegynder
24. februar 2006 - 17:33 #21
Ahh, det var det som:

http://www.eksperten.dk/spm/690549

- handlede om :^)
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