Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 添加额外条件检查时的SQL查询语法_Php_Mysql - Fatal编程技术网

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

Php 添加额外条件检查时的SQL查询语法,php,mysql,Php,Mysql,我正在尝试编写一个获取id和日期的SQL查询。我在语法正确性方面遇到了一些问题: $query = $this->pdo->prepare('SELECT * FROM `' . $this->table . '` WHERE `id` = ' . $id . ' AND `date` = ' . $date . ''); 我最初没有对日期进行第二次检查,结果很好: $query = $this->pdo->prepare('SELECT * FROM `' .

我正在尝试编写一个获取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
的列,这不太可能。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字符串用双引号分隔,则可以执行此操作。阅读了解详细信息。

正如其他人在上面所评论的,您的日期周围没有引号。您的语法将创建以下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字符串用双引号分隔,则可以执行此操作。阅读以了解详细信息。

因为
$date
是一个字符串,需要被引用。在第一个示例的末尾有一对额外的单引号。将
放在
$date
之后<代码>$date)你介意为它添加答案吗@u_mulder。还有Dave我试过你的建议但运气不好:(您使用的是pdo,所以您应该使用参数化查询……而数据库设计使得使用变量作为表名似乎是一个好主意通常是有缺陷的。好的,但是有人介意为我在上面发布的内容显示正确的语法吗?因为
$date
是一个字符串,需要被引用。您还有一对单独的在第一个示例末尾加引号。将
紧跟在
$date
$date)之后你介意为它添加答案吗@u_mulder。还有Dave我试过你的建议但运气不好:(您使用的是pdo,所以您应该使用参数化查询……而数据库设计使得使用变量作为表名似乎是一个好主意通常是有缺陷的。好的,但是有人介意为我在上面发布的内容向我展示正确的语法吗刨平!效果很好