Create dynamic <select> with PHP - php

I have a $_SESSION variable $_SESSION['invoiceDate'] that is populated with a value representing YYYYMM.
I need to dynamically build a select element so that I have 6 options going back from the 'invoiceDate' e.g. if $_SESSION['invoiceDate'] = 201602 the output should be...
<select id="invoiceDate" name="invoiceDate">
<option value="201602">Feb 2016</option>
<option value="201601">Jan 2016</option>
<option value="201512">Dec 2015</option>
<option value="201511">Nov 2015</option>
<option value="201510">Oct 2015</option>
<option value="201509">Sep 2015</option>
</select>
My PHP is very basic... I can split the session value and assign the first 4 digits to $year and the other 2 to $month. Then loop 6 times... Each time I echo to output the <option> line concatenating the year and month to make the value and then subtracting 1 from the month and if month=0 then take 1 from year and make month 12. This gives me....
<option value="201602"></option>
<option value="201601"></option>
<option value="201512"></option>
<option value="201511"></option>
<option value="201510"></option>
<option value="201509"></option>
Now I can join the year and month with a hyphen to give
<option value="201602">2016-02</option>
<option value="201601">2016-01</option>
<option value="201512">2015-12</option>
<option value="201511">2015-11</option>
<option value="201510">2015-10</option>
<option value="201509">2015-09</option>
But how do I get a Month Year instead... e.g. Feb 2016 instead of 2016-02?

Why aren't you using DateTime?
$e = '201602';
$date = new DateTime($e);
echo $date->format('M');
outputs Feb
In your case it could be
$e = '201602';
$date = new DateTime($e);
$month = $date->format('n');
for($i=0;$i<6;$i++)
{
echo '<option value="'.$date->format('Ym').'">'.$date->format('M Y').'</option>';
$date = $date->sub(new DateInterval('P1M'));
}
This outputs
<option value="201602">Feb 2016</option>
<option value="201601">Jan 2016</option>
<option value="201512">Dec 2015</option>
<option value="201511">Nov 2015</option>
<option value="201510">Oct 2015</option>
<option value="201509">Sep 2015</option>
Just edit this as you need and don't use that infernal version of date with strtotime...

$date = "201602";
for($i=1;$i<=6;$i++){
echo date('M, Y',strtotime(date('Y-m-d',strtotime($date))." -$i month"));
}
In this loop we are deleting 1 month from your date.
Date Parameters

This is it:
<?php $session_val = "201602";?>
<select id="invoiceDate" name="invoiceDate">
<?php
for($i = 0; $i < 6; $i++){
//$text = date('Y-m', strtotime(date('Y-m-d', strtotime($session_val))." -$i month")); // for 2016-02
$text = date('M Y', strtotime(date('Y-m-d', strtotime($session_val))." -$i month")); //for Feb 2016
$val = date('Ym', strtotime(date('Y-m-d', strtotime($session_val))." -$i month"));
echo '<option value="'.$val.'">'.$text.'</option>';
}?>
</select>
I did this in my local, but when i am going to post i see some one
post similar thing. But I did so i post.

Related

Getting all days of that month based on the month and year I selected with the php date function

hi i have two selectors where i can choose month and year. with php how can I print all the day names and days of the month based on the month and year I selected?Please help me
<form method="post" action="action_page.php">
<select name="taskOption" >
<option>Ocak</option>
<option>Şubat</option>
<option>Mart</option>
<option>Nisan</option>
<option>Mayıs</option>
<option>Haziran</option>
<option>Ağustos</option>
<option>Eylül</option>
<option>Ekim</option>
<option>Kasım</option>
<option>Aralık</option>
</select>
<select name="taskOptions">
<option>2000</option>
<option >2001</option>
<option >2002</option>
<option >2003</option>
<option >2004</option>
<option >2005</option>
<option >2006</option>
<option>2007</option>
<option >2008</option>
<option >2009</option>
<option >2011</option>
<option >2012</option>
<option >2013</option>
<option >2014</option>
<option >2015</option>
<option >2016</option>
<option >2017</option>
<option >2018</option>
<option >2019</option>
<option >2020</option>
<option >2021</option>
<option >2022</option>
</select>
<input type="submit" name="submit">
</form>
You need to get amount of days in the selected month and year. This can be done, using PHP function cal_days_in_month, or native function date with format t.
You should create a for loop, from 1 to amount of days in that month
Use PHP native function date using format D to print the day name, or you can use format w to get that week day number and map the number to any string you need.
A little example:
$month = 12; // 12 = December
$year = 2022;
$daysCount = date('t', mktime(0, 0, 0, $month, 1, $year));
// Alternative
// $daysCount = cal_days_in_month(CAL_GREGORIAN, $month, $year);
for ($day = 1; $day <= $daysCount; $day++) {
echo date(
'Y-m-d, D',
mktime(0, 0, 0, $month, $day, $year)
);
}

php mysql not updating row in proper way

I have a column which name is possession1, in this column I concat the $month.$year, but problem is when I update only $month then $year value is laps but when I update only $year then $month do not laps but $year update the column with old value and new value like,If month is May and old year is 2013, and when I update only year with 2014 then its showing output May20132014, this is my code
<select id="month" name="month" >
<option value="January">January</option>
<option value="February">February</option>
<option value="March">March</option>
<option value="April">April</option>
</select>
<select id="year" name="year">
<option value="2012">2012</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
<option value="2015">2015</option>
<option value="2016">2016</option>
</select>
$month=#$_POST['month'];
$year=#$_POST['year'];
$arr = array($month, $year);
$possession1 = join("", $arr);
$updateSale="update sale set possession='$possession1' where id='$update_id'";
$r=mysql_query($updateSale);
Try this, Use isset to check the post value,
if(isset($_POST['month']) && isset($_POST['year'])){
$month = $_POST['month'];
$year = $_POST['year'];
$possession1 = $month. " ".$year;
$updateSale="update sale set possession='".$possession1."' where id='$update_id'";
$r=mysql_query($updateSale);
}
Correct your query to this--
$updateSale="update sale set possession='".$possession1."' where id='".$update_id."'";

PHP: Convert back to time() format from form select

Not sure if this has already been answered or not, but I did do a google search and couldn't really find anything useful.
I have the following html code (as an example) which has a form select field for month, day, year, hour, and minute (second is always 00) and I need to convert that back to time() format on form submit. How would I do this with php?
<select name="month">
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
...
</select>
<select name="day">
<option value="01">1</option>
<option value="02">2</option>
<option value="03">3</option>
...
</select>
<select name="year">
<option value="2014">2014</option>
<option value="2015">2015</option>
...
</select>
<select name="hour">
<option value="00">12am</option>
<option value="01">1am</option>
<option value="02">2am</option>
<option value="03">3am</option>
<option value="12">12pm</option>
<option value="13">1pm</option>
...
</select>
<select name="minute">
<option value="01">1</option>
<option value="02">2</option>
<option value="03">3</option>
...
</select>
<!-- second is always 00 -->
Note: The values of each select can change if they need to. Not sure what format they need to be in to make this work efficiently.
$time = DateTime::createFromFormat(
'Y-m-d H:i:s',
sprintf("%d-%d-%d %d:%d:%d",
intval($_POST['year']),
intval($_POST['month']),
intval($_POST['day']),
intval($_POST['hour']),
intval($_POST['minute']),
0
)
);
You now have a DateTime object, to get a unix timestamp do:
$timestamp = $time->getTimestamp();
Check out strtotime() and the DateTime class.
<?php
$date = $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'];
$time = $_POST['hour'] . ':' . $_POST['minute'];
// Simple way to get a Unix timestamp from a date string
$timestamp = strtotime($date . ' ' . $time);
// To do more modifications to the date, you should use the DateTime class
$dateObj = new DateTime($date . ' ' . $time);
$dateObj->modify('+1 year'); // Adds a year to the date
$timestamp = $dateObj->format('U'); // Returns the date as a Unix timestamp
Use strtotime function.
echo strtotime("10 September 2000"); // output 968569200 of unix timestamp

Does php Date mktime() Function show different value on End of the month?

To list months in a dropdown is used a php function
<select name="month" class="span3">
<?php
for($m = 1;$m <= 12; $m++){
$month = date("F", mktime(0, 0, 0, $m));?>
<option value="<?php echo $m; ?>"><?php echo $month; ?></option>
<?php } ?>
</select>
It was working fine when i check today (i.e 31-07-2013) its showing month as
<select class="span3" name="month">
<option value="1">January</option>
<option value="2">March</option>
<option value="3">March</option>
<option value="4">May</option>
<option value="5">May</option>
<option value="6">July</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">October</option>
<option value="10">October</option>
<option value="11">December</option>
<option value="12">December</option>
</select>
when i check date format as ('Y-m-d') its showing first and last date of those month and doesn't show February for feb it showing 2013-03-03. When i modify the mktime function as mktime(0, 0, 0, $m,1,2013) the results coming as properly as expected. Is there anything i need to look for when i use mktime() or date() function in php.
Add the 5th parameter to fix this.
$month = date("F", mktime(0, 0, 0, $m, 1));
It's the 31st, and only the months above have 31 days.
to clarify what happens, the default value for the 5th parameter is the current day. you pass a number higher than the number of days in that month, it rolls over to the next month.
You have to pass 5th parameters day in mktime function.
for($m = 1; $m <= 12; $m++){
$month = date("F", mktime(0, 0, 0, $m, 1));
echo $month;
}
Day less than 1 (including negative values) reference the days in the previous month.

Get date, explode, use data to select options in <select>

I have three variables set, $date_legible (in the format of F jS, Y, i.e. January 1st, 2011), $date_timestamp (self-explanatory), and $date_normal (in the format of YYYY-MM-DD)
I have three select fields:
<select name="date_mo">
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
<option value="04">April</option>
<option value="05">May</option>
<option value="06">June</option>
<option value="07">July</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
<select name="date_dy">
<option value="01">1</option>
<option value="02">2</option>
<option value="03">3</option>
<option value="04">4</option>
<option value="05">5</option>
<option value="06">6</option>
<option value="07">7</option>
<option value="08">8</option>
<option value="09">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
<select name="date_yr">
<?php for($year=$curryear;$year<$curryear+51;$year++){ ?>
<option value="<?php echo $year; ?>"><?php echo $year; ?></option>
<?php } ?>
</select>
I know I want to convert the timestamp, but I will ultimately need to explode the output for the $month, $day, and $year. The problem is I don't know how to check the selects to the values and automatically select the correct option.
Can anyone help? Thanks!
UPDATE
I now have one more variable, because I'm having users submit from the front end, and Gravity Forms submits as YYYY-MM-DD.
Prior to diving into the solutions already posted (thank you guys [and gals] by the way), here's a little more information:
I'm running WordPress and have three custom fields as described above. When a user submits a post from the front end, the only custom field that's filled out is $date_normal. This is okay, because a post has to be moderated (i.e. published) from the backend. What I NOW need is on load to set the YYYY-MM-DD to set the options on the select. I'm not asking you guys to alter your answers, I'm sure I can figure it out (though if you can help with this new problem, it would be greatly appreciated).
If I understand your question correctly, you have a timestamp and you need to use the timestamp to select the appropriate select options when you render the page.
As a forewarning - this will make it possible to select invalid dates, for example February 31st (does not exist). You may want to consider re-drawing the year drop-down when the month is changed using javascript. Since you didn't specify any javascript library (and it is not clear how important the possibility of an invalid date is), I will not venture to show code for that, but it would not be terribly difficult.
// using the current time for the sake of the example, your timestamp would take the place of this
$timestamp = time();
// determine the selected month, day, and year
$selected_month = date('n', $timestamp);
$selected_day = date('j', $timestamp);
$selected_year = date('Y', $timestamp);
// now, create the drop-down for months
$month_html = '<select name="date_mo">';
for ($x = 1; $x < 13; $x++) {
$month_html .= '<option value='.$x.($selected_month == $x ? ' selected=true' : '' ).'>'.date("F", mktime(0, 0, 0, $x, 1, $selected_year)).'</option>';
}
$month_html .= '</select>';
// output
print $month_html;
// create the day drop-down
$day_html = '<select name="date_day">';
for ($x = 1; $x < 32; $x++) {
$day_html .= '<option value='.$x.($selected_day == $x ? ' selected=true' : '' ).'>'.$x.'</option>';
}
$day_html .= '</select>';
// output
print $day_html;
// create the year drop-down
$year_html = '<select name="date_year">';
$start_year = date('Y', time());
$max_year = $start_year + 51;
for ($x = $start_year; $x < $max_year; $x++) {
$year_html .= '<option value='.$x.($selected_year == $x ? ' selected=true' : '' ).'>'.$x.'</option>';
}
$year_html .= '</select>';
// output
print $year_html;
Output:
EDIT
If your source data will be in the format of YYYY-MM-DD. In order to translate that into a timestamp, and thus work with the example code I've posted, is to call strtotime on that formatted date value. Thus, the only line in the code above that would need to be changed is $timestamp = strtotime($the_formatted_date);
<?php
// $months = array(1 => 'January', 2 => 'February', ... etc
?>
<select name="date_mo">
<? for ($i = 1, $current = (int) date('n'); $i <= 12; $i++) { ?>
<option value="<?=$i;?>"<?=($current === $i ? ' selected="selected"' : NULL);?>><?=$months[$i];?></option>
<? } ?>
</select>
<select name="date_dy">
<? for ($i = 1, $current = (int) date('j'); $i <= 31; $i++) { ?>
<option value="<?=$i;?>"<?=($current === $i ? ' selected="selected"' : NULL);?>><?=$i;?></option>
<? } ?>
<select name="date_yr">
<? for ($i = $current = (int) date('Y'), $until = $i + 50; $i <= $until; $i++) { ?>
<option value="<?=$i;?>"<?=($current === $i ? ' selected="selected"' : NULL);?>><?=$i;?></option>
<? } ?>
</select>
I would personally convert the 3 fields to a more user-friendly date selector (using for example jQuery UI), but to have the correct option selected when you open the page, you need to add a check to each option.
Example for the year:
<?php
$selected_year = date("Y", $date_timestamp); // get the selected year
for($year=$curryear;$year<$curryear+51;$year++)
{
?>
<option value="<?php echo $year; ?>" <?php echo ($selected_year == $year) ? 'selected' : ''; ?>><?php echo $year; ?></option>
<?php
}
?>

Categories