Avatar billede sevinding Juniormester
12. januar 2017 - 04:54 Der er 10 kommentarer og
1 løsning

Udskkrivning fra tabel

Jeg har dette script hvor der normalvis kun skal udskrives en rytter per placering. I enkelte tilfælde skal der dog udskrives to på samme linje. Med det her script udskrives rytter nummer to på alle linjer hvor han kun skal udskrives under placering 1.
Se: http://www.tourfacts.dk/freddy/result2.php?aar=1961&lob=1&racename=Druivenkoers-Overijse

<?php

$res = mysql_query("SELECT

dat.dateid,
dat.datyear,
dat.length,
dat.starters,
dat.ave,
dat.missing,
dat.route,
alt.resultid,
alt.ridercomment,
alt.placering,
alt.ridersname,
alt.racetime,
alt.lob,
race.raceid,
race.racename,
ryt.id,
ryt.name,
ryt.prof,
lan.landid,
lan.fodeland,
lan.inter

      FROM raceresult1 AS alt
    INNER JOIN racedata AS dat ON dat.datyear = alt.ayear
      INNER JOIN races AS race ON alt.lob = race.raceid
    INNER JOIN riders AS ryt ON alt.ridersname = ryt.id
    INNER JOIN country AS lan ON ryt.country = lan.landid

        WHERE dat.datyear=$aar AND alt.lob = race.raceid AND race.raceid=$lob GROUP BY resultid ORDER BY resultid ASC");
       
        $i = 1;

        while($r = mysql_fetch_array($res)) {
       
        echo "<table width='100%' border='0' cellspacing='0' cellpadding='1' style='border-bottom: 1px dashed blue;'><tr>";
        echo "<td width='5%' align='center' valign='middle'>";
          echo "$r[placering]\n";
        echo "</td>";
        echo "<td width='7%' align='center' valign='middle' class='land'>$r[inter]</td>";
        echo "<td width='80%' align='left' valign='middle'>";
       
        echo "<table border='0' width='100%' valign='middle' cellspacing='0' cellpadding='0'><tr>\n";
       
          echo "<td width='50%' align='left' valign='middle'>";

          echo "<a href=http://www.tourfacts.dk/freddy/riders.php?id=$r[id] class='link2'>$r[name]</a>\n";
       
        echo "</td>";
       
        echo "<td width='50%' align='left' valign='middle'>";
   
$res1 = mysql_query("SELECT

dat.dateid,
dat.datyear,
alt.resultid,
alt.rider2,
race.raceid,
race.racename,
ryt.id,
ryt.name

      FROM raceresult1 AS alt
    INNER JOIN racedata AS dat ON dat.datyear = alt.ayear
    INNER JOIN races AS race ON alt.lob = race.raceid
    INNER JOIN riders AS ryt ON alt.rider2 = ryt.id

        WHERE dat.datyear=$aar AND alt.lob = race.raceid AND race.raceid=$lob GROUP BY resultid ORDER BY resultid ASC");
       
        while($r1 = mysql_fetch_array($res1)) {
           
        if(!$r1[rider2]); else echo "<a href=http://www.tourfacts.dk/freddy/riders.php?id=$r1[id] class='link2'>$r1[name]</a>\n";
           
}   
        echo "</td>";
        echo "</tr></table>\n";
       
        echo "<td align='right' valign='middle'>";
       
          if(!$r[racetime]); else echo "$r[racetime]\n";
        echo "</td>";

        echo "</tr><tr>";
        echo "<td align='left' valign='middle' colspan='6'>";
       
        if(!$r[ridercomment]); else echo "<font color=#E9005E'>&nbsp; &nbsp; &nbsp; &nbsp; $r[ridercomment]</font>\n";

        echo "</td>";
        echo "</tr></table>";
}
        $number = 0;

?>

Er der mon en der kan fortælle mig hvad jeg har overset?
Avatar billede olsensweb.dk Ekspert
12. januar 2017 - 11:07 #1
>I enkelte tilfælde skal der dog udskrives to på samme linje.
prøv at kigge på group-concat
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

BTW: hvorfor anvender du stadig det gamle mysql API ?? dette API er fjernet i PHP7, så de hjælpere der ville teste din code ville ikke kunne teste den.
skift API til mysqli eller PDO
http://php.net/manual/en/mysqlinfo.api.choosing.php
Avatar billede sevinding Juniormester
12. januar 2017 - 11:50 #2
Tak for responsen.
Da jeg stadig er novice, stort set kun har klippet og klistret det jeg har, samt ikke er nogen ørn i engelsk, står det som et totalt fremmedsprog for mig med API og PDO.
Jeg må se om der dukker en løsning op.
Ha' en god dag.
Avatar billede olsensweb.dk Ekspert
12. januar 2017 - 12:29 #3
du kan convaterer mysql til mysqli (procedural style) med dette tool der linkes til her
http://www.computerworld.dk/eksperten/spm/1012488?k=8231155
har ikke selv de store erfaringer med det, ud over en lille function jeg testede på, for sjov

*************
det nemmeste er at skifte til mysqli, i mysqli kan du anvende 2 styles frit som du har lyst

procedural style: som du kender fra det gamle mysql, der er grundlæggende bare tilføjet et i, i alle mysql_ kommandoerne så de hedder mysqli_, og ved mange af dem skal du også angive din connection

OOP style: dette er det der anvendes mest, og er fremtiden

Prepare Statement: er noget af det nye der er kommet til i mysqli, en kvik guide findes her http://www.computerworld.dk/uploads/eksperten-guider/1480-Prepared-Statements-under-MySQLI-kom-igang.pdf
du har kun numbered place holders

*************
PDO: dette ser jeg som det fremtidige ext (API), du kan kun anvende OOP style, tilgengæld har du alle fordele fra ODBC, men ikke ulemperne ved at skulle installerer en system driver
PDO anvender også en extern driver, men PHP har de mest anvendte indbygget. (skal evt enables i php.ini)

Prepare Statement: er klart forbedret i forhold til mysqli
du har numbered placeholders og named placeholders, sidst nævnte er klart nemmere at læse IMHO
*****************


>Jeg må se om der dukker en løsning op.
held og lykke
Avatar billede acore Ekspert
12. januar 2017 - 12:55 #4
Dit problem er, at du først kører en query ($res), og for hver resultat-linie, du henter fra den, kører du så en query igen ($res1). Der er ingen sammenhæng mellem den første og de efterfølgende queries, og derfor henter den anden query det samme hver gang.

Bortset fra det, så er der ingen grund til til at køre N+1 queries (hvor N er antallet af rækker). Du kan nøjes med én, vil jeg mene.

Det, du skal gøre, er at tilføje en ny INNER JOIN til den første query, der henter rider2 ud, og så skal du bruge det i udskriften af rider2. Hele $res1 queriet skal så slettes inklusive den efterfølgende while.

Det har ikke noget med mysql eller mysqli eller PDO at gøre. Det er fuldstændig de samme queries, der køres, og det er i dem fejlen ligger.
Avatar billede sevinding Juniormester
12. januar 2017 - 13:12 #5
Takker.

Nu ser det sådan her ud:

dat.dateid,
dat.datyear,
dat.length,
dat.starters,
dat.ave,
dat.missing,
dat.route,
alt.resultid,
alt.ridercomment,
alt.placering,
alt.ridersname,
alt.rider2,
alt.racetime,
alt.lob,
race.raceid,
race.racename,
ryt.id,
ryt.name,
ryt.prof,
lan.landid,
lan.fodeland,
lan.inter

      FROM raceresult1 AS alt
    INNER JOIN racedata AS dat ON dat.datyear = alt.ayear
      INNER JOIN races AS race ON alt.lob = race.raceid
    INNER JOIN riders AS ryt ON alt.ridersname = ryt.id
    INNER JOIN riders AS ryt ON alt.rider2 = ryt.id
    INNER JOIN country AS lan ON ryt.country = lan.landid

        WHERE dat.datyear=$aar AND alt.lob = race.raceid AND race.raceid=$lob GROUP BY resultid ORDER BY resultid ASC");
       
        $i = 1;

        while($r = mysql_fetch_array($res)) {
       
        echo "<table width='100%' border='0' cellspacing='0' cellpadding='1' style='border-bottom: 1px dashed blue;'><tr>";
        echo "<td width='5%' align='center' valign='middle'>";
          echo "$r[placering]\n";
        echo "</td>";
        echo "<td width='7%' align='center' valign='middle' class='land'>$r[inter]</td>";
        echo "<td width='80%' align='left' valign='middle'>";
       
        echo "<table border='0' width='100%' valign='middle' cellspacing='0' cellpadding='0'><tr>\n";
       
          echo "<td width='50%' align='left' valign='middle'>";

          echo "<a href=http://www.tourfacts.dk/freddy/riders.php?id=$r[id] class='link2'>$r[name]</a>\n";

       
        echo "</td>";
       
        echo "<td width='50%' align='left' valign='middle'>";

           
        if(!$r[rider2]); else echo "<a href=http://www.tourfacts.dk/freddy/riders.php?id=$r[id] class='link2'>$r[name]</a>\n";
           
        echo "</td>";
Jeg går ud fra, at det er dette: INNER JOIN riders AS ryt ON alt.rider2 = ryt.id du mente.
Nu er der en blank side.
Avatar billede acore Ekspert
12. januar 2017 - 13:44 #6
Er lidt svært helt at overskue, må jeg indrømme. Men du skal i hvert fald rette til

    INNER JOIN riders AS ryt ON alt.ridersname = ryt.id
    INNER JOIN riders AS ryt2 ON alt.rider2 = ryt2.id

(2 rettelser med fed)

Og så skal

        if(!$r[rider2]); else echo "<a href=http://www.tourfacts.dk/freddy/riders.php?id=$r[id] class='link2'>$r[name]</a>\n";

også rettes. Den skal ikke bruge $r[id] og $r[name]. Jeg tror skal tilføje ryt2.id og ryt2.name i din felt-liste i det første query, og så bruge dem i stedet. Tror du behøver et par AS for at kunne gøre det.

Beklager, det ikke er så konkret, men det er lidt svært for mig at overskue på afstand.
Avatar billede sevinding Juniormester
12. januar 2017 - 14:12 #7
Nu ser det sådan her ud:
...
ryt.id,
ryt.name,
ryt2.id AS ryt2id,
ryt2.name AS ryt2name,
lan.landid,
lan.fodeland,
lan.inter

      FROM raceresult1 AS alt
    INNER JOIN racedata AS dat ON dat.datyear = alt.ayear
      INNER JOIN races AS race ON alt.lob = race.raceid
    INNER JOIN riders AS ryt ON alt.ridersname = ryt.id
    INNER JOIN riders AS ryt2 ON alt.rider2 = ryt2.id
    INNER JOIN country AS lan ON ryt.country = lan.landid

        WHERE dat.datyear=$aar AND alt.lob = race.raceid AND race.raceid=$lob GROUP BY resultid ORDER BY resultid ASC");
       
        while($r = mysql_fetch_array($res)) {
       
        echo "<table width='100%' border='0' cellspacing='0' cellpadding='1' style='border-bottom: 1px dashed blue;'><tr>";
        echo "<td width='5%' align='center' valign='middle'>";
          echo "$r[placering]\n";
        echo "</td>";
        echo "<td width='7%' align='center' valign='middle' class='land'>$r[inter]</td>";
        echo "<td width='80%' align='left' valign='middle'>";
       
        echo "<table border='0' width='100%' valign='middle' cellspacing='0' cellpadding='0'><tr>\n";
       
          echo "<td width='50%' align='left' valign='middle'>";

          echo "<a href=http://www.tourfacts.dk/freddy/riders.php?id=$r[id] class='link2'>$r[name]</a>\n";

       
        echo "</td>";
       
        echo "<td width='50%' align='left' valign='middle'>";

           
        if(!$r[rider2]); else echo "<a href=http://www.tourfacts.dk/freddy/riders.php?id=$r[ryt2id] class='link2'>$r[ryt2name]</a>\n";
           
        echo "</td>";

men det udskriver kun hvis der er data i begge rytterfelter.
Avatar billede acore Ekspert
12. januar 2017 - 14:18 #8
På en måde nærmer vi os vist - prøv at udskifte INNER JOIN med LEFT join for det nye JOIN, du har tilføjet.
Avatar billede acore Ekspert
12. januar 2017 - 14:21 #9
Avatar billede sevinding Juniormester
12. januar 2017 - 14:31 #10
Hold da k...
Det varlige spot on. Mange tak. Hvordan belønner jeg?
Avatar billede acore Ekspert
12. januar 2017 - 14:48 #11
Det var godt :)

Tror bare du skal acceptere et af mine svar som løsning
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

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