在 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,它们更安全。
我只是想知道为什么这个查询 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,它们更安全。