Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 来自_UNIXTIME的Mysql_Php_Mysql_Sql - Fatal编程技术网

Php 来自_UNIXTIME的Mysql

Php 来自_UNIXTIME的Mysql,php,mysql,sql,Php,Mysql,Sql,我有两个PHP变量的格式是DATETIME,但该列是UNIX时间戳。我如何正确地在它们之间进行转换 $date\u from和$date\u to采用日期时间格式。 日期行存储为UNIX时间戳 以下操作不起作用: if($date_from != "" && $date_to != "") { $result_pag_num = mysql_query("SELECT COUNT(*) AS count FROM messages WHERE (folder = '$fo

我有两个PHP变量的格式是DATETIME,但该列是UNIX时间戳。我如何正确地在它们之间进行转换

$date\u from
$date\u to
采用日期时间格式。
日期行
存储为UNIX时间戳

以下操作不起作用:

if($date_from != "" && $date_to != "") {
    $result_pag_num = mysql_query("SELECT COUNT(*) AS count FROM messages WHERE (folder = '$folder' AND username = '$username' AND FROM_UNIXTIME(dateline) BETWEEN '$date_from' AND '$date_to')");
} else {
    $result_pag_num = mysql_query("SELECT COUNT(*) AS count FROM messages WHERE (folder = '$folder' AND username = '$username')");
}

编辑:所有答案都很好。我接受了回答禁食的人。错误是我自己的错误。

您可能希望将查询更改为

... AND dateline BETWEEN UNIX_TIMESTAMP('$date_from') AND UNIX_TIMESTAMP('$date_to')
这样MySQL就可以在dateline字段上使用索引。您的版本强制它在进行比较之前将每个日期行字段转换为datetime值,这使得索引无法使用


否则,查询看起来很好。您确定
$date\u from
$date\u to
的格式正确,并且有符合查询中所有子句的记录吗?

您可能希望将查询更改为

... AND dateline BETWEEN UNIX_TIMESTAMP('$date_from') AND UNIX_TIMESTAMP('$date_to')
这样MySQL就可以在dateline字段上使用索引。您的版本强制它在进行比较之前将每个日期行字段转换为datetime值,这使得索引无法使用


否则,查询看起来很好。您确定
$date\u from
$date\u to
的格式正确,并且有符合查询中所有子句的记录吗?

如果数据库中的
日期行
列存储为时间戳,您应该将PHP变量转换为时间戳,并且不将
日期行
列转换为日期时间

为什么?
为了避免将
FROM_UNIXTIME()
函数应用于该列:如果您确实像您发布的那样使用该函数,MySQL将不得不为每个请求扫描整个表,并将该函数应用于所有行。。。
。。。这意味着您将失去在
dateline
上可能拥有的任何索引的优势,并让您的MySQL服务器做更多的工作


因此,以另一种方式重写查询:将
DateTime
s PHP变量转换为UNIX时间戳(数据库中的数据类型),使用
U
格式:

$ts_from = $date_from->format('U');
$ts_to = $date_to->format('U');

$result_pag_num = mysql_query("SELECT COUNT(*) AS count 
                    FROM messages WHERE (
                        folder = '$folder' 
                        AND username = '$username' 
                        AND dateline BETWEEN $ts_from AND $ts_to
                    )");


作为旁注:也许您在代码的前面已经这样做了,但是不要忘记正确地转义数据——特别是字符串,使用。

如果数据库中的
日期行
列存储为时间戳,您应该将PHP变量转换为时间戳,并且不将
日期行
列转换为日期时间

为什么?
为了避免将
FROM_UNIXTIME()
函数应用于该列:如果您确实像您发布的那样使用该函数,MySQL将不得不为每个请求扫描整个表,并将该函数应用于所有行。。。
。。。这意味着您将失去在
dateline
上可能拥有的任何索引的优势,并让您的MySQL服务器做更多的工作


因此,以另一种方式重写查询:将
DateTime
s PHP变量转换为UNIX时间戳(数据库中的数据类型),使用
U
格式:

$ts_from = $date_from->format('U');
$ts_to = $date_to->format('U');

$result_pag_num = mysql_query("SELECT COUNT(*) AS count 
                    FROM messages WHERE (
                        folder = '$folder' 
                        AND username = '$username' 
                        AND dateline BETWEEN $ts_from AND $ts_to
                    )");


作为旁注:也许您在代码的前面已经这样做了,但是不要忘记正确地转义数据——尤其是字符串,使用。

您不需要FROM_UNIXTIME函数。由于
dateline
列是datatype TIMESTAMP,MySQL将为您进行转换:

AND dateline BETWEEN '2011-03-01' AND '2011-03-11 17:00'
为了真正研究这个问题,我们需要知道$date\u from和$date\u To变量的实际内容,以及传递给MySQL的实际语句

此外,时区设置可能会影响datetime值的解释和比较方式

如果要传递unixtime样式的整数,那么应该省略单引号(以避免MySQL进行字符串比较的任何可能性)


您不需要FROM_UNIXTIME函数。由于
dateline
列是datatype TIMESTAMP,MySQL将为您进行转换:

AND dateline BETWEEN '2011-03-01' AND '2011-03-11 17:00'
为了真正研究这个问题,我们需要知道$date\u from和$date\u To变量的实际内容,以及传递给MySQL的实际语句

此外,时区设置可能会影响datetime值的解释和比较方式

如果要传递unixtime样式的整数,那么应该省略单引号(以避免MySQL进行字符串比较的任何可能性)


你所拥有的应该有用。在执行该查询之前,请确保MySQL时区设置正确。您所拥有的应该可以工作。在执行该查询之前,请确保MySQL时区设置正确。这对我不起作用$日期从is
2011-03-11 00:00:00
和$date\u到is
2011-03-11 23:59:59
。exmaple日期行是
1299526727
,这两个日期分别是
1299823200
1299909599
。您的
1299526727
比两者都小,因此它不是“介于两者之间”。在时间戳列上使用FROM_UNIXTIME()函数并不会禁用MySQL 5.1中的索引以及InnoDB引擎。这对我不起作用$日期从is
2011-03-11 00:00:00
和$date\u到is
2011-03-11 23:59:59
。exmaple日期行是
1299526727
,这两个日期分别是
1299823200
1299909599
。您的
1299526727
比两者都小,因此它不是“介于两者之间”。在时间戳列上使用FROM_UNIXTIME()函数并不会禁用MySQL 5.1中的索引以及InnoDB引擎。