Avatar billede Snupti Nybegynder
08. januar 2012 - 17:17 Der er 19 kommentarer og
1 løsning

Foreach / loop

Hej. Håber jeg kan forklare det godt nok.

Jeg har en database med en masse indhold (timeregistrering)

Alt virker som det skal, jeg vil gerne have lavet en side hvor man kan se alle registreringer delt op alt efter dato de er tilføjet.

Så jeg skal have fat i noget Foreach, men kan ikke få det til at virke.

Hvis jeg har tre registringer den 07-01.2011
Hvis jeg har to registringer den 08-01.2011

Så vil jeg gerne have det bliver vist i hver deres tabel under hinanden.

Håber nogen kan hjælpe mig.. er helt blank på det her område.
08. januar 2012 - 17:48 #1
Det står mig ikke helt klart, hvordan du vil have det vist.  For eksempel, hvis en registrering består af et navn, et tal, og en dato, vil du så have registreringerne skrevet ud således:

Hans 25 03-01-2012
Jens 32 04-01-2012
Sven 13 04-01-2012
Finn 99 06-01-2012

eller:

03-01-2012
Hans 25

04-01-2012
Jens 32
Sven 13

05-01-2012
Finn 99 06-01-2012

eller hvad?
Avatar billede Snupti Nybegynder
08. januar 2012 - 18:07 #2
jeg har i min tabel dette:

start_time,end_time,what_case,place,add_date

Det kan så se sådan her ud:

start_time  end_time  what_case  place  add_date
  07:00                  Q8      KBH  2012-01-08
            15:00        Q8      KBH  2012-01-08
  07:00                  Q8      KBH  2012-01-07
            12:00        Q8      KBH  2012-01-07
  07:00              Jem&fix  Glostrup 2012-01-07
            15:00    Jem&fix  Glostrup 2012-01-07

Vil gerne have et output der er sådan her så:

Dato: 2012-01-08
Start      Slut        Kunde      By      Timer i alt
07:00      15:00      Q8          KBH      08:00 Timer

Dato: 2012-01-07
Start      Slut        Kunde      By      Timer i alt
07:00      12:00      Q8          KBH      05:00 Timer
12:00      15:00      Jem&fix    Glostrup 03:00 Timer

Kan man det?
Håber du forstår det lidt bedre :)
Avatar billede ZafriDK Nybegynder
08. januar 2012 - 18:46 #3
Ang. sortering efter dato, er det selvfølgelig nemmest at lade din database klare det, når du hiver informationerne ud fra den.

Hvis det er en SQL database, kan det klares med et "SELECT * FROM tabel_navn ORDER BY `dato`" ...

Ang. visning af det, så kunne nogen lignende det her måske virke:

<table>
<?php foreach($registreringer as $reg): ?>
<tr>
<td><?php echo $reg['start_time'] ?></td>
<td><?php echo $reg['end_time'] ?></td>
<td><?php echo $reg['what_case'] ?></td>
<td><?php echo $reg['place'] ?></td>
<td><?php echo $reg['add_date'] ?></td>
</tr>
<?php endforeach ?>
</table>
Avatar billede DeeDawg Nybegynder
08. januar 2012 - 19:07 #4
Jeg har ikke testet det af, men dette burde give dig dit ønskede resultat:

<?php
    $datoer = array();
    $query = mysql_query("SELECT add_date FROM tabel");
    while($row = mysql_fetch_assoc($query)){ $datoer[] = $row['add_date']; }
   
    foreach($datoer as $dato){
?>
<p>Dato: <?php echo $dato; ?></p>
<table>
    <tr>
        <td>Start</td>
        <td>Slut</td>
        <td>Kunde</td>
        <td>By</td>
        <td>Timer i alt</td>
    </tr>
<?php
        $query = mysql_query("SELECT * FROM tabel WHERE add_date = '".$dato."'");
        while($row = mysql_fetch_assoc($query)){
            $start = $row['start_time'];
            $end = $row['end_time'];
            list($t1, $m1) = sscanf($start, "%d:%d");
            list($t2, $m2) = sscanf($end, "%d:%d");
           
            $timer = ($t2 - $t1) + ($m2 - $m1) / 60;
            if($timer < 0){ $timer = $timer + 24; }
?>
    <tr>
        <td><?php echo $start; ?></td>
        <td><?php echo $end; ?></td>
        <td><?php echo $row['what_case']; ?></td>
        <td><?php echo $row['place']; ?></td>
        <td><?php echo round($timer, 1); ?> Timer</td>
    </tr>
<?php
        }
?>
</table>
<?php
    }
?>
Avatar billede Snupti Nybegynder
08. januar 2012 - 19:12 #5
hej igen. tak for svaret. nu er jeg ikke prøvet at lavet noget med foreach før.

Kunne jeg få dig til at skrive hvordan jeg for det til at vise noget som helst ?

jeg har prøvet sådan her:

        <?php include('inc/connection.php');
$registreringer = mysql_query("SELECT * FROM time_reg WHERE user = 'Dennis'");

foreach($registreringer as $reg): ?>
<tr>
<td><?php echo $reg['start_time'] ?></td>
<td><?php echo $reg['end_time'] ?></td>
<td><?php echo $reg['what_case'] ?></td>
<td><?php echo $reg['place'] ?></td>
<td><?php echo $reg['add_date'] ?></td>
</tr>
<?php endforeach ?>
</table>

Men mangler jeg ikke noget før foreach?? :D
Avatar billede Snupti Nybegynder
08. januar 2012 - 19:17 #6
DeeDawg
DeeDawg.

Jeg for dette output:

Dato: 2012-01-08
Start     Slut     Kunde     By     Timer i alt

Dato: 2012-01-08
Start     Slut     Kunde     By     Timer i alt

Dato: 2000-01-01
Start     Slut     Kunde     By     Timer i alt

Dato: 2012-01-07
Start     Slut     Kunde     By     Timer i alt

Dato: 2012-01-07
Start     Slut     Kunde     By     Timer i alt

Vil gerne bare have en tabel for hver dato med flere rækker i

Også noget input i tabelen ud over Dato. :)
Avatar billede Snupti Nybegynder
08. januar 2012 - 19:19 #7
min fejl. virker fint nu, Næsten.

Mangler lige at jeg kun vil have en tabel pr. dato.
Avatar billede Snupti Nybegynder
08. januar 2012 - 19:20 #8
blot til info, så for jeg dette output:

Dato: 2012-01-08
Start     Slut     Kunde     By     Timer i alt
    16:41     jem&fix     2011 011     16.7 Timer
11:49     12:49     jem&fix     2011 011     1 Timer

Dato: 2012-01-08
Start     Slut     Kunde     By     Timer i alt
    16:41     jem&fix     2011 011     16.7 Timer
11:49     12:49     jem&fix     2011 011     1 Timer

Dato: 2000-01-01
Start     Slut     Kunde     By     Timer i alt
    00:00     Bruger Oprettet         0 Timer

Dato: 2012-01-07
Start     Slut     Kunde     By     Timer i alt
17:07         jem&fix     2011 011     6.9 Timer
    17:07     jem&fix     2011 011     17.1 Timer

Dato: 2012-01-07
Start     Slut     Kunde     By     Timer i alt
17:07         jem&fix     2011 011     6.9 Timer
    17:07     jem&fix     2011 011     17.1 Timer
Avatar billede inteeeL Nybegynder
08. januar 2012 - 19:23 #9
Flot kode ellers, DeeDawg.
Avatar billede Snupti Nybegynder
08. januar 2012 - 19:33 #10
Tilføjede GROUP BY add_date in, og virker fint nu.

Kan jeg så få dig til at gøre sådan den viser TIMER præcist?

Stedet for 11.9

at den så kommer med fx. 11 timer og 58 min.??
Avatar billede Snupti Nybegynder
08. januar 2012 - 19:37 #11
Fik det hele til at virke..

Smid et svar.. var kanont med din hjælp.

hvis andre skulle få brug for det, så ser samlet kode sådan her ud:

    <?php

// time tæller
function get_time_difference( $start, $end )
{
    $uts['start']      =    strtotime( $start );
    $uts['end']        =    strtotime( $end );
    if( $uts['start']!==-1 && $uts['end']!==-1 )
    {
        if( $uts['end'] >= $uts['start'] )
        {
            $diff    =    $uts['end'] - $uts['start'];
            if( $days=intval((floor($diff/86400))) )
                $diff = $diff % 86400;
            if( $hours=intval((floor($diff/3600))) )
                $diff = $diff % 3600;
            if( $minutes=intval((floor($diff/60))) )
                $diff = $diff % 60;
            $diff    =    intval( $diff );           
            return( array('days'=>$days, 'hours'=>$hours, 'minutes'=>$minutes, 'seconds'=>$diff) );
        }
        else
        {
            trigger_error( "Ending date/time is earlier than the start date/time", E_USER_WARNING );
        }
    }
    else
    {
        trigger_error( "Invalid date/time data detected", E_USER_WARNING );
    }
    return( false );
}
?>
        <?php include('inc/connection.php');
    $datoer = array();
    $query = mysql_query("SELECT * FROM time_reg GROUP BY add_date");
    while($row = mysql_fetch_assoc($query)){ $datoer[] = $row['add_date']; }
   
    foreach($datoer as $dato){
?>
<p>Dato: <?=$dato; ?></p>
<table>
    <tr>
        <td>Start</td>
        <td>Slut</td>
        <td>Kunde</td>
        <td>By</td>
        <td>Timer i alt</td>
    </tr>
<?php
        $query = mysql_query("SELECT * FROM time_reg WHERE add_date = '".$dato."'");
        while($row = mysql_fetch_assoc($query)){
            $start = $row[start_time];
            $end = $row['end_time'];
            list($t1, $m1) = sscanf($start, "%d:%d");
            list($t2, $m2) = sscanf($end, "%d:%d");
           
            $timer = ($t2 - $t1) + ($m2 - $m1) / 60;
            if($timer < 0){ $timer = $timer + 24; }
?>
    <tr>
        <td><?=$start; ?></td>
        <td><?=$end; ?></td>
        <td><?=$row['what_case']; ?></td>
        <td><?=$row['place']; ?></td>
        <td>
                              <?php
          $enddate = mysql_fetch_array($low_id);
          $end_time = $enddate[end_time];
        //start tid kommer herfra
        $startdate = mysql_fetch_array($higher_id);
          $start_time = $startdate[start_time];
       
       
                      // a START time value
$start = $row[start_time];
// an END time value
$end = $row[end_time];

// what is the time difference between $end and $start?
if( $diff=@get_time_difference($start, $end) )
{
  echo sprintf( '%02d:%02d', $diff['hours'], $diff['minutes'] );

 
}
else
{
  echo "Angiv slut tidspunkt";
}
?>
Timer</td>
    </tr>
<?php
        }
?>
</table>
<?php
    }
?>
Avatar billede Snupti Nybegynder
08. januar 2012 - 19:53 #12
lige en sidste ting inden den bliver helt lukket.

Hvordan for jeg den til at tage "timer i alt" og ligge dem alle sammen så jeg kan se det samlet antal timer for den dag?
Avatar billede DeeDawg Nybegynder
08. januar 2012 - 19:58 #13
Det var så lidt. :)
Avatar billede Snupti Nybegynder
08. januar 2012 - 20:28 #14
Kunne du hurtigt se om jeg kan få det samlet time tal lagt sammen ud fra mit script?
Avatar billede DeeDawg Nybegynder
09. januar 2012 - 01:51 #15
Ser da ud til, at jeg sad med en ikke opdateret tråd, da jeg svarede. Tak igen, Eksperten.dk, ffs!


Da du nu har fundet en fin funktion her, kan vi da også få den til at udregne det samlede antal for dig. Således:

<?php
    include("connection.php");
   
    $datoer = array();
    $query = mysql_query("SELECT add_date FROM time_reg GROUP BY add_date");
    while($row = mysql_fetch_assoc($query)){ $datoer[] = $row['add_date']; }
   
    foreach($datoer as $dato){
        $ialt = array(strtotime("00:00"), strtotime("00:00"));
?>
<p>Dato: <?php echo $dato; ?></p>
<table>
    <tr>
        <td>Start</td>
        <td>Slut</td>
        <td>Kunde</td>
        <td>By</td>
        <td>Timer</td>
        <td>Timer i alt</td>
    </tr>
<?php
        $query = mysql_query("SELECT * FROM time_reg WHERE add_date = '".$dato."'");
        while($row = mysql_fetch_assoc($query)){
            $start = $row['start_time'];
            $end = $row['end_time'];
            if($diff = @get_time_difference($start, $end)){ $ialt[1] = strtotime("+".$diff['hours']." hours ".$diff['minutes']." minutes", $ialt[1]); }
            else{ echo "Angiv slut tidspunkt"; }
?>
    <tr>
        <td><?php echo $start ?></td>
        <td><?php echo $end; ?></td>
        <td><?php echo $row['what_case']; ?></td>
        <td><?php echo $row['place']; ?></td>
        <td><?php echo $diff['hours'].":".$diff['minutes']; ?></td>
    </tr>
<?php
        }
       
        $ialt = @get_time_difference(date("Y-d-m H:i", $ialt[0]), date("Y-d-m H:i", $ialt[1]));
?>
    <tr>
        <td colspan="5"></td>
        <td><?php echo ($ialt['days'] > 0 ? $ialt['hours'] + ($ialt['days'] * 24) : $ialt['hours']).":".$ialt['minutes']; ?></td>
    </tr>
</table>
<?php
    }
?>

Som du kan se, har jeg markeret det der udfører opgaven, med rødt. ;)
Avatar billede Snupti Nybegynder
09. januar 2012 - 04:53 #16
Mange tak igen..

Kan ikke få den til at vise noget.

her er mit script

<?php

// time tæller
function get_time_difference( $start, $end )
{
    $uts['start']      =    strtotime( $start );
    $uts['end']        =    strtotime( $end );
    if( $uts['start']!==-1 && $uts['end']!==-1 )
    {
        if( $uts['end'] >= $uts['start'] )
        {
            $diff    =    $uts['end'] - $uts['start'];
            if( $days=intval((floor($diff/86400))) )
                $diff = $diff % 86400;
            if( $hours=intval((floor($diff/3600))) )
                $diff = $diff % 3600;
            if( $minutes=intval((floor($diff/60))) )
                $diff = $diff % 60;
            $diff    =    intval( $diff );           
            return( array('days'=>$days, 'hours'=>$hours, 'minutes'=>$minutes, 'seconds'=>$diff) );
        }
        else
        {
            trigger_error( "Ending date/time is earlier than the start date/time", E_USER_WARNING );
        }
    }
    else
    {
        trigger_error( "Invalid date/time data detected", E_USER_WARNING );
    }
    return( false );
}
?>
        <?php include('inc/connection.php');
    $datoer = array();
    $query = mysql_query("SELECT * FROM time_reg WHERE user='".$_GET[user]."' AND add_date >= '".$_GET[from_date]."' AND add_date <= '".$_GET[to_date]."' GROUP BY add_date ORDER BY add_date desc");
    while($row = mysql_fetch_assoc($query)){ $datoer[] = $row['add_date']; }
   
    foreach($datoer as $dato){
       
        $query = "SELECT * FROM time_reg GROUP BY add_date ORDER BY add_date desc";
    $result = mysql_query($query) or die(mysql_error());
    $row = mysql_fetch_array($result) or die(mysql_error());
?>
<table width="700" border="0" cellspacing="0" cellpadding="0" class="tid_dag">
  <tr>
    <td><h3> <?= strftime ("%A", strtotime($dato));?> Den
<?= date("d/m/Y", strtotime($dato));?> - Medarbejder - <?= $row[user]; ?>
      </h3>
<table width="700px">
  <tr>
        <td width="80">Start</td>
        <td width="80">Slut</td>
        <td width="215">Kunde</td>
        <td width="215">Sag</td>
        <td width="203">Samlet tid</td>
        <td width="203">Tjek ip</td>
    </tr>
<?php
        $query = mysql_query("SELECT * FROM time_reg WHERE add_date = '".$dato."'");
        while($row = mysql_fetch_assoc($query)){
            $start = $row[start_time];
            $end = $row['end_time'];
            list($t1, $m1) = sscanf($start, "%d:%d");
            list($t2, $m2) = sscanf($end, "%d:%d");
           
            $timer = ($t2 - $t1) + ($m2 - $m1) / 60;
            if($timer < 0){ $timer = $timer + 24; }
?>
    <tr>
        <td><?=$start; ?></td>
        <td><?=$end; ?></td>
        <td><?=$row['what_case']; ?></td>
        <td><?=$row['place']; ?></td>
        <td>
                              <?php
                      // a START time value
$start = $row[start_time];
// an END time value
$end = $row[end_time];

// what is the time difference between $end and $start?
if( $diff=@get_time_difference($start, $end) )
{
  echo sprintf( '%02d:%02d', $diff['hours'], $diff['minutes'] );

 
}
else
{
  echo "Angiv slut tidspunkt";
}
?></td>
        <td><a href="http://whatismyipaddress.com/ip/<?=$row[ip]?>" target="_blank">Spor ip</a></td>

    </tr>

<?php
        }
?>
</table>

<?php
    }
?>

har en lille opgave mere til dig, men opretter en tråd mere på den hvis du har lyst til at hjælpe lidt mere
Avatar billede DeeDawg Nybegynder
09. januar 2012 - 05:56 #17
Jeg har givet dig, et fuldt eksempel, som er ordentlig organiseret og afprøvet. Det virker.

Alligevel vælger du at fortsætte med dit eget, som endda er fyldt med ting, der ikke er brug for længere. Derudover, beder du om hjælp igen, fordi det ikke virker, og du har endda ikke engang tilføjet de ting jeg viste dig.

Gør mig egentlig ikke rigtig i humør, til at hjælpe dig videre.
Avatar billede Snupti Nybegynder
09. januar 2012 - 12:34 #18
ja, du må meget undskylde jeg ikke ved så meget om php..

men jeg ved dog at jeg har taget en kopi af det du sende mig og sat ind på en side ændret sti til connection.php
og set om det virkede, det jeg for frem er det her:
Dato: 2000-01-01
Start     Slut     Kunde     By     Timer     Timer i alt

og ikke mere, derfor sende jeg dig det jeg brugte og håbede måske du kunne sætte det sammen, men det er helt i orden.

Giver dig point for hjælpen, Stor hjælp. Takker
Avatar billede DeeDawg Nybegynder
09. januar 2012 - 19:52 #19
Jeg skal gerne sætte det sammen for dig, Snupti. Jeg er bare nødt til at vide at du bruger det jeg giver dig.

Ellers føler jeg at jeg spilder min tid, og det er ikke fedt, når man egentlig bare prøver at hjælpe folk. Og jeg kunne ikke se, at du benyttede det sidste indlæg jeg gav dig, og derfor skrev jeg den kommentar.

Jeg har afprøvet det sidste eksempel jeg gav dig, og det fungerer altså, så der må være gået noget galt et andet sted.

Hvis du ønsker, kan du evt. sende mig en PM. ;)
Avatar billede Snupti Nybegynder
09. januar 2012 - 20:02 #20
Hej igen, også helt i orden, jeg bruger din kode, men du må meget gerne smide det hele sammen for mig.

Kunne det lade sig gøre at den regner sammen for hver dag

så hvis jeg vælger at den skal vise mig fra den 01 jan til den 09 jan. så den viser timer per dag der er brugt.

og så til sidst den også viser mig samlet antal brugt timer..

fx:
Mandag den 01-01-2011
Start     Slut     Kunde             Sag             Samlet tid
12:33     14:03     Jem Og Fix     Butik 12     01:30
07:30     09:23     Jem Og Fix     Butik 12     01:53
                          Timer i alt:     3:24
Tirsdag den 02-01-2011
Start     Slut     Kunde             Sag             Samlet tid
12:33     14:03     Jem Og Fix     Butik 12     01:30
07:30     09:23     Jem Og Fix     Butik 12     01:53
                          Timer i alt:     3:24

Samlet tid for valgte periode: 6:48
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