2013-05-27 71 views
2

我不知道如何将代码显示为年龄与在mysql中的出生日期..always给我1 ..你能告诉我我的错误在哪里吗?如何使用PDO和MySQL获取出生日期的年龄?

这是代码:

<?php 
$query = "SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(f_nacimiento, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(f_nacimiento, '00-%m-%d')) AS age from PACIENTES where id_paciente = $_GET[id_paciente]"; 
echo print $age; ?> 
的分贝行f_nacimiento

是日期型(YYYY-MM-DD)

最诚挚的问候!

+0

重复的手动输入http://dev.mysql.com/doc/refman/5.0/zh-CN/date-calculations.html –

回答

2

结果是简单的 “1”,因为你选择一个布尔表达式。
也就是说,X < Y只返回0或1.

在MySQL中进行日期算术有一个更简单的方法。 DATEDIFF()函数返回两个日期之间的天数。

$query = "SELECT FLOOR(DATEDIFF(NOW(), f_nacimiento)/365.25) AS age 
    FROM PACIENTES 
    WHERE id_paciente = ?"; 

if (($stmt = $pdo->prepare($query)) === false) { 
    die(print_r($pdo->errorInfo(), true)); 
} 

$id_paciente = $_GET["id_paciente"]; 
if ($stmt->execute(array($id_paciente)) === false) { 
    die(print_r($stmt->errorInfo(), true)); 
} 

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    echo $row["age"] . "\n"; 
} 

我测试了这个表如下:

CREATE TABLE `PACIENTES` (
    `id_paciente` int(11) NOT NULL AUTO_INCREMENT, 
    `f_nacimiento` date DEFAULT NULL, 
    PRIMARY KEY (`id_paciente`) 
) ENGINE=InnoDB; 

PS:上面的示例代码显示了PDO编程的另外两个重要的习惯:

  • 使用查询参数,做不直接将字符串插入到SQL中。
  • 检查从prepare()和execute()返回的错误状态。

回复您的意见,需要在今后几年里显示年龄,个月。这里是我的第二次尝试(与天抛出的乐趣):

SELECT TIMESTAMPDIFF(YEAR 
    , f_nacimiento 
    , NOW() 
    ) AS Years, 
    TIMESTAMPDIFF(MONTH 
    , f_nacimiento 
     + INTERVAL TIMESTAMPDIFF(YEAR, f_nacimiento, NOW()) YEAR 
    , NOW() 
    ) AS Months, 
    TIMESTAMPDIFF(DAY 
    , f_nacimiento 
     + INTERVAL TIMESTAMPDIFF(MONTH, f_nacimiento, NOW()) MONTH 
    , NOW() 
    ) AS Days 
FROM PACIENTES 
WHERE id_paciente = 1; 
+0

同样的结果...和我改变?到'$ _GET [id_paciente]',这也超过了“选择”'$ id_paciente =(int)',但结果相同...总是1 –

+0

我已经在使用PHP 5.3.15和MySQL进行测试后编辑了上述代码31年5月5日。它确实有效。 –

+0

我已经在数据库中更改DATE日期,但我不知道为什么要显示数字1?我的引擎是MYSAM –

-1

您需要在字符串中正确使用$ _GET变量。

$query = "SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(f_nacimiento, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(f_nacimiento, '00-%m-%d')) AS age from PACIENTES where id_paciente = $_GET[id_paciente]"; 

到:

$query = "SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(f_nacimiento, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(f_nacimiento, '00-%m-%d')) AS age from PACIENTES where id_paciente = \"" . $_GET['id_paciente'] . "\""; 
// Do the query.... 
+0

不能正常工作。同样的结果“1” –

+0

-1有几个原因:最重要的是,这个答案不是解决查询问题。无法通知使用查询参数。不必要地使用引号来表示大概为整数的值。使用双引号而不是单引号在SQL中分隔字符串文字。 –

0

使用该查询,而不是,因为你正在使用PDO使用准备好的语句

SELECT EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM f_nacimiento) age FROM pacientes WHERE id_paciente = ? 

,为PHP

$dbh = new PDO(..... 
$st = $dbh->prepare($query); 
$st->execute([(string)$_GET['id_paciente']]); 
var_dump($st->fetchAll()); 
+0

给我这个错误'解析错误:语法错误,意外'[',expectcting')'' –

+1

使用“短阵列语法”(方括号而不是'array()')仅适用于PHP 5.4及更高版本。 –

相关问题