rwj Juniormester
30. november 2020 - 15:26 Der er 24 kommentarer og
1 løsning

Dato sammenligning.

Jeg skal sammenligne 2 datoer, den ene fra min tabel som er opret_dato og Now, begge formater vises på siden således: 2020-12-30 12:13:54

Jeg har forsøgt med nedenstående kode, men den giver hele tiden FALSE

$now = date('Y-m-d H:i:s');

if(strtotime($rows['opret_dato']) > strtotime('$now') ){

echo "TRUE";

} else {

echo "FALSE";

}; 

Ydermere skulle der gerne ende med, at når opret_dato er overskredet med mere end 30 min, så skal det give FAlSE fremover.

Hvorfor virker koden ikke og hvordan løses dette med 30 min, nogen som kan hjælpe?
arne_v Ekspert
30. november 2020 - 15:39 #1
Hvad returnerer:

strtotime($rows['opret_dato'])

?
arne_v Ekspert
30. november 2020 - 15:41 #2
strtotime('$now')

maa kunne laves som:

strtotime('now')

hvilket vil goere det nemtat lave om til:

strtotime('-30 minutes')
rwj Juniormester
30. november 2020 - 16:28 #3
arne_v

Jeg kan ikke se, hvad strtotime($rows['opret_dato']) viser, men opret_dato forsøg 1 viser 2020-12-30 12:13:54 giver False, og hvis jeg prøver at hente opret_dato forsøg 2 med 2020-11-29 10:10:15, giver det også False


har jeg ændret strtotime('$now') til

if(strtotime($rows['opret_dato']) > strtotime('now') ){

hvor skal strtotime('-30 minutes') indsættes, hvis altså koden virkede?
arne_v Ekspert
30. november 2020 - 16:38 #4
Du kan jo proeve og uskrive strtotime($rows['opret_dato'])
rwj Juniormester
30. november 2020 - 17:35 #5
arne_v

Ok, jeg er ikke helt tryg ved php, men har prøvet at udskrive

eecho " . strtotime($rows[opret_dato]) . ";

som du anbefaler, men får denne fejlbesked:

og får dette resultat:

strtotime()
arne_v Ekspert
30. november 2020 - 17:51 #6
echo  strtotime($rows[opret_dato]);
rwj Juniormester
30. november 2020 - 18:02 #7
arne_v

Tak, men så kommer denne fejlbesked:

Warning: Use of undefined constant opret_dato - assumed 'opret_dato' (this will throw an Error in a future version of PHP) in /
arne_v Ekspert
30. november 2020 - 20:08 #8
echo  strtotime($rows['opret_dato']);

men hvad udskriver den?
rwj Juniormester
30. november 2020 - 22:09 #9
arne_v

den udskriver ikke andet en denne fejlbesked:

Warning: Use of undefined constant opret_dato - assumed 'opret_dato' (this will throw an Error in a future version of PHP) in
som er den linie her:

echo  strtotime($rows[opret_dato]);
olsensweb.dk Ekspert
30. november 2020 - 22:23 #10
#9
>echo  strtotime($rows[opret_dato]);
du lagde ikke mærke til at arne_v i #8 skrev
echo  strtotime($rows['opret_dato']);
dvs med plinger omkring opret_dato


hvilke datatype er opret_dato i tabellen ?? varchar eller datetime ??
rwj Juniormester
30. november 2020 - 22:37 #11
Olsensweb.dk

Du har ret, jeg overså de plinger og linien ser sådan ud:

echo  strtotime($rows['opret_dato']);

men giver intet resultat, heller ingen fejl.

opret_dato er datetime og giver dette format: 2020-12-30 12:13:54
arne_v Ekspert
01. december 2020 - 01:04 #12
Det tyder ret kraftigt paa at $rows['opret_dato'] ikke indeholder det du tror den goer.

Proev:

echo 'in=|' . $rows['opret_dato']) . '| out=|' . strtotime($rows['opret_dato']) . '|';
rwj Juniormester
01. december 2020 - 08:46 #13
arne_v

Ja, jeg må have misforstået noget med det dato halløj.

Jeg forsøgte din kode, som gav denne fejlbesked:

Parse error: syntax error, unexpected ')', expecting ';' or ',' in
michael_stim Ekspert
01. december 2020 - 09:36 #14
#13

Det er Arne der har sjusket, hvilket i princip aldrig sker:

echo 'in=|' . $rows['opret_dato'] . '| out=|' . strtotime($rows['opret_dato']) . '|';
olsensweb.dk Ekspert
01. december 2020 - 10:35 #15
>strtotime($rows['opret_dato']
er opret_dato en string (varchar) ?? det er da datetime jf #11


du kunne overveje at gører det direkte i sql
https://www.w3schools.com/sql/func_mysql_date_add.asp
https://www.w3schools.com/sql/func_mysql_date_sub.asp
https://www.mysqltutorial.org/mysql-interval/


CREATE TABLE `tbl_log` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `opret_dato` datetime NOT NULL,
  `event` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `tbl_log` (`id`, `user_id`, `opret_dato`, `event`) VALUES
(1, 1, '2020-11-30 10:14:07', 'forkert password'),
(2, 1, '2020-11-30 10:14:10', 'forkert password'),
(3, 1, '2020-12-01 10:30:10', 'logget på');


ALTER TABLE `tbl_log`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `tbl_log`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;


henter alle dem der er ældre end nu minus 30 minuter
SELECT * FROM tbl_log WHERE NOW() - INTERVAL 30 MINUTE > `opret_dato`
rwj Juniormester
01. december 2020 - 11:30 #16
michael_stim

Ok, vi kan jo alle fejle :-)

Jeg har forsøgt dit forslag, som giver dette resultat:

in=|| out=||
michael_stim Ekspert
01. december 2020 - 11:37 #17
#16

Så er der ikke noget i opret_dato.

"Ok, vi kan jo alle fejle :-)". Ikke Arne. Han har kun taget fejl en gang i sit liv, og det var da han TROEDE han havde taget fejl :-D

Har själdent (läs aldrig) mödt sådan en kompetent mand som Arne, han er ekspertens Fantomet.
rwj Juniormester
01. december 2020 - 11:56 #18
michael_stim

God pointe vedr. arne_v og i øvrigt følger jeg også samtlige instrukser jeg modtager, min viden er kun lidt over ingenting, men jeg forsøger at lære :-)

Ja, der er ikke noget i opret_dato, men hvis jeg tjekker db, så er der fx 2020-12-30 12:13:54. Når jeg hiver en bestemt id ud, står der også 2020-12-30 12:13:54, det går åbenbart galt når dato skal sammenlignes....eller noget.
rwj Juniormester
01. december 2020 - 12:22 #19
olsensweb.dk

Tak for link og vejledning, som jeg prøvede og det virkede korrekt.

Det, som jeg er i gang med, og burde have fortalt fra start, er at min haveforening har en login med krypteret password (som jeg også har fået hjælp herfra) og tidligere webside kodet med asp classic der havde jeg en Glemt Password funktion, men som jeg kan forstå, er det ikke umiddelbart muligt at fremsende en krypteret kode til medlems emailadresse, det giver vist ingen mening.

Så derfor har jeg oprettet en midlertidig tabel med emailadresse, tjek_kode (en alm automatisk genereret kode) samt opret_dato.

Meningen er så, at medlemmer, som har glemt deres kode, indtaster email, hvorefter førnævnte data gemmes og der sendes en mail til medlem med link til webside, hvor medlem taster email og fremsendte tjek_kode ind, herefter tjekkes om der er gået mere end fx 30 min (for at undgå misbrug) og hvis tid er overholdt, føres medlem til formular, hvor nyt kryperet password laves.

Giver det mening, og det er omtalte opret_dato, som er problemet.
olsensweb.dk Ekspert
01. december 2020 - 13:26 #20
kig på denne

<?php
include "connection.php"; // $conn
// http://www.primitivetype.com/articles/php_dates_2.php
$t = strtotime('-30 minutes');
$now = date('Y-m-d H:i:s', $t);




$sql = "select * from tbl_log";
$rs = $conn->query($sql);
while ($rows = $rs->fetch_assoc()) {
   
   
echo "\n<br>".'in=|' . $rows['opret_dato'] . '| out=|' . strtotime($rows['opret_dato']) . '|' . strtotime($now). '|';




if(strtotime($rows['opret_dato'] ) < strtotime($now) ){

    echo "TRUE";

    } else {

    echo "FALSE";

    }
}
?>


alternativt kig på
https://stackoverflow.com/questions/2767068/adding-30-minutes-to-time-formatted-as-hi-in-php
arne_v Ekspert
01. december 2020 - 15:15 #21
echo 'in=|' . $rows['opret_dato']) . '| out=|' . strtotime($rows['opret_dato']) . '|';

skal naturligvis vaere:

echo 'in=|' . $rows['opret_dato'] . '| out=|' . strtotime($rows['opret_dato']) . '|';

Og output:

in=|| out=||

er vigtigt fordi det fortaeller os at problemet ikke er en dato sammenligning men at  $rows['opret_dato'] ikke indeholder noget.

Og derfor er det koden som henter  $rows['opret_dato'] fra databasen som der skal fokus paa.
arne_v Ekspert
01. december 2020 - 15:16 #22
Og jeg tager skam tit fejl.
rwj Juniormester
01. december 2020 - 15:23 #23
olsensweb.dk

Jeg har prøvet din kode og det virker efter hensigten, og jeg burde kunne tilpasse den min webside, tak, så dit svar #20, er løsningen.

Jeg har tidligere været inde på Stackoverflow, og tjekke netop dette opslag af, jeg kunne ikke finde ud af at sætte det sammen til noget fornuftigt, men det giver bedre mening nu.

Også tak til michael_stim og arne_v for de efterfølgnede kommentarer, ikke mindst den sidste. Selverkendelse er en god ting :-)

God dag/aften til jer alle og mange tak for hjælpen.
olsensweb.dk Ekspert
01. december 2020 - 16:41 #24
her er et andet alternativ, jeg ville gerne af med alt det strtotime

<?php
include "connection.php"; // $conn

$datetime = new DateTime();
//print_r($datetime);

//$interval = new DateInterval("PT30M");
//$interval->invert = 1;
$interval = DateInterval::createFromDateString('-30 minutes');

$now=$datetime->add($interval);
//print_r($datetime);



$sql = "select * from tbl_log";
$rs = $conn->query($sql);
while ($rows = $rs->fetch_assoc()) {
echo "\n<br>";

$opret_dato = new DateTime($rows['opret_dato']);

// https://stackoverflow.com/questions/1519228/get-interval-seconds-between-two-datetime-in-php
$diff = $now->getTimestamp() - $opret_dato->getTimestamp();

//echo $diff;


if($diff>0){
    echo "TRUE";

    } else {

    echo "FALSE";

    }   
}
?>

den er da langt pænere hvis man ikke laver det direkte i sql IMHO
rwj Juniormester
01. december 2020 - 17:16 #25
olsensweb.dk

Jeg har testet dit sidste forslag, og det virker efter min ringe vurdering næsten som tidligere kode, jeg kan kun se forskel på at selve opret_dato ikke bliver vist men TRUE/FALSE virker efter hensigten. Jeg har ikke brug for at opret_dato bliver vist.

Så når du anbefaler denne kode fremfor tidligere, er det, hvad jeg vil gøre.

Igen, mange tak.
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

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





Premium
Siger farvel til Proshop - her er topchef Ivan Jæger Christiansens nye job: "Det kan godt være, det er verdens mest åndssvage beslutning, men det føles virkelig godt"
Interview: Efter fire år som topchef i det fremadstormende Proshop har Ivan Jæger Christiansen meldt sin afgang. Nu tager han hul på drømmen som medejer i et nyt selskab. Se hans nye job.
Computerworld
Biden sender skjult besked til kode-folket: "Hvis du læser dette, har vi brug for din hjælp”
En stående invitation er blevet opdaget i kildekoden på Det Hvide Hus' hjemmeside. Men den er kun til de eksperter, der selv kan finde den.
CIO
Podcast: Hos Viking Life-Saving Equipment er it gået fra at være backend til at være noget, som kunderne spørger aktivt efter
Podcast, The Digital Edge: Viking leverer en stadig større del af deres produkt som en tjeneste. Som en del af tjenesten tager Viking ansvar for sikkerheden ved at levere, dokumentere og vedligeholde det nødvendige sikkerhedsudstyr. Hør hvordan Henrik Balslev senior digital director hos Viking har løftet den opgave.
White paper
Digital transformation tvinger organisationer til at nå deres digitale mål på nye måder
Allerede for to år siden hævdede nordiske virksomheder, at virksomhedernes konkurrenceevne og sågar overlevelse var afhængig af en vellykket digitalisering. De var klar, fulde af håb og på vej mod det digitale paradis. Hvordan gik det så? Hvor er de nu? For at finde ud af det, interviewede DigiPlex og Norstat 377 forretningsledere og IT-beslutningstagere fra organisationer fordelt over hele Danmark, Sverige og Norge om deres digitaliseringsfremskridt, om hvordan de har håndteret pandemien, og om hvordan IT understøtter eller står i vejen for indfrielsen af deres bæredygtighedsmål. DigiPlex kan nu dele en rapport med resultaterne fra undersøgelsen samt tanker om, hvordan man håndterer dem. De deler også nogle nyttige tips til, hvordan man skaber en pålidelig infrastruktur, der kan tilskynde til og understøtte ambitioner i den digitale økonomi. Læs mere i rapporten Nordic Data Center Trends 2020: Riding out the Storm.