【问题标题】:Set PHP variable to MySQL wildcard '%' [duplicate]将 PHP 变量设置为 MySQL 通配符 '%' [重复]
【发布时间】:2017-08-13 16:31:53
【问题描述】:

我正在尝试使用数据库列 'tags' = something 的 PDO 查询帖子。

我的问题是:即使没有设置 $_GET['tag'] 请求,我也希望我的查询能够工作,这是我的代码。

if (!isset($_GET['tag'])) {
    $tags = '%';
} else {
    $tags = $_GET['tag'];
}

$get_recipes = $con->prepare ("SELECT * FROM recipes WHERE tags = ?");
$get_recipes->execute(array($tags));
$recipes = $get_recipes->fetchAll();

将PHP变量$tags设置为MySQL通配符%是否有效?如果不可能,那么我应该怎么做才能使我的查询正常工作?

当我运行该代码并且没有写入 $_GET['tag'] 时,查询将不会从数据库中获取任何帖子。

【问题讨论】:

  • 你还要设置你的通配符吗?随机标签?
  • 我希望它是这样的。如果没有选择标签,那么无论标签如何,都显示所有帖子。

标签: php mysql pdo


【解决方案1】:

在 PDO 的准备好的语句中使用通配符

在 MySQL 中使用通配符时,您必须使用 LIKE 运算符。在PDO中将通配符与参数绑定是正确的。

你会这样准备你的陈述。

$get_recipes = $con->prepare ("SELECT * FROM recipes WHERE tags LIKE ?");

然后您将使用% 字符绑定您的参数,就像这样。

 $get_recipes->execute(array('%'));

虽然这是按照您建议的方式使用通配符的正确方法,但这并不是您想要做的事情的正确解决方案。

如何实现您想要实现的目标

在您的代码中,如果未设置$_POST['tags'],您似乎想要选择所有行,如果已设置,您想要选择所有将tags 列设置为$_POST['tags'] 值的行。为此,您需要在条件中准备语句,就像这样。

if (!isset($_GET['tag'])) {
    $get_recipes = $con->prepare ("SELECT * FROM recipes");
    $get_recipes->execute();
} else {
    $get_recipes = $con->prepare ("SELECT * FROM recipes WHERE tags = ?");
    $get_recipes->execute(array($_GET['tag']));
}

$recipes = $get_recipes->fetchAll();

【讨论】:

  • 使用LIKE操作符居然解决了!我现在的查询是SELECT * FROM recipes WHERE tags LIKE ?。只有一个查询,它适用于我之前所做的 $tags = '%';
  • 请注意,您将排除所有在tags 列中具有NULL 值的行,以及在tags 列中具有空字符串的所有行。
  • 明白了。我现在将您的方法与ifelse 2 个查询一起使用,以避免丢失带有NULL 和空字符串的行。
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2012-06-03
  • 2023-03-24
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多