在 MySQL 中使用 PHP 变量

Using PHP Variables in MySQL

我只是想知道为什么这个查询 returns 在浏览器的 PHP 中没有任何内容,而在 MySQL 中使用时它 returns 有很多项目Workbench.

我通过回显这两个然后使用相同的日期并在 MySQL Workbench.

中获取返回的项目来获取日期
$_POST['startdate']
$_POST['enddate']

所以我不确定为什么它在查询中不起作用。没有出现PHP或MySQLerrors/warnings。

SELECT 
        mantis_category_table.name, 
        mantis_bug_history_table.bug_id, 
        FROM_UNIXTIME(mantis_bug_table.date_submitted, "%m-%d-%Y") AS DATE2, 
        FROM_UNIXTIME(min(mantis_bug_history_table.date_modified), "%m-%d-%Y") AS FirstOfdate_modified,
        ROUND((min(mantis_bug_history_table.date_modified)- mantis_bug_table.date_submitted)/ 86400, 1) as day_difference
    FROM (mantis_bug_table INNER JOIN mantis_bug_history_table 
    ON 
        mantis_bug_table.id = mantis_bug_history_table.bug_id) 
    INNER JOIN 
        mantis_category_table ON mantis_bug_table.category_id = mantis_category_table.id 
    WHERE
        FROM_UNIXTIME(mantis_bug_table.date_submitted, "%m-%d-%Y")
            BETWEEN '.$_POST['startdate'].' AND '.$_POST['enddate'].'
    GROUP BY 
        mantis_category_table.name, mantis_bug_table.category_id, mantis_bug_table.date_submitted, mantis_bug_table.status, mantis_bug_history_table.bug_id, mantis_bug_history_table.field_name, mantis_bug_history_table.new_value 
    HAVING 
        (((mantis_bug_table.status)<>90) AND ((mantis_bug_history_table.field_name)="status") AND ((mantis_bug_history_table.new_value)="50")) 
    ORDER BY 
        mantis_category_table.name, mantis_bug_table.date_submitted'

问题似乎出在查询的这一部分。这在 MySQL 中无效吗?有更好的方法吗?

    WHERE
        FROM_UNIXTIME(mantis_bug_table.date_submitted, "%m-%d-%Y")
            BETWEEN '.$_POST['startdate'].' AND '.$_POST['enddate'].'

谢谢。

首先,您应该始终在将用户输入传递给查询之前对其进行转义,或者更好的是,使用准备好的语句。看到这个 related question.

其次,您必须确保从 PHP 收到的日期值与数据库中存储的日期值的格式相同。由于您在列中存储了 unix 时间,因此您可以使用 strtotime to convert your posted dates into a unix time suitable for direct comparison to the column values, or you could use date_format 将它们转换为有效的日期格式,就像您在当前比较中尝试的那样。

按照OP的意愿:

像这样连接您的值:

BETWEEN "'.$_POST['startdate'].'" AND "'.$_POST['enddate'].'"

因为您缺少引号,因为我们正在处理字符串值。

日期可以包含连字符(和冒号),例如 2015-01-05 22:00,这将引发 SQL 错误。

不过,我想指出的是,使用这种类型的查询是对 SQL injection 开放的。

使用mysqli with prepared statements, or PDO with prepared statements它们更安全