2013-05-12 66 views
-2

我想回复从特定日期(CURDATE())剩下多少分钟。SQL SYNTAX错误PHP

那怎么我已经做到了:

public function getTimeLeft($ip) 
{ 
    $this->get = $this->pdo->prepare("SELECT DATE_FORMAT(TIMEDIFF(CURDATE(), 'nextVote')); FROM auths WHERE voter_ip = :ip"); 
    $this->get->execute(array(":ip" => $ip)); 
} 

错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1582 Incorrect parameter count in the call to native function 'DATE_FORMAT'' in C:\xampp\htdocs\vote\includes\class\Vote.class.php:174 Stack trace: #0 C:\xampp\htdocs\vote\includes\class\Vote.class.php(174): PDOStatement->execute(Array) #1 C:\xampp\htdocs\vote\index.php(644): Vote->getTimeLeft('127.0.0.1') #2 {main} thrown in C:\xampp\htdocs\vote\includes\class\Vote.class.php on line 174 

有什么不对这种语法?

+0

''nextVote''被视为一个字符串,因为引号。你的意思是'''''''''反推''''反引号'? – 2013-05-12 18:49:09

+0

删除字符串''后我得到相同的错误。 – user2363542 2013-05-12 18:50:28

+9

删除'FROM'前面的';'。 [MySQL DATE_FORMAT](http://dev.mysql.com/doc/refman/5.1/zh/date-and-time-functions.html#function_date-format)需要2个参数,您只需提供1. – 2013-05-12 18:51:18

回答

1
  • 你可以单独用分号;多个SQL语句,但我 不会把一个在您的查询的中间!
  • DATE_FORMAT需要两个参数。第二个是format string
  • 'nextVote'是一个字符串文字,尝试nextVote或`nextVote`作为列名称
  • curdate()返回日期。在整个日期和时间使用now()See here for an example.

所以可以尝试像:

SELECT DATE_FORMAT(TIMEDIFF(NOW(), nextVote), '%b %d %Y %h:%i %p') 
FROM auths 
WHERE voter_ip = :ip 
+0

这真的值得更多upvotes。 – Kermit 2013-05-12 20:25:39

+0

@FreshPrinceOfSO:谢谢,但我不这么认为,在提交我的答案之前,大多数观点都是在评论中提出的。 – Andomar 2013-05-12 20:32:07

+0

太懒得把它们都读完。 – Kermit 2013-05-12 20:32:41

1

CURDATE()返回只有日期,没有任何时间。另外DATE_FORMAT需要第二个参数指定您想要的格式。即'%m-%d-%Y%T'。

为此,您可以通过两种方式:

使用TIMEDIFF

SELECT TIMEDIFF(NOW(), `nextVote`) 
FROM auths 
WHERE `voter_id` = :ip 

返回:

-71:27:44 

如果只想分钟就可以使用TIMESTAMPDIFF

SELECT TIMESTAMPDIFF(MINUTE, `nextVote`, NOW()) 
FROM auths 
WHERE `voter_id` = :ip 

返回:

-4288 

注:TIMEDIFF(A,B)是A-B而TIMESTAMPDIFF(单元中,a,b)是B-A。

+0

+1并欢迎使用堆栈溢出。你可能会考虑更接近这个问题,它没有提到分钟选项。 – Andomar 2013-05-12 20:36:41

+0

谢谢。我添加了分钟选项,因为在他的问题中“试图回应剩下多少分钟”。 – MikeG 2013-05-13 01:22:15