添加额外条件检查时的SQL查询语法

时间:2018-06-12 16:18:41

标签: php mysql

我正在尝试编写一个获取id和日期的SQL查询。我在解决语法错误方面遇到了一些麻烦:

$query = $this->pdo->prepare('SELECT * FROM `' . $this->table . '` WHERE `id` = ' . $id . ' AND `date` = ' . $date . '');

我最初没有对照日期进行第二次检查,并且工作正常:

$query = $this->pdo->prepare('SELECT * FROM `' . $this->table . '` WHERE `id` = ' . $id . '');

但是当我添加检查日期时出错了。

请帮我找到语法错​​误。谢谢!

更新:

在没有运气的情况下尝试了这个:

$query = $this->pdo->prepare('SELECT * FROM `' . $this->table . '` WHERE `id` = `' . $id. '` AND `date` = `' . $date . '` ');

1 个答案:

答案 0 :(得分:2)

正如其他人在上面评论的那样,你的日期没有引号。您的语法将创建此SQL:

... WHERE `id` = 123 AND `date` = 2018-06-12 -- WRONG

但正确的语法如下。换句话说,日期常量应该用单引号分隔。

... WHERE `id` = 123 AND `date` = '2018-06-12' -- RIGHT

你的第二次尝试背蜱也是错误的。后面的标记用于分隔标识符,如列名或表名。这种语法意味着您要将id与名称为123的列进行比较,并且我假设您没有这样的列。对于日期周围的反向标记也是如此 - 它被解释为名为2018-06-12的列,这是不太可能的。 MySQL不会像单引号一样处理反向标记。

... WHERE `id` = `123` AND `date` = `2018-06-12` -- WRONG

但是,有一个更简单的解决方案。如果使用查询参数,则不必担心引号:

$sql = "SELECT * FROM `{$this->table}` WHERE `id` = ? AND `date` = ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$id, $date]);

您已经在使用prepare(),因此您应该充分利用它并使用查询参数(?占位符),而不是将变量插入到SQL查询字符串中。

使用参数时,不需要在字符串或日期周围使用引号。实际上,您不能使用引号来分隔?参数占位符。

注意我还展示了PHP语法,用于将变量直接放入字符串而不破坏字符串并使用.进行连接。如果PHP字符串用双引号分隔,则可以执行此操作。请阅读http://php.net/manual/en/language.types.string.php#language.types.string.parsing了解详情。