Avatar billede Nollon Nybegynder
08. december 2011 - 13:24 Der er 8 kommentarer og
1 løsning

Sql left join ?

Hey.
jeg har lavet en så man kan tilmelde sig til nogle motions hold men når der er flere der tilmelder sig det samme hold så bliver den <div> der indeholder der hvor man trykker tilmeld (og hvor der står hvad det er osv.) bliver kopiret så det står der 2 gange (og vis der er 3 der tilmelder sig kommer frem 3 gange osv.) er ret sikker på at problemet ligger i en sql sætning med left join men er ik så skarp til joins.

//sql sætningen
$sql = mysql_query("SELECT h.id, h.aktivitet, h.holdnr, h.instruktor, h.dato, h.tidspunkt, h.antal, h.tilmeldt, ht.holdid, ht.userid FROM hold AS h LEFT JOIN
hold_tilmelding AS ht ON h.id=ht.holdid ORDER BY dato ASC");

                while ($row = mysql_fetch_assoc($sql)) {
                    $dato = date("d-m-Y", strtotime($row['dato']));
                    $tid = date("H:i", strtotime($row['tidspunkt']));
                    $id=$row['id'];
                    $datestamp = date("d-m-Y");
                    $timestamp = date("H:i");
                   
                    if($tid < $timestamp || $dato < $datestamp) {
                       
                        $sql_delete = mysql_query("DELETE FROM hold WHERE dato=$datestamp AND tidspunkt>$timestamp");
                    } else {
                    echo '<div class="boxIt">';
                    echo '<p class="points" style="width:45px;">' . $row['holdnr'] . '</p>';
                    echo '<p class="points" style="">' . $row['aktivitet'] . '</p>';
                    echo '<p class="points" style="width:105px;">' . $row['instruktor'] . '</p>';
                    echo '<p class="points" style="">' . $dato . '</p>';
                    echo '<p class="points" style="width:45px; text-align:center;">' . $tid . '</p>';
                    echo '<p class="points" style="width:60px; text-align:center;">' . $row['antal'] . '</p>';
                   
//Her ser den om der er fyldt på holdet
                    if($row['tilmeldt'] == $row['antal']) {
                        echo "<p class='points' style='width:50px; text-align:center;'>
                    <input class='submit' type='button' style='width:50px; margin-top:0; background:#ccc; cursor:default;' value='Optaget' disabled />                               
                    </p>";
//her ser den om man er tilmeldt
                    } elseif($row['userid'] == $_SESSION['id']) {
                    echo "<p class='points' style='width:50px; text-align:center;'>
<a href='?frameld_hold&id=$id' style='text-decoration:none;'>
                    <input class='submit' type='button' style='width:50px; margin-top:0; background:red;' value='Frameld' />                               
                    </a></p>";
//det her er tilmeld knappen normalt
                    } elseif($row['userid'] != $_SESSION['id']) {
                    echo "<p class='points' style='width:50px; text-align:center;'>
                    <a href='?tilmeld_hold&id=$id' style='text-decoration:none;'>
                    <input class='submit' type='button' style='width:50px; margin-top:0; background:green;' value='Tilmeld' />                               
                    </a></p>";
                    }

                    echo '<div style="clear:both";></div>';
                    echo '</div>';
                    }
                }
08. december 2011 - 14:12 #1
Din sql sætning søger efter all de der er tilmeldt, og derefter laver du en div for hver tilmeldte.

Var det meningen at en bruger kan tilmelde sig og derefter se sin egen tilmelding, ikke alle tilmeldingerne?  I så fald, hvordan ved dit system hvilken user der er i færd med at tilmelde sig?  Er useren logget ind, og kan man indfange useres id i en variabel $userid eller lignende?  I så fald indfører du den begrænsning i din sql sætning:

$sql = mysql_query("SELECT h.id, h.aktivitet, h.holdnr, h.instruktor, h.dato, h.tidspunkt, h.antal, h.tilmeldt, ht.holdid, ht.userid FROM hold AS h LEFT JOIN
hold_tilmelding AS ht ON h.id=ht.holdid WHERE ht.userid = £userid ORDER BY dato ASC");
Avatar billede Nollon Nybegynder
08. december 2011 - 14:30 #2
Brugeren logger ind inden ja.
og efter brugeren har tilmeldt sig kan han stadig se alle de andre hold den eneste foreskel på siden er faktisk at det hold han lige har tilmeldt sig er blevet rødt og der står frameld istedet for.
Mht hvordan systemet kan se brugeren er ifærd med at tilmelde sig
så er der:
//Den der bliver udført når man trykker "tilmeld"
if (isset($_GET['tilmeld_hold'])) {
    if (isset($_GET['id'])) {
        $id = $_GET['id'];

        $sql_insert = mysql_query("INSERT INTO hold_tilmelding (holdid, userid) VALUES ('$id','" . $_SESSION['id'] . "')");

        $sql = mysql_query("SELECT tilmeldt FROM hold WHERE id='$id'");
        $row = mysql_fetch_assoc($sql);
        $tilmeldt = $row['tilmeldt'] + 1;

        $sql_ret = "UPDATE hold SET tilmeldt='$tilmeldt' WHERE id='$id'";
        $result1 = mysql_query($sql_ret) or die(mysql_error());
        header('location:?tilmeldhold=ok');
    }
}


//den er bliver udført når man trykker frameld
if (isset($_GET['frameld_hold'])) {
    if (isset($_GET['id'])) {
        $id = $_GET['id'];
        $userid = $_SESSION['id'];
        //$sql_slet = mysql_query("DELETE tilmeldt FROM hold WHERE holdnr='$id'");
        $sql_del = mysql_query("DELETE FROM hold_tilmelding WHERE holdid='$id' AND userid='$userid'");
       
        $sql = mysql_query("SELECT tilmeldt FROM hold WHERE id='$id'");
        $row = mysql_fetch_assoc($sql);
        $tilmeldt = $row['tilmeldt'] - 1;

        $sql_ret = "UPDATE hold SET tilmeldt='$tilmeldt' WHERE id='$id'";
        $result1 = mysql_query($sql_ret) or die(mysql_error());
        header('location:?frameld_hold=ok');
    }
}
08. december 2011 - 18:36 #3
Du fortæller i #3, at brugeren kan identificeres med $id.  Men tilbage til det oprindelige spørgsmål.  Du stiller denne forespørgsel:

$sql = mysql_query("SELECT h.id, h.aktivitet, h.holdnr, h.instruktor, h.dato, h.tidspunkt, h.antal, h.tilmeldt, ht.holdid, ht.userid FROM hold AS h LEFT JOIN
hold_tilmelding AS ht ON h.id=ht.holdid ORDER BY dato ASC");

Resultatet bliver en liste over alle tilmeldinger for alle hold.  Hvis der er 10 hold og tre tilmeldinger til hver får du 30 rækker i dit resultat.  I din while løkke udskriver du en <div class="boxlt"> for hver af disse rækker.  Det siger du så er for meget.  Hvad vil du så se i stedet for?  Det fortæller du ikke.

Hvis du vil se en liste over alle hold som en bestemt user er tilmeldt, og hvis id'en på denne user er i $id, så begrænser du resultatet ved i forespørgselen at indføje WHERE ht.userid = '$id'  Hvis det er alle tilmeldte for et bestemt hold du vil have, så må du identificere det ønskede hold i en variabel $hold og i forespørgslen sige WHERE h.id = '$hold  Og hvis du kun vil have en bestemt user tilmeldt et bestemt hold bruger du både $id og $hold i WHERE klausulen. 

Svarer det på spørgsmålet?  Eller har jeg ikke forstået problemet?  I så fld, hvor går jeg forkert?
Avatar billede Nollon Nybegynder
08. december 2011 - 20:37 #4
Hm jeg ser lige om jeg kan forklare det bedre.
lige nu skriver den en liste med alle holdene (hvilket den skal blive ved med). når der så er 1 der tilmelder sig et af holdene skifter der hvor der står "tilmeld" til "Frameld" (det skal den også blive ved med) men når der så er 2 der tilmelder sig det samme hold så skriver den 2 <div class="boxIt"> ud istedet for kun 1 (det vil sige der kommer til at stå 2 af det samme hold med samme id på listen hvor der på det ene står tilmeld og det andet frameld og der skal kun være 1 af hver med det samme id) så det er mere hvorfor skriver den det hold ud igen ? og hvordan fixer man det :S som sagt er ik så skarp til joins bruger det meeget sjælendt.
var det bedre beskrevet ? :S
08. december 2011 - 21:53 #5
Aha, du vil søge efter alle hold.  For hvert hold skal der ske følgende:

Hvis holdet er gammelt (i.e. $tid < $timestamp) skal holdet slettes fra databasen.
Ellers:
Hvis holdet er fuld skal der stå Optaget.
Ellers skal der stå en liste over alle der er tilmeldt.  For hver tilmeldte skal der enten være en knap for at framelde (for den bruger der er logged på) eller en knap for at tilmelde.  For eksempel således, hvis det er user3 der er logget på (med vilje forenklet)

Hold 1
  Optaget
Hold2
  User1 <tilmeld>
  User2 <tilmeld>
  User7 <tilmeld>
Hold3
  User2 <tilmeld>
  user3 <frameld>

I øjeblikket får du

Hold1
  Optaget
Hold2
  User1 <tilmeld>
Hold2
  User2 <tilmeld>
o.s.v.

Har jeg forstået det rigtigt?

Det kender jeg to måder at gøre på.  Den første og simpleste er at lave to queries i stedet for en join query.  Den anden er, ud fra join queryen, for hver række at undersøge, om holdet er det samme som i den foregående række og i så fald ikke udskrive holdet.  Nedenfor skitserer jeg den første måde:

//først søger du kun holdene
$sql = mysql_query(SELECT * FROM hold);
while($row = mysql_fetch_assoc($sql))
{
  $dato = ...
  $tid = ...
  $id = ...
  ...
  if($tid<$timestamp ....)
  {
    $sql_delete = mysql_query("DELETE FROM ....");
  }
  else
  {
    echo '<div class="boxlt">';
    echo '<p class = "points"...';
    ....
    if($row['tilmeldt'] == $row['antal'])
    {
      ..koden der skriver optaget..
    }
    else //her søger du så tilmeldingerne til det pågældende hold
    {
      $sql1 = mysql_query(SELECT * FROM hold_tilmelding WHERE holdid = $id);
      while($row1 = mysql_fetch_assoc($sql1))
      if($row1['userid']==$_SESSION['id'])
      {
        ..her kommer koden der giver en frameld knap..
      }
      else
      {
        ..her kommer koden der giver en tilmeld knap.
      }
    }
    echo </div>
  }
}

Kunne du følge mig?
13. december 2011 - 07:06 #6
Nollon, fik du mit indlæg #5?  Kunne du bruge det?  Jeg er spændt på din reaktion.
Avatar billede Nollon Nybegynder
14. december 2011 - 19:12 #7
ah ja sorry har haft lidt travlt :)
vi kunne ikke helt få det til at virke selv tilmeldings knappen kopirede sig stadigvæk :S
14. december 2011 - 19:36 #8
Hvis du har for travlt for tiden til dette her, så foreslår jeg, at du lukker spørgsmålet og så, når tiderne er bedre, reflekterer over det og åbner et nyt spørgsmål, hvis du så stadig sidder fast.  (Jeg har også travlt, men jeg tog mig tiden til at først at udforske hvad problemstillingen nu var og derefter foreslå en løsning.  Jeg vil gerne undgå nu at blive hængende i et åbent spørgsmål, forstår du det?)

Hvis du på den anden side vil videre med sagen, så fortæl, om jeg nu, i indlæg #5, har forstået problemstillingen.  Har du prøvet mine forslag af?  I så fald, vis mig den kode du kører nu, forklar hvad output den giver, og forklar hvad det skulle have været i stedet.
Avatar billede Nollon Nybegynder
14. december 2011 - 22:23 #9
Så lukker jeg spørgsmålet indtil der er bedre tid. Men mange tak for din tid :)
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