Avatar billede t-johansen Juniormester
15. januar 2016 - 09:25 Der er 10 kommentarer og
1 løsning

while loop med dato

Hej, jeg er lidt nybegynder med php.

Jeg er igang med at prøve at lave en while loop med et dato interval.

Og har fået den til at lægge én dag til og køre loopen indtil den har været igennem 14 dage.

Men den vil ikke udtrække "levdato" fra SQL udfra hver dag den kører igennem.

I min sql database er feltet "levdato" i dato format yyyy-mm-dd.
Blandt andet indeholder en row med 2016-01-16 og en med 2016-01-20.


Noget der undrer mig er at flere steder skal jeg bruge strtotime hvor andre steder skal der ikke være strtotime.


Ved godt jeg ikke har brugt SQLi men det kigger jeg snart på.


Når jeg kører nedenstående kode er resultatet:


Dagsdato 2016-01-15
Dato om 14 dage 2016-01-29

Start while
2016-01-15
2016-01-15
2016-01-16
2016-01-17
2016-01-18
2016-01-19
2016-01-20
2016-01-21
2016-01-22
2016-01-23
2016-01-24
2016-01-25
2016-01-26
2016-01-27
2016-01-28
2016-01-29
1




Her php-koden:

<?php
    $i=0;
    $dagsdato = date("Y-m-d");
    $dagsdato_14 = strtotime($dagsdato."14 days");
    $dagsdato_1 = $dagsdato;


    /* test variabler */
    echo "Dagsdato ".$dagsdato;
    echo "<br>";
    echo "Dato om 14 dage ".date("Y-m-d",$dagsdato_14);
    echo "<br>"
    echo "<br>";
    echo "Start while<br>";


    while ( strtotime($dagsdato_1) <= $dagsdato_14 )

    {


    echo $dagsdato_1;
    echo "<br>";
?>



            <?php
            $leveringsliste = mysql_query("SELECT * FROM `vognliste` WHERE `firma` = $firmaid AND `levdato` = $dagsdato_1 ORDER BY `levdato` ASC",$db);
              while($row = mysql_fetch_object($leveringsliste))
                {
                    echo "<div style=\"\">$row->levdato</div>";
                }
            ?>
       
<?
$dagsdato_1 = date("Y-m-d", strtotime($i++." day", strtotime($dagsdato)));
}
?>
Avatar billede jakobdo Ekspert
15. januar 2016 - 09:45 #1
Du blander lidt rundt i unixtime og date i string.
Prøv lige i en "ren" sql og lav:

SELECT * FROM `vognliste` WHERE `firma` = "FIRMA_ID" AND `levdato` = '2016-01-20' ORDER BY `levdato` ASC"

Virker det f.eks. ?

Test i phpmyadmin.
Avatar billede t-johansen Juniormester
15. januar 2016 - 10:10 #2
Når jeg kører den i phpmyadmin:

SELECT * FROM `vognliste` WHERE `firma` = "FIRMA_ID" AND `levdato` = '2016-01-20' ORDER BY `levdato` ASC

så siger gennemført men med nul resultater.

men det underlige er at når jeg kigger i phpmyadmin i structure og kiggerpå feltet levdato, så er typen "date" og det indhold jeg har lagt i en row er eks 2016-01-20.


Eks indsat med følgende i phpmyadmin:

INSERT INTO `vognliste`(`vognid`, `levdato`, `firma`) VALUES ("1111111","2016-01-20","4")
Avatar billede jakobdo Ekspert
15. januar 2016 - 10:12 #3
Hvad med denne?
SELECT * FROM `vognliste` WHERE `levdato` = '2016-01-20' ORDER BY `levdato` ASC

Altså uden firmaid.
Giver det et resultat retur ?
SElvom du bruger datatypen date, så er det stadig "bare" en string.
Avatar billede t-johansen Juniormester
15. januar 2016 - 10:20 #4
Beklager det med "firma = $firmaid" er en rest da jeg rensede koden for at lægge eksempelt ind er i eksperten.

så denskal selvfølgelig ikke være der, da  variablen ikke er med i eksempel koden.

Så ja uden firma i sql så henter den oplysningerne i phpmyadmin, men ikke i min eksempel kode.
Avatar billede t-johansen Juniormester
15. januar 2016 - 10:22 #5
jeg tror min fejl ligger et sted i denne del:

`levdato` = $dagsdato_1

af denne sql:

$leveringsliste = mysql_query("SELECT * FROM `vognliste` Where `levdato` = $dagsdato_1 ORDER BY `levdato` ASC",$db);



sikkert fordi som du skriver sikkert er gemt som string.
Avatar billede jakobdo Ekspert
15. januar 2016 - 10:23 #6
Mit gæt kunne være din kode skal se sådan her ud:

$leveringsliste = mysql_query("SELECT * FROM `vognliste` WHERE `levdato` = '".$dagsdato_1."' ORDER BY `levdato` ASC",$db);

Overvej dog at brug prepared statements..
Avatar billede t-johansen Juniormester
15. januar 2016 - 10:27 #7
MERCI

det var lige præcis der fejlen lå.

må jeg spørge hvorfor der skal ".  og ."  foran og bagved?
Avatar billede t-johansen Juniormester
15. januar 2016 - 10:29 #8
nu er resulatatet forresten sådan her:



est variabler
Dagsdato 2016-01-15
Dato om 14 dage 2016-01-29

Start while
2016-01-15
Udtræk fra SQL:
2016-01-15
Udtræk fra SQL:
2016-01-15
Udtræk fra SQL:
2016-01-15
2016-01-15
Udtræk fra SQL:
2016-01-15
Udtræk fra SQL:
2016-01-15
Udtræk fra SQL:
2016-01-15
2016-01-16
2016-01-17
2016-01-18
2016-01-19
2016-01-20
Udtræk fra SQL:
2016-01-20
Udtræk fra SQL:
2016-01-20
2016-01-21
2016-01-22
2016-01-23
2016-01-24
2016-01-25
2016-01-26
2016-01-27
2016-01-28
2016-01-29
1

Avatar billede jakobdo Ekspert
15. januar 2016 - 10:34 #9
Du havde:

$leveringsliste = mysql_query("SELECT * FROM `vognliste` WHERE `levdato` = $dagsdato_1 ORDER BY `levdato` ASC",$db);

Hvilket gør den forsøger en sql ala:

WHERE `levdato` = 2016-01-20

Så vi skal have lavet dato om til en streng.
Det kan du gøre på en af følgende måder:

$leveringsliste = mysql_query("SELECT * FROM `vognliste` WHERE `levdato` = '".$dagsdato_1."' ORDER BY `levdato` ASC",$db);

$leveringsliste = mysql_query("SELECT * FROM `vognliste` WHERE `levdato` = '$dagsdato_1' ORDER BY `levdato` ASC",$db);

og sikkert også på en masse andre måder.

Den første "stopper" din string se start " og slut " og så . foran din variabel og så . " og videre...
Den sidste smider bare ' og ' omkring var og ikke så meget pjat der.
Avatar billede t-johansen Juniormester
15. januar 2016 - 10:36 #10
takker, svar og du får point.



skal nok kigge på Prepared statements
Avatar billede jakobdo Ekspert
15. januar 2016 - 10:42 #11
Svar!
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