我正在尝试编写一个获取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 . '` ');
答案 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了解详情。