Php 基于dateOfBirth mysql时间戳显示年龄时出现问题

Php 基于dateOfBirth mysql时间戳显示年龄时出现问题,php,mysql,smarty,Php,Mysql,Smarty,我有一个有用户档案的网站。在主页上,我试图展示每个人的个人资料的小摘要。此摘要包括此人的姓名、性别和年龄 <ul> {section name=i loop=$person_list} <li><a href="user_detail.php?id={$person_list[i].id}">{$person_list[i].username}, {$per

我有一个有用户档案的网站。在主页上,我试图展示每个人的个人资料的小摘要。此摘要包括此人的姓名、性别和年龄

        <ul>                
            {section name=i loop=$person_list}
                <li><a href="user_detail.php?id={$person_list[i].id}">{$person_list[i].username}, {$person_list[i].gender}, {$age[i]}
            {/section}
        </ul>
此外,如果相关;我的get_persons函数如下所示:

function age($birth)
{
   $birth_date = new DateTime();
      $birth_date = $birth;
   $birth_date->setTimestamp($birth);

   $now = time();

   $now_date = new DateTime();
   $now_date->setTimestamp($now);

   $interval = $birth_date->diff($now_date); // $interval is a DateInterval


   $age = $interval->y; // number of years in the interval
   return $age;
}
function get_persons($name, $gender, $offset, $persons_per_page) 
{
    $connection = mysql_open();

    $query = "SELECT SQL_CALC_FOUND_ROWS id, username, gender, dateOfBirth FROM Person";
    if ($name && $gender) 
    {
        $query .= " WHERE name like '%$name%' AND gender like '%$gender%'";
    }
    $query .= " order by id";
    $query .= " LIMIT $offset, $persons_per_page";
    // print "$query<br>\n";

    $result = mysql_query($query, $connection) or show_error();

    $r = mysql_query("SELECT FOUND_ROWS()", $connection) or showerror();
    $r = mysql_fetch_array($r);
    $num_entries = $r[0];

    $entries = array();

    $person_list = array();
    while ($person = mysql_fetch_array($result)) {
        $person_list[] = $person;
    }

    mysql_close($connection) or show_error();
    return array($person_list, $num_entries);
}
create table if not exists Person
(
  id int not null auto_increment primary key,
  username varchar(10) not null,
  name varchar(40) not null,
  gender varchar(1) not null,
  dateOfBirth timestamp not null,
  email varchar(40) not null
);
这会产生以下错误:

Notice: Undefined variable: dateOfBirth in /net/homes.ict.griffith.edu.au/export/home/s2737451/public_html/wp/labs/lab5/index.php on line 39 Fatal error: Call to a member function setTimestamp() on a non-object in /net/homes.ict.griffith.edu.au/export/home/s2737451/public_html/wp/labs/lab5/includes/defs.php on line 167

提前谢谢,我真的需要这方面的帮助:(

更新


我试过了,但它还是给了我机会 错误:
致命错误:调用成员
函数setTimestamp()在
非宾语
/net/homes.ict.griffith.edu.au/export/home/s2737451/public_html/wp/labs/lab5/inc-ludes/defs.php
在线167

我认为这是因为您正在覆盖DateTime对象:

$birth_date = new DateTime();
$birth_date = $birth; // you overwrite the instance of DateTime you created with another value
$birth_date->setTimestamp($birth);
应该是:

$birth_date = new DateTime();
$birth_date->setTimestamp($birth);

就像错误所说的,当变量
$dateOfBirth
尚未定义时,您尝试使用该变量:

$ages[$i] = age($person_list[$i].$dateOfBirth, time());
我认为问题在于您混淆了smarty和php语法……这一行应该是:

$ages[$i] = age($person_list[$i]['dateOfBirth'], time());
另一方面,为什么要对年龄使用单独的数组?为什么不将该元素添加到每个人的值数组中

foreach($person_list as $i => $person)
{
    $person_list[$i]['age'] = age($person['dateOfBirth'], time());
}

我认为prodigitalson解决了您的问题,但对您的代码有一些杂项建议:

  • SQL查询不易受到攻击。这是因为您直接将用户输入(获取参数)插入到SQL查询字符串中,这是一个大的NO。对于字符串值,应使用字符串转义函数,以确保将字符串安全插入查询中。对于MySQL,请使用以下函数:

    $query .= " WHERE name like '%" . mysql_escape_string($name) . "%' AND gender like '%" . mysql_escape_string($gender) . "%'";
    
    $num_entries = mysql_num_rows($result);
    
    对于数值,您应该检查以确保用户输入的是数字,而不是字母。您可能希望
    $offset
    始终为正数,因此可以使用该函数确保变量仅包含数字字符(0-9)。每页
    $persons\u的值在脚本中是硬编码的,因此您不必担心

    if (!ctype_digit($offset)){
       //set to a default value if it's not a positive integer
       $offset = 10;
    } 
    $query .= " LIMIT $offset, $persons_per_page";
    
  • 您可以简化计算返回的人员条目数的代码。请使用以下函数:

    $query .= " WHERE name like '%" . mysql_escape_string($name) . "%' AND gender like '%" . mysql_escape_string($gender) . "%'";
    
    $num_entries = mysql_num_rows($result);
    

或者您可以通过更改sql命令来执行此操作:

function get_persons($name, $gender, $offset, $persons_per_page) 
{
    $connection = mysql_open();

   $query = "SELECT SQL_CALC_FOUND_ROWS id, username, gender, (YEAR(NOW())-YEAR(dateOfBirth)) as age FROM Person";
    if ($name && $gender) 
    {
        $query .= " WHERE name like '%$name%' AND gender like '%$gender%'";
    }
    $query .= " order by id";
    $query .= " LIMIT $offset, $persons_per_page";

    $result = mysql_query($query, $connection) or show_error();

    $r = mysql_query("SELECT FOUND_ROWS()", $connection) or showerror();
    $r = mysql_fetch_array($r);
    $num_entries = $r[0];

    $entries = array();

    $person_list = array();
    while ($person = mysql_fetch_array($result)) {
        $person_list[] = $person;
    }

    mysql_close($connection) or show_error();
    return array($person_list, $num_entries);
}

setTimeStamp()用于“null”变量。您确定$birth\u date->setTimeStamp($birth)$birth中的值不为null吗?这是第39行?我尝试过,但仍然出现错误:致命错误:调用成员函数setTimeStamp()在第167行的/net/homes.ict.griffith.edu.au/export/home/s2737451/public_html/wp/labs/lab5/includes/defs.php中的非对象上,您已经用另一个值覆盖了DateTime对象。请查看我的更新。我尝试过了,但我所有的年龄都显示为“0”。[code]{section name=I loop=$person_list}
  • {$person_list[I]。用户名},{$person_list[I].gender},{$person\u list[i].age}{/section}[/code]尝试var\u dump($person\u list)以确保实际存在年龄。