使用_POST参数构建SQL查询

时间:2015-10-02 10:01:36

标签: php mysql

我正在尝试构建动态查询,并且出现SQL语法错误。明确键入时,以下查询语句可正常工作:

$sql = "SELECT * FROM English WHERE submitdate = '2015-09-30'";

但是,如果我尝试使用_POST参数构建相同的查询,我会收到语法错误,即使错误显示如上所示的正确查询:

if ($_POST["lang"] === "de") :
  $query_lang = 'SELECT * FROM German';
elseif ($_POST["lang"] === "en") :
  $query_lang = 'SELECT * FROM English';
else :
  $query_lang = 'SELECT * FROM English, German';
endif;

if ( !empty($_POST["date"]) || $_POST["date"] != "all") :
  $query_date = ' WHERE submitdate = \''. $_POST["date"] . '\'';
else :
  $query_date = '';
endif;

$sql = '"' . $query_lang . $query_date . '"';

错误消息是

Error: "SELECT * FROM English WHERE submitdate = '2015-09-30'"<br>
You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 
'"SELECT * FROM English WHERE submitdate = '2015-09-30'"' at line 1

3 个答案:

答案 0 :(得分:2)

我认为你在写

"SELECT * FROM English WHERE submitdate = '2015-09-30'"

而不是

SELECT * FROM English WHERE submitdate = '2015-09-30'

尝试把这个

$sql = $query_lang . $query_date;

看看它是否有效

答案 1 :(得分:0)

如果$_POST["lang"]未设置或不同于'en''de',则最终会查询

SELECT * FROM English, German WHERE submitdate = '2015-09-30'

这会引发错误,因为submitdate在两个表之间都不明确。

编辑:目前,这不是您正在寻找的答案。我把它留在这里,因为当你修复了farugi87或RiggsFolly所建议的内容时它会变得相关。

在这种情况下,您可以使用UNION

SELECT * FROM
(SELECT * FROM English 
UNION SELECT * FROM German) t
WHERE submitdate ...

这样,只要EnglishGerman表共享相同的结构,您就不必对查询的其余部分进行任何更改。

如果可以,您还可以考虑将两个表合并为一个,添加lang列。然后,您可以查询:

SELECT *
FROM thisNewTable
WHERE lang = 'en' -- or lang = 'de' or no filter at all in case of 'all'
AND submitdate = ...

答案 2 :(得分:0)

你使字符串连接比它需要的更难。

像这样简化它,你将删除查询周围的意外额外引号。

if ( !empty($_POST["date"]) || $_POST["date"] != "all") :
  $query_date = " WHERE submitdate = '{$_POST["date"]}'";
else :
  $query_date = '';
endif;

$sql = $query_lang . $query_date;