[英]SQL Query Syntax when adding extra condition check
我正在尝试编写一个提取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 . '` ');
正如其他人在上面的评论所述,您在日期前后没有报价。 您的语法将创建以下SQL:
... WHERE `id` = 123 AND `date` = 2018-06-12 -- WRONG
但是正确的语法如下。 换句话说,日期常数应该用单引号引起来。
... WHERE `id` = 123 AND `date` = '2018-06-12' -- RIGHT
您第二次尝试使用反勾号也是错误的。 反引号用于分隔标识符,例如列名或表名。 这种语法意味着您正在将id
与名称为123
的列进行比较,并且我假设您没有这样的列。 该日期前后的2018-06-12
也一样,它被解释为名为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了解详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.