|   | php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
| 
  [2009-07-13 19:11 UTC] arno dot zandink at gmail dot com
 Description:
------------
checkdate returns true when the date given is not a valid date
If this is not considered a bug, perhaps adding a waring on the manual page would be wise 
Reproduce code:
---------------
---
From manual page: function.checkdate
---
<?php
$date = "01-01-1980 <script>alert('test');</script>";
$aDate_parts = preg_split("/[\s-]+/", $date);
var_dump(
    checkdate(
        $aDate_parts[1], // Month
        $aDate_parts[0], // Day
        $aDate_parts[2] // Year
    )
);
?>
Expected result:
----------------
I would expect var_dump to print a boolean (false) because the date is not valid
Actual result:
--------------
A boolean (true) is returned with a invalid date
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             | |||||||||||||||||||||||||||
|  Copyright © 2001-2025 The PHP Group All rights reserved. | Last updated: Fri Oct 31 12:00:01 2025 UTC | 
Thank you for your bug report. Your example code can be summarized as follows: <?php var_dump(checkdate('01', '01', '1980')); ?> I would expect this to return true, because January 1st 1980 is a valid date. Why do you think it is an invalid date?hmm, indeed I changed my scripted at the last minute because I got a deprecated notice. My first test was as following: <?php $date = "01-01-1980 <script>alert('test');</script>"; $aDate_parts = split('-', $date); print_r($aDate_parts); var_dump( checkdate( $aDate_parts[1], // Month $aDate_parts[0], // Day $aDate_parts[2] // Year ) ); ?> This example will result in the following array: <?php Array ( [0] => 01 [1] => 01 [2] => 1980 <script>alert('test');</script> ) ?> And it will return a boolean (true)The function checkdate() takes three integers as arguments. That means that if you pass it a string, it will be cast to an int. The string "1980 <script>alert('test');</script>" cast to an int will result in 1980. So checkdate("01", "01", "1980 <script>alert('test');</script>") is equivalent to checkdate(1, 1, 1980) This is not a bug in PHP, rather a limitation of checkdate: it assumes that you pass it numbers. You should check yourself that your input is numeric.There is actually a warning already: derick@kossu:~$ php <?php checkdate("01", "01", "1980 <script>alert('test');</script>"); ?> Notice: A non well formed numeric value encountered in /home/derick/- on line 2 Call Stack: 8.1010 653592 1. {main}() /home/derick/-:0 8.1010 654376 2. checkdate(string(2), string(2), string(36)) /home/derick/-:2