php - php中的SQL,使用LIKE进行部分搜索

标签 php mysql sql

我试图在 php 中使用 SQL 返回与用户输入的关键字(从搜索栏)匹配的所有条目。 我想返回其名称“部分”与关键字匹配的所有条目。 如果数据库中的条目名称之前有空格并且之后可能有另一个字母/空格,我至少希望匹配关键字。 例如,我有三个条目,名称为“牛奶”、“半脱脂牛奶”和“全脂牛奶 2”。如果关键字是“Milk”或“milk”或“MiLK”,我想获取所有这三个条目。 我认为问题可能是区分大小写的唯一情况。 我尝试使用数据库中完全存在的关键字,但我的应用程序(在 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 应该与您使用的驱动程序支持的任何语法绑定(bind)。

您的查询应该是:

SELECT * FROM items WHERE name LIKE CONCAT ('%', Milk, '%')

并且您希望 Milk 是一个字符串,因此需要将其引起来。因为 mysql 会认为这是一列。

或者你可以这样做:

$keyword = '%' . $_POST['keyword'] . '%';
$sql = "SELECT * FROM items WHERE name LIKE CONCAT ?";

这是相同的,但仍然需要绑定(bind)。

绑定(bind)还消除了 SQL 注入(inject)。请参阅How can I prevent SQL injection in PHP?和/或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();

关于php - php中的SQL,使用LIKE进行部分搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54538044/

相关文章:

mysql - 如何将 "index"添加到 MySQL 中的行组

mysql - 在 SQL 中检索缺失的关系

Mysql:2个ID的主键内部连接给出 "Range checked for each record"

php - Laravel 不根据数据库 ID 导航到 url

javascript - 在 Jquery 中使用 php 变量

mysql - 无法正常启动 Jmeter

SQL 左/分隔字符

mysql - 如何从两个不同的表中获取数据(没有重复记录)?两个表都有共同的值(value)

php - 如何使用 xampp 在 OSX 上正确设置 php_gmp

php - 为什么此代码生成的随机代码有时存储为 7 位数字而不是 8 位数字