Avatar billede EveryMA Mester
17. januar 2011 - 21:26 Der er 19 kommentarer og
1 løsning

Tilføj en <td> efter 3 udtræk

Hej eksperter.

Jeg har et problem, når jeg udtrækker noget fra min mySQL database, som skal indsættes i en stor tabel, med forskellige poster.

Dette er (test) min tabel:
  <table width="400" height="300">
    <tr>
      <td width="50" height="75">B1</td>
      <td width="150" height="75">Tekst 1</td>
      <td width="50" height="75">B4</td>
      <td width="150" height="75">Tekst 4</td>
    </tr>
    <tr>
      <td width="50" height="75">B2</td>
      <td width="150" height="75">Tekst 2</td>
      <td width="50" height="75">B5</td>
      <td width="150" height="75">Tekst 5</td>
    </tr>
    <tr>
      <td width="50" height="75">B3</td>
      <td width="150" height="75">Tekst 3</td>
      <td width="50" height="75">B6</td>
      <td width="150" height="75">Tekst 6</td>
    </tr>
    </table>

Altså på venstre side har vi 3 udtræk, B = billede - Her har vi 3 udtræk med 3 billeder og teksten fra samme udtræk.
Men 4,5 og 6 fortsætter ovre på højre side, hvor billede og passende tekst udskrives.

Skriv hvis det ikke er forklaret ordenlig :)
Avatar billede tjens Nybegynder
17. januar 2011 - 21:50 #1
Bryd tabellen om til 2 kolonner ved at pakke ind i endnu en tabel:
<table width="400" height="300">
    <tr>
        <td>
            <table>
                <tr>
                    <td width="50" height="75">B1</td>
                    <td width="150" height="75">Tekst 1</td>
                </tr>
                <tr>
                    <td width="50" height="75">B2</td>
                    <td width="150" height="75">Tekst 2</td>
                </tr>
                <tr>
                    <td width="50" height="75">B3</td>
                    <td width="150" height="75">Tekst 3</td>
                </tr>
            </table>
        </td>
        <td>
            <table>
                <tr>
                    <td width="50" height="75">B4</td>
                    <td width="150" height="75">Tekst 4</td>
                </tr>
                <tr>
                    <td width="50" height="75">B5</td>
                    <td width="150" height="75">Tekst 5</td>
                </tr>
                <tr>
                    <td width="50" height="75">B6</td>
                    <td width="150" height="75">Tekst 6</td>
                </tr>
            </table>
        </td>
    </tr>
</table>
Avatar billede EveryMA Mester
17. januar 2011 - 21:58 #2
Men hvordan laver jeg så de 6 udtræk bliver 3 i hver?

Der er 1 stor, også 6 små udtræk under.

den store = storId

select * from x where id <> storId order by id desc limit 0,3

det er rækken til højre.
hvad gør jeg med dem til venstre?
Avatar billede tjens Nybegynder
17. januar 2011 - 23:01 #3
Jeg tror ikke jeg er helt med, men lad mig forstå opstillingen først.

Er det som skitseret her http://tjens.dk/eksperten/929207/svar3.html :

Stort billede og tekst i toppen, og 6 gange billede m. tekst i 2 kolonner neden under?
Avatar billede webweaver Praktikant
17. januar 2011 - 23:01 #4
Er der altid kun de 6 udtræk, eller skal det være dynamisk, så der er flere der eller færre der kan vises?

Ellers kan du jo bare som du gør nu, trække de første 3 ud og vise dem i en tabel. Og så med et andet SQL statement, trække de næste 3 ud, og vise dem i en anden tabel ved siden af.

select * from x where id <> storId order by id desc limit 3,6
Avatar billede EveryMA Mester
18. januar 2011 - 00:05 #5
webweaver - order by id desc limit 3,6
Tager den så alle post's fra id 3 til 6?? Jeg har kunnet spare ufattelig meget tid hvis jeg havde vidst det!! :P

Tjens ->
Korrekt.
Eneste fejl er et Stor billede er øverst og under billedet er teksten. men de 6 små udtræk er korrekt opstilliet.

Og det er dynamisk.
De alle 6 + den store skifter ca. hver dag.
Jeg tilføjer flere posts, så den 6. vil forsvinde for hvert nyt indlæg.
Avatar billede webweaver Praktikant
18. januar 2011 - 02:22 #6
Naah ikke helt. Men tæt på.
Det betyder ikke decideret at den tager rækkerne med id 3, 4, 5 og 6. Men den bruges til at specificere hvilke rækker man vil have.

Det første tal betyder hvor den skal begynde at trække rækker ud fra, og det andet tal betyder hvor mange rækker den skal trække ud. Så 3,6 vil trække 4,5,6,7,8 og 9 ud.

Hvis du vil bruge den til dit ønske specielt, skal den hedde
3,3. Så viser den række 4, 5 og 6 sorteret efter id desc.

select * from x where id <> storId order by id desc limit 3,3
Avatar billede webweaver Praktikant
18. januar 2011 - 02:39 #7
Og så kan jeg se at du skriver at de små skal være dynamiske. Så ville jeg lave noget med at tælle antal af små udtræk i databasen, dividere det med 2 og runde tallet op. Det tal du får der, er antallet du trækker ud i venstre side. Det resterende antal er tallet som du bruger til at trække dem ud i højre side.

I din limit sætter du så variabler inde med disse tal, istedet for at skrive 3,3.
For det er ikke dynamisk.

Så det vil være noget ala,

<?php

// $query her.. Udtræk der trækker de små "rækker" ud.

$count = mysql_num_rows($query);
$split = ceil($count / 2);

// SQL statement til venstre side
select * from x where id <> storId order by id desc limit 0,$split

// SQL statement til højre side
select * from x where id <> storId order by id desc limit $split,$count

?>
Avatar billede tjens Nybegynder
18. januar 2011 - 10:07 #8
Jeg tror jeg er med: Din SQL trækker de 7 nyeste nyheder/artikler/whatever ud, og derfor er der ikke situationer med mindre end 7 records.

Designet i #1 var lavet for at du skulle kunne køre SQLen 1 gang, og så outputte records i den rækkefølge de kommer ind.

Jeg har nu lavet en ny skitse til table-design, hvor de 7 records står i indlæste rækkefølge: http://tjens.dk/eksperten/929207/svar8.html

Hvis du bruger dette table-design kan du nøjes med 1 sql, koden kan skitseres således:
... ...

<style type="text/css">
    table, tr, td {border: none; border-collapse:collapse; margin:0px; padding: 0px;}
    .sb { width: 400px; height: 350px;}
    .st { width: 400px; height: 150px;}
    .lb { width: 50px; height: 75px;}
    .lt { width: 150px; height: 75px;}
</style>
</head>
<% ASP: Læs de 7 records ind fra databasen %>
<body>
<table>
    <tr>
        <td colspan="2">
            <table>
                <tr>
                    <td class="sb">
                        <%  ASP: Læs record 0 felter (= stort billede/tekst)
                            Response.Write IMG-tag stort billede %>

                    </td>
          </tr>
        <tr>
                    <td class="st">
                        <%  ASP:     Response.Write tekst til stort billede %>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
  <tr>
        <td>
            <table>
                <tr>
                    <td class="lb">
                        <%  ASP: Læs record 1 felter
                            Response.Write IMG-tag B1%>

                    </td>
                    <td class="lt">
                        <%  ASP:     Response.Write tekst til B1%>
                    </td>
                </tr>
                <tr>
                    <td class="lb">
                        <%  ASP: Læs record 2 felter
                            Response.Write IMG-tag B2%>

                    </td>
                    <td class="lt">
                        <%  ASP:     Response.Write tekst til B2%>
                    </td>
              </tr>
                <tr>
                    <td class="lb">
                        <%  ASP: Læs record 3 felter
                            Response.Write IMG-tag B3%>

                    </td>
                    <td class="lt">
                        <%  ASP:     Response.Write tekst til B3%>
                    </td>
              </tr>
            </table>
        </td>
        <td>
            <table>
                <tr>
                    <td class="lb">
                        <%  ASP: Læs record 4 felter
                            Response.Write IMG-tag B4%>

                    </td>
                  <td class="lt">
                        <%  ASP:     Response.Write tekst til B4%>
                    </td>
                </tr>
                <tr>
                    <td class="lb">
                        <%  ASP: Læs record 5 felter
                            Response.Write IMG-tag B5%>

                    </td>
                      <td class="lt">
                        <%  ASP:     Response.Write tekst til B5%>
                    </td>
                </tr>
                <tr>
                    <td class="lb">
                        <%  ASP: Læs record 6 felter
                            Response.Write IMG-tag B6%>

                    </td>
                    <td class="lt">
                        <%  ASP:     Response.Write tekst til B6%>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>
</body>
Avatar billede EveryMA Mester
18. januar 2011 - 10:25 #9
Tjens -> Det forstår jeg ikke.

Du skriver:
Læs record X felter
7 gange.

Mit problem er bl.a. er netop hvordan jeg gør det.
Jeg prøvede at opdele den store tabel, til 2 små inde i 1 tabel, som du skrev tidligere, også lagde jeg følgende kode i venstre tabel:
sql = select * from x where id <> storId order by id desc

efter do until x.eof så skrev jeg:
ikVisIgen = x("id")

i min tabel til højre skrev jeg så:

sql = select * from x where id <> ikVisIgen order by id desc

logisk set, så giver det mening, men problemet er, at sql nr. 2 kun "tager hvor id er alt andet end" det SENESTE id, og ikke ALLE de udskrevne ID.
Avatar billede tjens Nybegynder
18. januar 2011 - 10:49 #10
Du skal kun køre 1 SQL, der udtrækker alle 7 records.

Derefter kan du skrive de 7 records ind i HTML-TABLE-designet, som skitseret i #8.

Opdelingen i spalter via en ekstra TABLE, gør at du kan forbruge de 7 records fra SQLen i den rækkefølge du får dem ind.

Når jeg skriver <%  ASP: Læs record 0 felter %> i #8 betyder det at du skal gå frem til første record fra det resultset, som SQL'en har givet som svar, og ikke at der skal køres SQL igen.

Du må vise din ASP-kode til at udføre SQL og løbe igennem de records der kommer ind, hvis jeg skal gå i yderligere detailer.
Avatar billede EveryMA Mester
18. januar 2011 - 11:00 #11
Det som om vi ikke forstår hinanden her :)

For jeg har jo netop ikke noget SQL kode / ASP kode. Det dérfor jeg har oprettet spørgsmålet, for jeg kan ikke finde en løsning på det jeg vil have lavet her! :)

Problemet er, at efter den 3. (af de 6) bliver udskrevet, så skal den 4. vises i højre side. Det er dét jeg ikke kan få den til at gøre.

Jeg husker svagt jeg engang har haft leget med det, hvor det var noget med at tælle hvor mange den havde udskrevet, og if i > 3 then response.write "<td>" . - så det næste (ud af 6) bliver udskrevet på højre side.

Det derfor jeg skrev tilføj en ekstra td :)
Men jeg kan ikk huske helt hvordan.
Avatar billede tjens Nybegynder
18. januar 2011 - 11:26 #12
Et problem kan altid løses på flere forskellige måder.

Dit problem var, at få indlæst i rækkefølge Stor, 1, 4, 2, 5, 3, 6.

Min løsning har en helt anden strategi: Ombryd Table-design, så indlæsningen gerne må være den naturlige/nemme: Stor, 1, 2, 3, 4, 5, 6.

Kig på #8 igen, og bemærk at rækkefølgen i HTML-sourcen er den, som er nem at læse ind, samtidig med at rækkefølgen på linket i #8 er som du har bedt om.
Dermed har du ikke brug for at udføre mere end 1 SQL.

Vedr. VBA kodningen: Jeg går ud fra at du godt kan udføre en sql, og derefter få fat i de enkelt records og deres felter.
I mit løsningsforslag skal records bare ikke trækkes ud i et for-loop, men "hardkodet" i det faste TABLE-design.
Avatar billede webweaver Praktikant
18. januar 2011 - 11:38 #13
Jeg har givet dig en løsning der kan virke. At den så er i PHP fordi at jeg ikke havde set at du har spurgt i ASP kategorien er noget andet :P Men kan skrives om til ASP.

Ellers når jeg laver lignende funktioner normalt, laver jeg den med regnefunktionen modulus. Så kan du få den til at bryde mønsteret om man må så at sige. Det kan være at du kan få det til at virke til det som du vil. Er dog ikke helt sikker, da jeg bruger den til at indsætte <tr> normalt (ikke at man kan indsætte andet), men fordi du vil bryde linien vertikalt istedet for horisontalt.

Igen, jeg roder ikke med ASP, så du får det i PHP. Det bør være nogenlunde til at omskrive for dig.

$number = 0;

// en løkke der behandler dit SQL {

$number++;

if ($number != 0) {
                           
if (($number % 2) == 0) {
                       
echo "<td>\n\n";                                                   
}
                               
}

}
Avatar billede webweaver Praktikant
18. januar 2011 - 11:41 #14
#12

tjens, er problemet ikke at det skal være dynamisk? Som han/hun skriver, er der ikke altid 6 udtræk (foruden det store). Så det kan vel ikke hardcodes på den måde? (jeg er ikke kendt i ASP) Men det ser ud til at hun selv skal ind og lave tabellen manuelt? Se evt. #5
Avatar billede tjens Nybegynder
18. januar 2011 - 11:50 #15
#14 Mit indtryk er, at der er tale om de 7 nyeste artikler/nyheder (eller lignende)

Dermed er der altid 7 records til rådighed.
Avatar billede webweaver Praktikant
18. januar 2011 - 12:44 #16
Ja, det kan selvfølgelig godt være at det er de samme 7 som bare skifter uden at antallet stiger eller falder. I såfald er det selvfølgelig bare at hardcode det som du viser :)
Avatar billede EveryMA Mester
18. januar 2011 - 20:14 #17
Tjens ->

I det kode du skrev i #8, der er mit problem:
Når du skriver:
Læs record 5 f.eks.

Hvordan skal jeg læse præcis 5'eren??

Den hiver det ud fra databasen via et ID nummer.

Er der mange kan ID'et været 320983, er der få kan det være 15 - men det er korrekt, at der ALTID vil være 6 små og 1 stor uanset hvad. - derfor jeg tidligere skrev order by id desc, så den nyeste vises som nr 1 osv.

Øverst skriver du:

<% ASP: Læs de 7 records ind fra databasen %>

Det er det her du hentyder til "kun 1 sql", ikk?

select ... order by id desc limit 0,7

det er de 7 nyeste.
hvad skriver jeg så ved record 5,6 eller 2'eren?
Avatar billede tjens Nybegynder
18. januar 2011 - 21:02 #18
Det er vanskeligt at give eksempler, fordi du ikke har vist noget ASP-kode her i spørgsmålet, da databaser og SQL sikkert kan håndteres på flere måder afhængig af server og miljø. Og jeg kender heller ikke din tabels navn og dens feltnavne.

Så jeg går nu ud fra, at din kode normalt ligner dette: http://www.w3schools.com/ado/showasp.asp?filename=demo_display2

Efter udførsel af SQL med limit har du et resultset med 7 records, som jeg kalder RS

Teksten til f.eks. stort billede kan derefter udskrives direkte med:
response.write( RS("tekstFeltNavn") )
fordi resultsættet automatisk står med første record aktiv.

Når du er færdig med stort billede og tekst udfører du
RS.MoveNext
for at sætte næste record aktiv i resultsættet.

Så er du klar til at aflæse data til billede B1
response.write( RS("billedFeltNavn") )


Så med udførsel af RS.MoveNext efter hver billed/tekst afsnit, vil du komme til næste record. Og TABLE-layoutet sikrer at du kan nøjes med at bruge records i den rækkefølge de kommer ind.

Men vis os andre eksempler på at udføre SQL og hente felter fra andre af dine sider, hvis ovenstående ikke ligner det du plejer at gøre.
Avatar billede EveryMA Mester
18. januar 2011 - 21:18 #19
Hej igen Tjens.

Jeg har lige skrevet lidt asp kode på den, og det virker præcis som det skal.

Min fejl har åbenbart altid været, at jeg har brugt Do Until Rs.eof og Loop'et den til sidst. Men det jo slet ikke nødvendig her.

Løst til punkt og prikke.
Smid et svar :)
Avatar billede tjens Nybegynder
18. januar 2011 - 21:49 #20
Godt at det hang sammen til sidst.
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
Kurser inden for grundlæggende programmering

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