我正在尝试构建动态查询,并且出现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
答案 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 ...
这样,只要English
和German
表共享相同的结构,您就不必对查询的其余部分进行任何更改。
如果可以,您还可以考虑将两个表合并为一个,添加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;