Avatar billede 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?
Avatar billede arne_v Ekspert
30. november 2020 - 15:39 #1
Hvad returnerer:

strtotime($rows['opret_dato'])

?
Avatar billede 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')
Avatar billede 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?
Avatar billede arne_v Ekspert
30. november 2020 - 16:38 #4
Du kan jo proeve og uskrive strtotime($rows['opret_dato'])
Avatar billede 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()
Avatar billede arne_v Ekspert
30. november 2020 - 17:51 #6
echo  strtotime($rows[opret_dato]);
Avatar billede 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 /
Avatar billede arne_v Ekspert
30. november 2020 - 20:08 #8
echo  strtotime($rows['opret_dato']);

men hvad udskriver den?
Avatar billede 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]);
Avatar billede 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 ??
Avatar billede 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
Avatar billede 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']) . '|';
Avatar billede 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
Avatar billede 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']) . '|';
Avatar billede 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`
Avatar billede 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=||
Avatar billede 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.
Avatar billede 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.
Avatar billede 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.
Avatar billede 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
Avatar billede 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.
Avatar billede arne_v Ekspert
01. december 2020 - 15:16 #22
Og jeg tager skam tit fejl.
Avatar billede 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.
Avatar billede 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
Avatar billede 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.
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

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