Проблема с отображением возраста на основе метки времени dateOfBirth mysql - PullRequest
1 голос
/ 09 апреля 2011

У меня есть сайт с профилями пользователей. На домашней странице я пытаюсь показать небольшие резюме профиля каждого человека. Это резюме включает имя человека, пол и возраст человека.

        <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>

Ранее я использовал цикл foreach для их выполнения, но мне нужен индекс, чтобы также отображать возраст отображения, вычисленный в файле index.php.

if (isset($_GET['name']) && isset($_GET['gender'])) 
{
   $name = $_GET['name'];
   $gender = $_GET['gender'];
} 
else 
{
   $name = "";
   $gender = "";
}

define("PERSONS_PER_PAGE", 10);


if (isset($_GET['offset'])) 
{
    $offset = $_GET['offset'];
} 
else 
{
    $offset = 0;
}


list($person_list, $num_persons) = get_persons($name, $gender, $offset, PERSONS_PER_PAGE);

$ages = array();


for ($i = 0; $i < count($person_list); $i++)
{
    $ages[$i] = age($person_list[$i].$dateOfBirth, time());
}

$smarty = new Smarty;
$smarty->assign("name", $name);
$smarty->assign("gender", $gender);
$smarty->assign("persons_per_page", PERSONS_PER_PAGE);
$smarty->assign("interests", $interests);
$smarty->assign("offset", $offset);
$smarty->assign("num_persons", $num_persons);
$smarty->assign("person_list", $person_list);
$smarty->assign("ages", $ages);
$smarty->display("index.tpl");

Не беспокойтесь о $ offset и PERSONS_PER_PAGE, которые используются только для нумерации страниц.

Функция моего возраста выглядит следующим образом:

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;
}

Дополнительно, если это актуально; моя функция get_persons выглядит так:

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

Заранее спасибо, мне очень нужна помощь по этому вопросу: (

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

Я думаю, что prodigitalson решил вашу проблему, но есть несколько разных предложений для вашего кода:

  • Ваш SQL-запрос уязвим для SQL-инъекций атак.Это потому, что вы непосредственно вставляете пользовательский ввод (параметры GET) в строку запроса SQL - большой NO NO .Для строковых значений вы должны использовать функцию escape-строки, которая обеспечивает безопасную вставку строки в запрос.Для MySQL используйте функцию mysql_escape_string():

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

    Для числовых значений вы должны убедиться, что пользователь ввел число, а не что-то еще, например буквы.Возможно, вы хотите, чтобы $offset всегда был положительным числом, поэтому вы можете использовать функцию ctype_digit(), чтобы убедиться, что переменная содержит только цифры (0-9).Значение $persons_per_page жестко закодировано в вашем скрипте, поэтому вам не нужно об этом беспокоиться.

    if (!ctype_digit($offset)){
       //set to a default value if it's not a positive integer
       $offset = 10;
    } 
    $query .= " LIMIT $offset, $persons_per_page";
    
  • Вы можете упростить код, который вычисляет числоЗаписи человека, которые были возвращены.Используйте функцию mysql_num_rows():

    $num_entries = mysql_num_rows($result);
    
1 голос
/ 09 апреля 2011

Обновление :

Я пытался это сделать, но все равно выдает ошибку: 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/inc­ludes/defs.php on line 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());
}
0 голосов
/ 09 апреля 2011

или вы можете сделать это, изменив команду 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);
}
...