将PHP变量设置为MySQL通配符'%'

时间:2017-08-13 16:31:54

标签: php mysql pdo

我尝试使用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']时,查询将不会从数据库中获取任何帖子。

1 个答案:

答案 0 :(得分: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();