【发布时间】:2021-05-28 21:13:50
【问题描述】:
这是我的尝试:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
【问题讨论】:
这是我的尝试:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');
$query->execute(array('value'));
while ($results = $query->fetch())
{
echo $results['column'];
}
【问题讨论】:
我有类似的需求,但使用的是从表单中获取的变量。我这样做是为了使用 PHP 从我的 PostgreSQL 数据库中获取结果:
<?php
$player = $_POST['search']; //variable from my search form
$find = $sqlPDO->prepare("SELECT player FROM salaries WHERE player ILIKE ?;");
$find->execute(['%'.$player.'%']);
while ($row = $find->fetch()) {
echo $row['player']."</br>";
}
?>
“ILIKE”使搜索不区分大小写,因此搜索购物车或购物车或购物车都将返回相同的结果。
【讨论】:
对于那些使用命名参数的人,这里是如何使用LIKE 和% 部分匹配MySQL 数据库:
WHERE column_name LIKE CONCAT('%', :dangerousstring, '%')
其中命名参数为:dangerousstring。
换句话说,在您自己的查询中使用明确未转义的% 符号,这些符号是分开的,绝对不是用户输入。
编辑: Oracle 数据库 的连接语法使用连接运算符:||,因此它会变成:
WHERE column_name LIKE '%' || :危险字符串 || '%'
但是,@bobince 提到 here 时有一些注意事项:
difficulty 当您希望在 搜索字符串,而不是作为通配符。
因此,在组合 like 和参数化时,还有其他需要注意的地方。
【讨论】:
LIKE CONCAT('%', :something, '%')。参考:stackoverflow.com/a/661207/201648
SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' ) 测试了它,这会给我错误。
and it means named placeholders can be used。当您在 PHP 中连接时,命名占位符甚至是一个问题?显然,PHP 中的连接支持命名和位置,并且更便携,因为您可以对任何数据库使用相同的查询。我真的不明白为什么这么多人认为命名占位符和位置占位符之间存在任何区别。
我从php delusions得到这个
$search = "%$search%";
$stmt = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();
它对我有用,非常简单。就像他说的那样,在将其发送到查询之前,您必须“先准备好我们的完整文字”
【讨论】:
这行得通:
search `table` where `column` like concat('%', :column, '%')
【讨论】:
PDO 转义“%”(可能导致 sql 注入):使用前面的代码在寻找匹配部分字符串时会给出期望的结果 BUT 如果 a访问者键入字符“%”,即使数据库中没有存储任何内容,您仍然会得到结果(可能导致 sql 注入)
我已经尝试了很多变体,所有结果都相同 PDO 正在转义“%”导致不想要/不兴奋的搜索结果。
我虽然值得分享,如果有人在它周围找到了一个词,请分享它
【讨论】:
你也可以试试这个。我遇到了类似的问题,但经过研究得到了结果。
$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');
$stmt= $pdo_connection->prepare($query);
$stmt->execute(array(':search' => '%'.$search_term.'%'));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($result);
【讨论】:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();
if (!$query->rowCount() == 0)
{
while ($results = $query->fetch())
{
echo $results['column'] . "<br />\n";
}
}
else
{
echo 'Nothing found';
}
【讨论】:
bindValue 是否可以防止注入攻击?接受的答案基本上否定了使用? 占位符的价值,方法是将搜索字符串连接到%,就像在过去的日子一样。
我发帖后马上想通了:
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));
while ($results = $query->fetch())
{
echo $results['column'];
}
【讨论】:
like 会怎样? execute数组应该如何按顺序执行?