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