php - php中的SQL,使用LIKE进行部分搜索
问题描述
我正在尝试在 php 中创建 SQL 以返回与用户输入的关键字匹配的所有条目(来自搜索栏)。我想返回其名称“部分”与关键字匹配的所有条目。我想至少匹配关键字,如果数据库中的条目名称之前有空格并且可能在另一个字母/空格之后。例如,我有三个名称为“牛奶”、“半脱脂牛奶”和“全脂牛奶 2”的条目。如果关键字是“牛奶”或“牛奶”或“牛奶”,我想获得所有这三个条目。我认为可能是问题的唯一情况是区分大小写。我尝试使用数据库中完全存在的关键字,但我的应用程序(在 android 上)停止了。
基于 user3783243 的回答。
PHP文件
<?php
$servername = "";
$username = "";
$password = "";
$dbname = "";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT name FROM items WHERE name LIKE CONCAT ('%', ?, '%')";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $keyword);
$res = $stmt->get_result();
while($row = $res->fetch_assoc()) {
echo $row["name"] . ",";
}
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo $row["name"] . ",";
}
} else {
echo "0";
}
$conn->close();
?>
解决方案
您的查询应该是:
$sql = "SELECT * FROM items WHERE name LIKE CONCAT ('%', ?, '%')";
然后$keyword
应该与您使用的驱动程序支持的任何语法绑定。
正如您的查询一样:
SELECT * FROM items WHERE name LIKE CONCAT ('%', Milk, '%')
你想Milk
成为一个字符串,所以它需要被引用。原mysql
以为那是一列。
或者你可以这样做:
$keyword = '%' . $_POST['keyword'] . '%';
$sql = "SELECT * FROM items WHERE name LIKE CONCAT ?";
这是相同的,但仍然需要绑定。
绑定还消除了 SQL 注入。请参阅如何防止 PHP 中的 SQL 注入?和/或https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_1:_Prepared_Statements_.28with_Parameterized_Queries.29
每次更新..替换:
$keyword =$_POST['keyword'];
$sql = "SELECT * FROM items WHERE name LIKE '%$keyword%)";
$result = $conn->query($sql);
和:
$sql = "SELECT name FROM items WHERE name LIKE CONCAT ('%', ?, '%')";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $keyword);
$stmt->execute();
$res = $stmt->get_result();
if(empty($conn->errno) && !empty($res)) {
while($row = $res->fetch_assoc()) {
echo $row["name"] . ",";
}
} else {
echo '0';
//print_r($conn->errno);
}
$conn->close();
...
也删除
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo $row["name"] . ",";
}
} else {
echo "0";
}
$conn->close();
推荐阅读
- avro - 在 spring 云流中返回通用记录时出错
- python - 如何在 setup.py 中使用自定义 PyPI 编写 Python 包?
- angularjs - 将包部署到不同的项目
- python - 为什么我的 groupby 为“产品”列返回不正确的值?
- microsoft-teams - 如何在 Microsoft Teams 中显示自定义选项卡应用程序的内容以进行统一搜索
- javascript - SQLSTATE[42000],未定义密码
- java - 在我自己的 android 应用程序上使用 VLC 媒体播放器
- spring - 每次我将项目作为 spring 应用程序运行时,spring data jpa 都会附加 create 语句,
- javascript - d3.js 棒棒糖图表 - 动画
- javascript - React Native - 模态触发按钮始终可见