Showing posts with label PHP getdate. Show all posts
Showing posts with label PHP getdate. Show all posts

Monday, 10 September 2018

PHP's getdate() function

I've been coding PHP since 1999 and I'm still discovering functions I didn't know about. Just the other day I read someone's post about some useful PHP functions and I knew all of them except for the getdate() function so I thought I'd cover it here.
PHP has the very useful date() function for formatting dates and times which I use frequently myself but often find myself doing something like this if I need both the year and the month:
$month = date('j'); // day of the month without leading zeroes
$year = date('Y'); // 4 digit year
That's not the most efficient way of doing things, especially if you need to get some other variables as well, because it's making multiple calls to the date() function. Enter the getdate() function.
Calling getdate() without parameters will use the current date and time and assign the various variables to an associative array like so:
$date = getdate();
print_r($date);
The above outputs this:
Array
(
    [seconds] => 55
    [minutes] => 41
    [hours] => 11
    [mday] => 19
    [wday] => 0
    [mon] => 4
    [year] => 2009
    [yday] => 108
    [weekday] => Sunday
    [month] => April
    [0] => 1240098115
)
You can also specify a timestamp if you had your date in that format already (or by converting it using the strtortime()function). The following example uses the timestamp for midnight on April 1st 2009:
$date = getdate(1238497200);
print_r($date);
And the output:
Array
(
    [seconds] => 0
    [minutes] => 0
    [hours] => 0
    [mday] => 1
    [wday] => 3
    [mon] => 4
    [year] => 2009
    [yday] => 90
    [weekday] => Wednesday
    [month] => April
    [0] => 1238497200
)
Going back to the example at the start of this post, I could now do this instead of calling date() multiple times:
$date = getdate();
... $date['mon'] ...;
... $date['year'] ...;

Related posts:

Friday, 5 June 2015

Thursday, 4 June 2015

Mysql: A daily MySQL row displayed

<?php
//use the getdate function to retrieve the date/time data
$today = getdate();
//store the day of the week in the $day variable
$day = $today['wday'];
//increment the variable by 1 because the wday returns 0 to 6 to represent Sunday to Saturday
//Our database ID starts at 1
$day = $day + 1;
//connect to server with username and password
$connection = mysql_connect ("localhost","root", "") or die ("Cannot make the connection");
//connect to database
$db = mysql_select_db ("test",$connection) or die ("Cannot connect to database");
//our SQL query we will display the id equivalent to the $day variable
$sql_query = "SELECT * FROM test WHERE id LIKE $day";
//store the SQL query in the result variable
$result = mysql_query($sql_query);
if(mysql_num_rows($result))
{
//output as long as there are still available fields
while($row = mysql_fetch_row($result))
{
echo ("<a href=\"$row[2]\">$row[3]</a>");
echo (": $row[4]<br>");
}
}
//if no fields exist
else
{
echo "no values in the database";
}

?>

PHP: Shows the current time as a PNG-image

<?php
    //
    // clock.php3 -- shows the current time as a PNG-image

    //
    function set_4pixel($r, $g, $b, $x, $y)
    {
    global $sx, $sy, $pixels;

    $ofs = 3 * ($sx * $y + $x);
    $pixels[$ofs] = chr($r);
    $pixels[$ofs + 1] = chr($g);
    $pixels[$ofs + 2] = chr($b);
    $pixels[$ofs + 3] = chr($r);
    $pixels[$ofs + 4] = chr($g);
    $pixels[$ofs + 5] = chr($b);
    $ofs += 3 * $sx;
    $pixels[$ofs] = chr($r);
    $pixels[$ofs + 1] = chr($g);
    $pixels[$ofs + 2] = chr($b);
    $pixels[$ofs + 3] = chr($r);
    $pixels[$ofs + 4] = chr($g);
    $pixels[$ofs + 5] = chr($b);
    }

    function draw2digits($x, $y, $number)
    {
    draw_digit($x, $y, (int) ($number / 10));
    draw_digit($x + 11, $y, $number % 10);
    }
        
    function draw_digit($x, $y, $digit)
    {
    global $sx, $sy, $pixels, $digits, $lines;
            
    $digit = $digits[$digit];
    $m = 8;
    for ($b = 1, $i = 0; $i < 7; $i++, $b *= 2) {
        if (($b & $digit) == $b) {
        $j = $i * 4;
        $x0 = $lines[$j] * $m + $x;
        $y0 = $lines[$j + 1] * $m + $y;
        $x1 = $lines[$j + 2] * $m + $x;
        $y1 = $lines[$j + 3] * $m + $y;
        if ($x0 == $x1) {
            $ofs = 3 * ($sx * $y0 + $x0);
            for ($h = $y0; $h <= $y1; $h++, $ofs += 3 * $sx) {
            $pixels[$ofs] = chr(0);
            $pixels[$ofs + 1] = chr(0);
            $pixels[$ofs + 2] = chr(0);
            }
        } else {
            $ofs = 3 * ($sx * $y0 + $x0);
            for ($w = $x0; $w <= $x1; $w++) {
            $pixels[$ofs++] = chr(0);
            $pixels[$ofs++] = chr(0);
            $pixels[$ofs++] = chr(0);
            }
        }
        }
    }
    }
        
    // create a chunk with the bytes in $data and the specified
    // type and add it to $result
    function add_chunk($type)
    {
    global $result, $data, $chunk, $crc_table;

    // chunk layout:
    // length: 4 bytes: counting chunk data only
    // chunk type: 4 bytes
    // chunk data: length bytes
    // CRC: 4 bytes: CRC-32 checksum of the type and the data
        
    // copy data and create CRC checksum
    $len = strlen($data);
    $chunk = pack("c*", ($len >> 24) & 255,
        ($len >> 16) & 255,
        ($len >> 8) & 255,
        $len & 255);
    $chunk .= $type;
    $chunk .= $data;

    // calculate a CRC checksum with the bytes chunk[4..len-1]
    $z = 16777215;
    $z |= 255 << 24;
    $c = $z;
    for ($n = 4; $n < strlen($chunk); $n++) {
        $c8 = ($c >> 8) & 0xffffff;
        $c = $crc_table[($c ^ ord($chunk[$n])) & 0xff] ^ $c8;
    }
    $crc = $c ^ $z;

    $chunk .= chr(($crc >> 24) & 255);
    $chunk .= chr(($crc >> 16) & 255);
    $chunk .= chr(($crc >> 8) & 255);
    $chunk .= chr($crc & 255);

    // add it to the result
    $result .= $chunk;
    }


    // ============
    // main program
    // ============

    $sx = 80;
    $sy = 21;
    $pixels = "";
            
    // create filling
    for ($h = 0; $h < $sy; $h++) {
    for ($w = 0; $w < $sx; $w++) {
        $r = 100 / $sx * $w + 155;
        $g = 100 / $sy * $h + 155;
        $b = 255 - (100 / ($sx + $sy) * ($w + $h));
        $pixels .= chr($r);
        $pixels .= chr($g);
        $pixels .= chr($b);
    }
    }
        
    $date = getdate();
    $s = $date["seconds"];
    $m = $date["minutes"];
    $h = $date["hours"];
    $digits = array(95, 5, 118, 117, 45, 121, 123, 69, 127, 125);
    $lines = array(1, 1, 1, 2, 0, 1, 0, 2, 1, 0, 1, 1, 0, 0, 0, 1, 0, 2, 1, 2, 0, 1, 1, 1, 0, 0, 1, 0);
        
    draw2digits(4, 2, $h);
    draw2digits(30, 2, $m);
    draw2digits(56, 2, $s);
    set_4pixel(0, 0, 0, 26, 7);
    set_4pixel(0, 0, 0, 26, 13);
    set_4pixel(0, 0, 0, 52, 7);
    set_4pixel(0, 0, 0, 52, 13);

    // create crc-table
    $z = -306674912;  // = 0xedb88320
    for ($n = 0; $n < 256; $n++) {
        $c = $n;
        for ($k = 0; $k < 8; $k++) {
            $c2 = ($c >> 1) & 0x7fffffff;
            if ($c & 1) $c = $z ^ ($c2); else $c = $c2;
        }
        $crc_table[$n] = $c;
    }

    // PNG file signature
    $result = pack("c*", 137,80,78,71,13,10,26,10);
        
    // IHDR chunk data:
    //   width:              4 bytes
    //   height:             4 bytes
    //   bit depth:          1 byte (8 bits per RGB value)
    //   color type:         1 byte (2 = RGB)
    //   compression method: 1 byte (0 = deflate/inflate)
    //   filter method:      1 byte (0 = adaptive filtering)
    //   interlace method:   1 byte (0 = no interlace)
    $data = pack("c*", ($sx >> 24) & 255,
    ($sx >> 16) & 255,
    ($sx >> 8) & 255,
    $sx & 255,
    ($sy >> 24) & 255,
    ($sy >> 16) & 255,
    ($sy >> 8) & 255,
    $sy & 255,
    8,
    2,
    0,
    0,
    0);
    add_chunk("IHDR");

    // IDAT: image data:
    //    scanline:
    //        filter byte: 0 = none
    //        RGB bytes for the line
    //    the scanline is compressed with "zlib", method 8 (RFC-1950):
    //        compression method/flags code: 1 byte ($78 = method 8, 32k window)
    //        additional flags/check bits:   1 byte ($01: FCHECK = 1, FDICT = 0, FLEVEL = 0)
    //        compressed data blocks:        n bytes
    //            one block (RFC-1951):
    //                bit 0: BFINAL: 1 for the last block
    //                bit 1 and 2: BTYPE: 0 for no compression
    //                next 2 bytes: LEN (LSB first)
    //                next 2 bytes: one's complement of LEN
    //                LEN bytes uncompressed data
    //        check value:  4 bytes (Adler-32 checksum of the uncompressed data)
    //
    $len = ($sx * 3 + 1) * $sy;
    $data = pack("c*", 0x78, 0x01,
        1,
    $len & 255,
    ($len >> 8) & 255,
    255 - ($len & 255),
    255 - (($len >> 8) & 255));
    $start = strlen($data);
    $i2 = 0;
    for ($h = 0; $h < $sy; $h++) {
    $data .= chr(0);
    for ($w = 0; $w < $sx * 3; $w++) {
        $data .= $pixels[$i2++];
    }
    }


    // calculate a Adler32 checksum with the bytes data[start..len-1]
    $s1 = 1;
    $s2 = 0;
    for ($n = $start; $n < strlen($data); $n++) {
    $s1 = ($s1 + ord($data[$n])) % 65521;
    $s2 = ($s2 + $s1) % 65521;
    }
    $adler = ($s2 << 16) | $s1;

    $data .= chr(($adler >> 24) & 255);
    $data .= chr(($adler >> 16) & 255);
    $data .= chr(($adler >> 8) & 255);
    $data .= chr($adler & 255);
    add_chunk("IDAT");

    // IEND: marks the end of the PNG-file
    $data = "";
    add_chunk("IEND");

    // print the image
    header("Content-type: image/png");
    print($result);
?>