код да превърна ден дата и година в годините

dunix

Registered
Малко не се разбира много заглавието, за което се извинявам, но искам да попитам имам годините ден месец и година на раждане. Как да го направя да ми извежда само числото на колко години е.
Пример:
написъл съм 5.1.1991 (ден, месец, година).
Искам да ми изведе 19, а не кога съм роден.
 
Код:
  function birthday ($birthday){
    list($year,$month,$day) = explode("-",$birthday);
    $year_diff  = date("Y") - $year;
    $month_diff = date("m") - $month;
    $day_diff   = date("d") - $day;
    if ($day_diff < 0 || $month_diff < 0)
      $year_diff--;
    return $year_diff;
  }
//YYYY-MM-DD
echo birthday ("1992-11-12");
 
Трябва не аз да указвам датата на раждането, а то само да си я взима от базата данни.
Направих го така:

Код:
  function birthday ($birthday){ 
    list($year,$month,$day) = explode("-",$birthday); 
    $year_diff  = date("Y") - $year; 
    $month_diff = date("m") - $month; 
    $day_diff   = date("d") - $day; 
    if ($day_diff < 0 || $month_diff < 0) 
      $year_diff--; 
    return $year_diff; 
  } 
//YYYY-MM-DD 
echo birthday ("$year-$month-$day");

и не става
 
Изтрий полетата в базата данни day, month, year и направи едно примерно birth_date:

ALTER TABLE users ADD birth_date date

Това ще записва датите във вида 2010-10-04 като 2010 е година, 10 е месец и 04 ден. И тогава заявката от базата данни ще стане така:

SELECT DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS('birth_date' ) ) , '%Y' ) +0 AS age FROM users

И като изкарваш резултатите ще ти се пази в age.

$result = mysql_query("SELECT DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS('birth_date' ) ) , '%Y' ) +0 AS age FROM users") or die("ERROR");
while($row = mysql_fetch_array($result)) {
echo $row['age'].'<br />';
}

Този код ще ти изкара годините на всички потребители. Естествено можеш да изкара и други полета като в селект ги изредиш всичките. Можеш да изкараш по определен критерии като сложиш WHERE клауза накрая.

Предимството на този метод е, че в едно поле записваш цялата дата (мисля, че беше 4кб), а с трите инт полета става много повече. Също така се правят много лесно математически операции върху датата.

Записа на датата на раждане трябва да става така:
$birth_date = date('Y-m-j', mktime(0,0,0,$month,$day,$year));
mysql_query("INSERT INTO users VALUES('value1', 'value2',$birth_date)");

Като тук $month, $day, $year са ти променливите, които е постнал потребителя като е попълвал формата за регистрация.
 
adrian - да ти кажа искрено = нищо не разбрах освен да направя колона в таблицата на users.

Аз се справих почти по моя тъп начин, ама както казваш ти е много по лек твоя начин. За това ще те помоля да ми уточниш как точно да го направя.

Аз съм направил формата ми за регистрация да чете данни от таблицата year - за годините, month - за месеците и day - за дните.

Общо взето ми изглежда така формата при регистрацията:

Код:
    Age <select name="day">
          <?php
          $query = mysql_query("SELECT * FROM day") or die(mysql_error());
          while ($a = mysql_fetch_assoc($query)) {
               print '<option value="' . $a[day_id] . '">' . $a[day_lebel] . "</option>\n";
          }
          ?>
     </select>

     <select name="month">
          <?php
          $query = mysql_query("SELECT * FROM month") or die(mysql_error());
          while ($a = mysql_fetch_assoc($query)) {
               print '<option value="' . $a[month_id] . '">' . $a[month_lebel] . "</option>\n";
          }
          ?>
     </select>

     <select name="year">
          <?php
          $query = mysql_query("SELECT * FROM year") or die(mysql_error());
          while ($a = mysql_fetch_assoc($query)) {
               print '<option value="' . $a[year_id] . '">' . $a[year_lebel] . "</option>\n";
          }
          ?>
     </select><br />

Като ги изтрия колоните year, month и day няма как да се записват в тези полета - по скоро не знам как да накарам да се запишат в онова поле което трябва да създам под формата YYYY-MM-DD.
 
където дата е записана в едно поле, и разделителя е . ако при теб d,m,Y са записани в различни полета тогава махни това:
Код:
$date_b = explode(".", $r[burthday]); 
замести това:  $date_b[1] ,$date_b[2], $date_b[0] със съответните редове от таблицата;

$date_b = explode(".", както ти се казва полето в БД);
$date_g = date("Y");
$date_m = date("m");
$date_d = date("d");
$god_m = $date_b[1];
$god_d = $date_b[0];
$godini =$date_g - $date_b[2];
if ($date_d >= $god_d && $date_m >= $god_m)

{
echo $godini ;
}
else{
echo $godini -1;
}
заявката към БД е съвсем обикновенна
 
Значи не ти трябват тия три таблици day, month и year. Тези select можеш да ги изкараш примерно така:

<?php
$months = array(1 => "Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември");
$start_year = 1920;
$end_year = date("Y");
?>
Age <select name="day">
<?php
for($i = 1; $i <= 31; $i++){
print '<option value="' . $i . '">' . $i . "</option>\n";
}
?>
</select>
<select name="month">
<?php
foreach($months as $key => $month) {
print '<option value="' . $key . '">' . $month . "</option>\n";
}
?>
</select>

<select name="year">
<?php
for($i = $end_year; $i >= $start_year; $i--) {
print '<option value="' . $i . '">' . $i . "</option>\n";
}
?>
</select><br />

Това може да не е най-добрия начин, но това ми хрумна на момента.
След като изкарваш вече така дните, месеците и годините значи вече спокойно можеш да изтриеш трите таблици day, month и year.

Следващата стъпка е в таблицта users да изтриеш колоните month, day, year. След като ги изтриеш вече за потребителя не записваш датата в никоя колона. Затова трябва да създадеш една.

Създаваш я така:

ALTER TABLE users ADD birth_date date

И ако работиш по същата база данни от предната тема (dandl). Тогава тя трябва да изглежда така:

city, form, gender1 и users.

А таблицата users трябва да ти изглежда така:
id, username, password, email, gender1, form, city, birth_date

Както виждаш и в таблиците си се лишил от три излишни таблици и в таблица users си заменил 3 полета за едно.

Сега вече датата на раждане ти се записва в таблицата във вида YYYY-MM-DD. И тук идва въпросът как да я запишеш така? Вместо както досега си вкарвал трите стойности по отделно сега ще го направиш така:

$birth_date = date("Y-m-d", mktime(0, 0, 0, $month, $day, $year));
...
....
....
$result = mysq_query("INSERT INTO users values('', $username, $password, $email, $gender1, $form, $city, $birth_date)");

Като тук променливите $month, $day, $year, $username, $passowrd, $email, $gender1, $form, $city ти идват от формата за регистрация. Т.е преди това си направил нещо от рода на това:

$username = $_POST['username'];
...

Като това не е защитено по никакъв начин.

И ето готово. Вече дата ти се записва в базата данни по този начин. След като си я записал вече изкарването на годините става изключително лесно само с една заявка към базата данни:

$result = mysql_query("SELECT DATE_FORMAT( FROM_DAYS( TO_DAYS( NOW( ) ) - TO_DAYS('birth_date' ) ) , '%Y' ) +0 AS age FROM users") or die("ERROR");
while($row = mysql_fetch_array($result)) {
echo $row['age'].'<br />';
}

birth_date - това е новото поле, което създаде по-нагоре в обяснението.


По-добре не мога да го обясня.
 

Back
Горе