Stortering av MySQL resultat klusser...

Stortering av MySQL resultat klusser...

Innleggav rockie » man 23.02.2009 22:13

Hei!

Har laga meg et lite forumsscript, men er noe tull med sorteringa. Hver post har en postID (unik), men den har også en unik nøkkel innenfor det emnet den ligger i. Når jeg kjører scriptet og poster en post og kommer opp i post nummer 10 i iden innenfor emnet så blir alle nye poster 10 og den legger deg under post nummer 1.

Kode:
Kode: Merk alt
<?php
//Output buffer
ob_start();
//inkluderer filer og definerer serverroot
$root = $_SERVER['DOCUMENT_ROOT'];
$domene = $_SERVER['SERVER_NAME'];
include_once $root . '/home/funksjoner.inc.php';
include_once $root . '/home/config.php';

//Kobler til
$tilkobling = mysql_connect($vert, $bruker, $passord);
mysql_select_db("fy", $tilkobling);

//Lenken riktig?
if(isset($_GET['id']) or isset($_POST['id'])){
//Ja

function visPoster() {
//inkluderer filer og definerer serverroot
$root = $_SERVER['DOCUMENT_ROOT'];
$domene = $_SERVER['SERVER_NAME'];
include_once $root . '/home/funksjoner.inc.php';
include $root . '/home/config.php';

//Henter ID fra POST eller GET
if(isset($_GET['id'])){ //Den er i GET
   $id=$_GET['id'];
}elseif(isset($_POST['id'])){
   $id=$_POST['id'];//Den er i POST
}

//Kobler til database
$tilkobling = mysql_connect($vert, $bruker, $passord);
mysql_select_db("fy", $tilkobling);

$sql = "SELECT * FROM poster WHERE emneID=" . $id . " ORDER BY nummer";
var_dump($sql);
//var_dump($sql);
$resultat = mysql_query($sql, $tilkobling);
//var_dump($resultat);

//Begynner tabellen for og presentere postene i PHP
echo '<table style="width: 100%;" border="1" cellpadding="2" cellspacing="2"><tbody>';

//Presenter innholdet via løkken
while($rad = mysql_fetch_array($resultat)){
   $postID = $rad['postID'];
   $innhold = $rad['innhold'];
   $brukernavnp=$rad['av'];
   $postet = $rad['postet'];
   $nummer = $rad['nummer'];
   
   echo '<tr>';
    echo '<td>' . $postet . '</td>';
    echo '<td style="text-align: right;">#' . $nummer . '</td>';
    echo '</tr>';
    echo '<tr>';
    echo '<td width="25%">' . $brukernavnp . '</td>';
    echo '<td>' . $innhold . '</td>';
    echo '</tr>';
    //echo '<tr>';
    //echo '<td colspan="2" rowspan="1">Signatur</td>';

}
//Resten av tabellen
echo '</tbody>';
echo '</table>';
//Begynner poå sjemaet for innsending
if(true == $_SESSION['innlogget']){//Sjekker at brukeren er innlogget
   echo '<form method="post" action="';
   echo $_SERVER['PHP_SELF'];
   echo '" name="nypost">';
   echo '<fieldset><legend>Ny post</legend>Innhold:<br>';
   echo '<textarea cols="75" rows="10" name="innhold"></textarea><br>';
   echo '<input type="hidden" name="id" value="' . $id . '">';
   echo '<input type="submit" value="Post!" name="post"></fieldset>';
   echo '</form>';
}
}//Funksjon ferdig


//Skal scriptet behandle en post eller vise postene?
if(isset($_POST['post'])){
   //Behandle
   //Henter ID
   $id=$_POST['id'];//Den er i POST
   //Henter forige nummer og legger på 1
   $sql="SELECT * FROM poster WHERE emneID = " . $id . " ORDER BY nummer DESC LIMIT 1 ";
   //echo $sql;
   $resultat = mysql_query($sql, $tilkobling);
   while($rad = mysql_fetch_array($resultat)){
      $nummer = $rad['nummer'];
      //echo 'Rådata: $nummer <br>';
      $nummer = (int)$nummer +1;
      //echo 'Int+1: $nummer <br>';
      $innhold = $_POST['innhold'];
      $brukernavn = $_SESSION['brukernavn'];
      $dato = tid();
      $sql = "INSERT INTO poster (innhold, av, postet, emneID, nummer)
         VALUES('$innhold ', '$brukernavn', '$dato', '$id', '$nummer')";
   mysql_query($sql, $tilkobling);
   }
   echo "Posten er postet.";
   visPoster();
}else{//Vise poster
   visPoster($id);
}

//Henter ID fra POST eller GET
if(isset($_GET['id'])){ //Den er i GET
   $id=$_GET['id'];
}elseif(isset($_POST['id'])){
   $id=$_POST['id'];//Den er i POST
}


$sql = 'SELECT * FROM emner WHERE emneID =' . $id;
//var_dump($sql);
$resultat = mysql_query($sql, $tilkobling);
$rad = mysql_fetch_array($resultat);
$tittel = $rad['tittel'];


}else{//nei
echo 'Siden du ville vise eksisterer ikke eller er utdatert. <br />';
echo '<a href="javascript:history.go(-1)">Tilbake</a>';
$tittel = 'Error: Siden du ville vise eksisterer ikke' ;

}
$innhold = ob_get_clean();
include $root . '/home/tpl/hoved.tpl' ;
?>


Bilde:
Bilde

Den sql spørringen jeg skrev ut brukte jeg for og sjekke at det ikke var noe feil med den, skal fjernes.

Og ja, har ikke beskytta meg mot html/mysql injecton men skal gjøre det.
medlem i 190 måneder
 

Re: Stortering av MySQL resultat klusser...

Innleggav decodex » tir 24.02.2009 0:35

Ved en kjapp titt gjennom ser jeg ingen umiddelbare problemer. Har du sjekket spørringene du kjører ved lagring av nytt innlegg at disse inneholder riktige verdier? Har du sjekket hva som faktisk er lagret i databasen?

Forøvrig henter du ut neste «nummer» for en post-id ganske tungvint. Det kan lett skrives som en enkel spørring som henter det direkte uten å hente alle poster:
Kode: Merk alt
SELECT (MAX(nummer) + 1) as maks FROM poster WHERE emneID = N


«N» erstatter du selvsagt med riktig emne-id som ellers.

Brukerens avatar
medlem i 217 måneder
 

Re: Stortering av MySQL resultat klusser...

Innleggav rockie » tir 24.02.2009 15:39

Nummeret ligger rett i databasen, bortsett fra når jeg kommer til 10.

Bilde:
Bilde

Ble litt tingvindt med bilde, men har blitt noe kluss med den tekstbaserte klienten som følger med MySQL.
medlem i 190 måneder
 

Re: Stortering av MySQL resultat klusser...

Innleggav decodex » ons 25.02.2009 14:42

Vel, da er problemet rundt koden som legger inn et nytt innlegg.

En ting jeg ser nå som jeg antar er feil er at du legger inn det nye innlegget flere ganger mens du teller opp $nummer. Dette vil du nødvendigvis unngå helt om du bruker spørringen nevnt tidligere for å finne neste nummer for emne-id.

Brukerens avatar
medlem i 217 måneder
 

Re: Stortering av MySQL resultat klusser...

Innleggav rockie » ons 25.02.2009 15:19

Med denne koden:
Kode: Merk alt
   $id=$_POST['id'];//Den er i POST
   //Henter forige nummer og legger på 1
   $sql="SELECT (MAX(nummer) + 1) as maks FROM poster WHERE emneID = $id";
   //echo $sql;
   $nummer = mysql_query($sql, $tilkobling);
   
   $innhold = $_POST['innhold'];
   $brukernavn = $_SESSION['brukernavn'];
   $dato = tid();
   $sql = "INSERT INTO poster (innhold, av, postet, emneID, nummer)
         VALUES('$innhold ', '$brukernavn', '$dato', '$id', '$nummer')";
   mysql_query($sql, $tilkobling);
   
   echo "Posten er postet.";
   visPoster();

får jeg bare #Resource id #5 ut som nummer selv om forige nummer er 1
medlem i 190 måneder
 

Re: Stortering av MySQL resultat klusser...

Innleggav decodex » ons 25.02.2009 16:29

Det er klart. mysql_query returnerer bare en ressurspeker til resultatsettet. Du må dernest hente ut første rad i resultatsettet med f.eks. mysql_fetch_assoc. Jeg foretrekker forøvrig mysql_fetch_assoc fremfor mysql_fetch_array - rett og slett fordi jeg aldri har behov for å hente ut kolonneverdier via numerisk indeks, men bruker alltid kolonnenavnet. Altså slik:
Kode: Merk alt
$sql="SELECT (MAX(nummer) + 1) as maks FROM poster WHERE emneID = $id";
$resultat = mysql_fetch_assoc(mysql_query($sql, $tilkobling));
$nummer = $resultat['maks'];

Brukerens avatar
medlem i 217 måneder
 

Re: Stortering av MySQL resultat klusser...

Innleggav rockie » tor 26.02.2009 19:48

Ok, var var litt rask når jeg lest igjen koden. Poster om det går-

Edit: Same result as last time -.-

Edit: Fjerna SORT BY nummer i SQL en. Sorteringa blir da riktig men etter 10 blir forsatt alt 10. Kna det ha noe med datatypen i databasen? Hvilken er i så fall optimal?
medlem i 190 måneder
 


Returner til PHP



Hvem er i Forumene

Registrerte brukere: Ingen registrerte brukere



cron