繁体   English   中英

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

[英]SQL in php, make partial search using LIKE

我正在尝试使PHP中的SQL返回与用户输入的关键字匹配的所有条目(从搜索栏输入)。 我想返回其名称“ partial”与关键字匹配的所有条目。 如果数据库中的条目名称之前有空格,可能在另一个字母/空格之后,我至少要匹配关键字。 例如,我有三个条目,名称分别为“牛奶”,“半脱脂牛奶”和“全脂牛奶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应该与您使用的驱动程序支持的任何语法绑定。

因为您的查询将是:

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();

在这种情况下,您可以默认将搜索栏中的输入转换为大写或小写,然后在数据库中应用查询,例如

对于大写:

$keyword =strtoupper($_POST['keyword']); 
$sql = "SELECT * FROM items WHERE upper(name) LIKE '%$keyword%)";

或小写:

$keyword =strtolower($_POST['keyword']); 
$sql = "SELECT * FROM items WHERE lower(name) LIKE '%$keyword%)";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM