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);
始终为正数,因此可以使用该函数确保变量仅包含数字字符(0-9)。每页$offset
$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);
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}