[php] Binnen een while lusje het einde detecteren?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • The Milkman
  • Registratie: Maart 2004
  • Laatst online: 12-09 20:42

The Milkman

█████░░░░░ 50%

Topicstarter
Hoe kan ik binnen een while-lus die van een sql query komt laten detecteren dat het de laatste data die binnenkomt is?

Na elke regel die hij uit de database haalt moet een streepje komen, maar als de laatste regel is opgehaald, wil ik geen streepje.

Ik dacht dat dit erg simpel was. Maar wie helpt mij even? Bedankt!

Dit had ik al bedacht:

code:
1
2
3
4
5
6
7
    while ($row = mysql_fetch_array($sql)) {
        if ($row) {
            $splitter = "<br><br>---<br><br>";
        }
        echo "<tr><td><b>$row[date]</b> $row[city]<br>@ $row[location]<br> <i>$row[description]</i>".$splitter."</td></tr>";
    }
    echo '</table>';

𓆑 𓆑 𓆑 𓆑 𓆑 𓆑


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Die if($row)-conditie hoef je niet uit te voeren, die heb je een regel erboven ook al uitgevoerd :) beter gebruik je een aparte variabele, dus zoiets:

code:
1
2
3
4
5
6
7
8
9
10
$streep = false;
while (...)
{
    if ($streep)
    {
        // streepje
    }
    // laat rij zien
    $streep = true;
}

[ Voor 65% gewijzigd door JeRa op 06-01-2007 10:59 ]

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • The Milkman
  • Registratie: Maart 2004
  • Laatst online: 12-09 20:42

The Milkman

█████░░░░░ 50%

Topicstarter
Ik bedoel. hij plaatst een streepje: --- na elk record...
Maar na het laatste record wil ik dat ie dat weglaat...

𓆑 𓆑 𓆑 𓆑 𓆑 𓆑


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

mysql_num_rows() en bijhouden of je bij de laatste bent.

[ Voor 3% gewijzigd door CyBeR op 06-01-2007 11:06 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

Kan je dan niet beter vóór elk record een streepje neerzetten behalve de eerste keer? Dat lijkt me makkelijker.

Acties:
  • 0 Henk 'm!

Verwijderd

Zoiets?
code:
1
2
3
4
5
6
7
8
9
10
       $row = mysql_fetch_array($sql);
    while ($row) {
              echo "<tr><td><b>$row[date]</b> $row[city]<br>@ $row[location]<br> <i>$row[description]</i>".$splitter."</td></tr>";

              $row = mysql_fetch_array($sql)
        if ($row) {
            $splitter = "<br><br>---<br><br>";
        }
        
    }

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op zaterdag 06 januari 2007 @ 11:06:
Zoiets?
code:
1
2
3
4
5
6
7
8
9
10
       $row = mysql_fetch_array($sql);
    while ($row) {
              echo "<tr><td><b>$row[date]</b> $row[city]<br>@ $row[location]<br> <i>$row[description]</i>".$splitter."</td></tr>";

              $row = mysql_fetch_array($sql)
        if ($row) {
            $splitter = "<br><br>---<br><br>";
        }
        
    }
Dat werkt niet. Ten eerste ga je maar een rij aan data krijgen wnat je roept mysql_fetch_array() maar een keer aan, ten tweede als je met $row in de while komt, heb je altijd een $row en krijg je dus altijd een $splitter.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • E-Vix
  • Registratie: Juni 2000
  • Laatst online: 19-09 14:42

E-Vix

Nu met sneeuw!

Het volgende werkt in jouw geval:
Als het de eerste keer is, dan wordt het streepje niet voor de regel getekend, en bij de laatste keer wordt hij dus ook niet na je regel getekend.
Het kan mooier, beter en netter, maar mijn douche roept mij ;)

PHP:
1
2
3
4
5
6
7
8
9
10
    $streepje = false; 
    while ($row = mysql_fetch_array($sql)) {
        if($streepje) { 
            echo("<br><br>---<br><br></td></tr>")
        } else {
            $streepje = true;
        }
        echo "<tr><td><b>$row[date]</b> $row[city]<br>@ $row[location]<br> <i>$row[description]</i>";
    }
      echo '</td></tr></table>';

[ Voor 6% gewijzigd door E-Vix op 06-01-2007 11:14 ]

Failed opening '/home/users/7942/signature.inc' for inclusion (include_path='.:') in /home/www/got/userstats.php on line 25


Acties:
  • 0 Henk 'm!

Verwijderd

CyBeR schreef op zaterdag 06 januari 2007 @ 11:07:
Dat werkt niet. Ten eerste ga je maar een rij aan data krijgen wnat je roept mysql_fetch_array() maar een keer aan, ten tweede als je met $row in de while komt, heb je altijd een $row en krijg je dus altijd een $splitter.
Ik ben niet bekend met php, en eigenlijk wil ik dat ook zo houden. Maar ik roep wel degelijk meerdere malen mysql_fetch_array() aan. Ik heb dus simpelweg herschreven wat in de openingspost stond naar iets wat dan correct zou moeten werken (voorwaarde dat wat in de openingspost 1 streepje teveel plaatste)

Acties:
  • 0 Henk 'm!

  • The Milkman
  • Registratie: Maart 2004
  • Laatst online: 12-09 20:42

The Milkman

█████░░░░░ 50%

Topicstarter
Ik denk dat ik me met num_rows wel redt. Ik ga het ff proberen.
Dank jullie wel :)

𓆑 𓆑 𓆑 𓆑 𓆑 𓆑


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Verwijderd schreef op zaterdag 06 januari 2007 @ 11:12:
[...]
Ik ben niet bekend met php, en eigenlijk wil ik dat ook zo houden. Maar ik roep wel degelijk meerdere malen mysql_fetch_array() aan. Ik heb dus simpelweg herschreven wat in de openingspost stond naar iets wat dan correct zou moeten werken (voorwaarde dat wat in de openingspost 1 streepje teveel plaatste)
Hum, die tweede had ik even langs gekeken omdat 't een wat.. onconventionele manier is om dit te doen. In theorie werkt 't dan idd wel, maar om 't een nette manier te noemen...

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

Verwijderd

CyBeR schreef op zaterdag 06 januari 2007 @ 11:15:
Hum, die tweede had ik even langs gekeken omdat 't een wat.. onconventionele manier is om dit te doen. In theorie werkt 't dan idd wel, maar om 't een nette manier te noemen...
Misschien onconventioneel in php land, maar in het land van echte programmeertalen gebruiken we iterators (of een vorm daarvan) en is dit eigenlijk wel een hele conventionele aanpak :>

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zaterdag 06 januari 2007 @ 11:20:
[...]
Misschien onconventioneel in php land, maar in het land van echte programmeertalen gebruiken we iterators (of een vorm daarvan) en is dit eigenlijk wel een hele conventionele aanpak :>
In PHP zit de iterator van een Sql variabele in diezelfde variabele. Ik geloof dat er in de manual zoiets staat als "an internal pointer that jumps to the next when you fetch the array".

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zaterdag 06 januari 2007 @ 11:36:
In PHP zit de iterator van een Sql variabele in diezelfde variabele. Ik geloof dat er in de manual zoiets staat als "an internal pointer that jumps to the next when you fetch the array".
Het gaat er niet om of een iterator wel of niet in php zit, dat is namelijk een saaie oninteressante discussie. Het gaat erom dat een hetgeen ik eerder illustreerde juist een behoorlijk conventionele aanpak is. Geen geneuzel met rijen tellen of extra loop variabelen maar simpelweg gebruik maken van de middelen die je al hebt.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zaterdag 06 januari 2007 @ 11:50:
[...]
Het gaat er niet om of een iterator wel of niet in php zit, dat is namelijk een saaie oninteressante discussie. Het gaat erom dat een hetgeen ik eerder illustreerde juist een behoorlijk conventionele aanpak is. Geen geneuzel met rijen tellen of extra loop variabelen maar simpelweg gebruik maken van de middelen die je al hebt.
Tja, zo werkt dat dan ook. Je hebt helemaal geen num_rows nodig.

PHP:
1
2
3
4
5
6
7
mysql_data_seek($result, 0); //resets sql-result, if used before
while( $row = mysql_fetch_array( $result, MYSQL_ASSOC );
{
        echo $row['fieldname1'] .
             ' - ' .
             $row['fieldname2'];
}


edit:
Ok, ik snap wat je bedoelt. Die $row is in principe overbodig. Ik geloof dat je vanaf PHP5 ook direct op $result een foreach kan gebruiken. Het nadeel van foreach bij PHP is echter dat het de data kopieert voordat het er doorheen loopt. Dat kan je misschien weer omzeilen door "&" te gebruiken.

@hieronder:
Whatever pleases you ;) Mij maakt het niet zo veel uit. Mijn editor highlight toch automatisch variabelen binnen double-quotes.

[ Voor 25% gewijzigd door Verwijderd op 06-01-2007 12:09 ]


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 18-09 22:29
Offtopic at hierboven:
Wil je wel zovriendelijk zijn om even je Variable buiten quotes te plaatsen en singlecoutes te gebruiken. Staat toch iets netter en proffesioneler ;)

Ontopic:
Je kunt je result toch gewoon tijdelijk in een var zetten? Dan met substr de laatste x chars weghalen.

[ Voor 25% gewijzigd door Depress op 06-01-2007 12:06 ]


Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Als mijn code (eerste reply in dit topic) dan toch genegeerd gaat worden dan zou ik net zolief even willen horen wat er mis mee is :P

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Depress schreef op zaterdag 06 januari 2007 @ 12:05:
Offtopic at hierboven:
Wil je wel zovriendelijk zijn om even je Variable buiten quotes te plaatsen en singlecoutes te gebruiken. Staat toch iets netter en proffesioneler ;)
Single of double quotes maken geen ene donder uit. Tuurlijk, je spaart op een hele pagina misschien 3 microseconde, maar als je dat soort optimalisaties al nodig hebt, dan is er elders toch al heel wat mis met je site. ;)

Overigens is dit alles ook met een do...while loop te doen, maar dat betekent wel een extra check vooraf. :P

[ Voor 9% gewijzigd door NMe op 06-01-2007 13:13 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

JeRa schreef op zaterdag 06 januari 2007 @ 13:08:
Als mijn code (eerste reply in dit topic) dan toch genegeerd gaat worden dan zou ik net zolief even willen horen wat er mis mee is :P
Er is niets mis mee. Ik suggereerde hetzelfde in mijn eerste post. Ik had eroverheen gelezen omdat de TS eronder meteen zei dat het niet de oplossing voor zijn probleem was (maar dat is het volgens mij wel).

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Je tweede script is ook niet echt lekker DOT :P

Anyway, ik denk dat mark platvoet's code nog het 'mooist' is. Het mag dan onconventioneel zijn in PHP, het is in feite een heel juist manier om het te doen.

offtopic:
Ik denk dat het er gewoon niet mooi uitziet omdat het niet gehighlight wordt, en de tabs verkeerd staan)

Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 06:15
JeRa schreef op zaterdag 06 januari 2007 @ 13:08:
Als mijn code (eerste reply in dit topic) dan toch genegeerd gaat worden dan zou ik net zolief even willen horen wat er mis mee is :P
Er is niets mee mis... Dit lijkt mij ook de simpelste oplossing, en hij werkt prima. Ik snap alleen even niet waarom dit volgens de TS niet voldoet... De streep komt immers gewoon na elke regel, behalve na de laatste... 8)7

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 06:29
The Milkman schreef op zaterdag 06 januari 2007 @ 10:59:
Ik bedoel. hij plaatst een streepje: --- na elk record...
Maar na het laatste record wil ik dat ie dat weglaat...
Dat is precies wat JeRa doet.

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

Verwijderd

Patriot schreef op zondag 07 januari 2007 @ 16:21:
Je tweede script is ook niet echt lekker DOT :P
Moet ik er anders een poll van maken? 8)7

Take your pick:

PHP:
1
echo "$var1 - $var2";
PHP:
1
echo $var1 . ' - ' . $var2;
PHP:
1
2
3
echo    $var1 .
        ' - ' .
        $var2;
PHP:
1
2
3
echo $var1;
echo ' - ';
echo $var2;
PHP:
1
printf("%s - %s", $var1, $var2);


Ik vind alles best, zolang er maar 1 stijl in 1 programma wordt gebruikt, en zo min mogelijk escapes.

Anyway, ik denk dat mark platvoet's code nog het 'mooist' is. Het mag dan onconventioneel zijn in PHP, het is in feite een heel juist manier om het te doen.

offtopic:
Ik denk dat het er gewoon niet mooi uitziet omdat het niet gehighlight wordt, en de tabs verkeerd staan)
Mark's code, gepseudo'd:
PHP:
1
2
3
4
5
6
7
8
9
10
//fetch volgende rij
//while rij gefetcht
    //laat rij zien
    //laat splitter zien

    //fetch volgende rij
    //if rij gefetcht
        //definieer splitter
    //endif
//endwhile

Ik denk dat het wel werkt, maar voor PHP is het logischer om 1x mysql_fetch_array in je code te hebben staan. Een PHP-er die hier snel doorheen leest zal denken dat er 2 verschillende sql-results gefetcht worden.

Ook het echo-en van $splitter terwijl die niet gedefinieerd is, vind ik niet zo netjes.

[ Voor 53% gewijzigd door Verwijderd op 07-01-2007 17:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zondag 07 januari 2007 @ 17:11:
Mark's code, gepseudo'd:
PHP:
1
2
3
4
5
6
7
8
9
10
//fetch volgende rij
//while rij gefetcht
    //laat rij zien
    //laat splitter zien

    //fetch volgende rij
    //if rij gefetcht
        //definieer splitter
    //endif
//endwhile

Ik denk dat het wel werkt, maar voor PHP is het logischer om 1x mysql_fetch_array in je code te hebben staan. Een PHP-er die hier snel doorheen leest zal denken dat er 2 verschillende sql-results gefetcht worden.

Ook het echo-en van $splitter terwijl die niet gedefinieerd is, vind ik niet zo netjes.
Euh nee, het moet dit zijn:
PHP:
1
2
3
4
5
6
7
8
9
//fetch volgende rij
//while rij gefetcht
    //laat rij zien

    //fetch volgende rij
    //if rij gefetcht
        //print splitter
    //endif
//endwhile

Een php-er die er snel doorheen leest en denkt dat er twee verschillende queries worden uitgevoerd is simpelweg een prutser.
Modbreak:Zullen we het gezellig houden? :>

[ Voor 3% gewijzigd door RobIII op 07-01-2007 18:44 ]

Pagina: 1