使用php搜索Mysqli数据库时出现问题

使用php搜索Mysqli数据库时出现问题,php,mysql,Php,Mysql,我在Mysqli+PHP搜索功能中遇到问题。 我有一些记录有performerName=JOANNE GRACE舞蹈学校A有些记录有JOANNE GRACE舞蹈学校,有些记录只有JOANNE GRACE 如果我用查询搜索,我想要什么 $query = "JOANNE GRACE SCHOOL OF DANCE A"; SELECT * FROM `sections` WHERE `performerName` LIKE '%JOANNE GRACE SCHOOL OF DA

我在
Mysqli+PHP
搜索功能中遇到问题。 我有一些记录有
performerName
=
JOANNE GRACE舞蹈学校A
有些记录有
JOANNE GRACE舞蹈学校
,有些记录只有
JOANNE GRACE

如果我用查询搜索,我想要什么

$query = "JOANNE GRACE SCHOOL OF DANCE A";

SELECT * FROM `sections` WHERE `performerName` LIKE '%JOANNE GRACE SCHOOL OF DANCE A%'
我想从查询
JOANNE GRACE
JOANNE GRACE SCHOOL
但是这个查询给出了所有具有完整名称的对象
JOANNE GRACE舞蹈学校A

我在Mysql中尝试了很多方法。它搜索我上面给出的整个查询。 但我希望它应该匹配所有记录,即使有些记录有来自该查询的2个单词或来自该查询的3个单词


我尝试了
REGEX
像%%
但没有成功。它匹配完整的查询。有什么解决方法吗?我已经用PDO解决了这个问题。我更改了变量值,它给出了3行。请试试这个

<?php

//Here this is a connect database

$host_name = "localhost";
$db_name = "stackoverflow";
$user_name = "root";
$password = "";

$conn = new PDO("mysql:host=$host_name; dbname=$db_name", $user_name, $password);

$name = 'JOANNE GRACE%'; //Search this name
$sql = "SELECT * FROM search_name WHERE name LIKE ?";
$select = $conn->prepare($sql);
$select->execute([$name]);

$row = $select->rowCount();

echo "The row is : ".$row;

我不确定是否有一个好的解决方案可以让您的查询采用以下格式:

SELECT * FROM `sections` WHERE `performerName` LIKE ?
但是,使用
LIKE
匹配
$performerName
字符串中的任何单词是一项相当简单的任务

mysqli

$performerName = "JOANNE GRACE SCHOOL OF DANCE A";                     // Input

$search_string = preg_replace("/(\w+)/i", "%$1%", $performerName);    // Surround each word with "%" ready for the LIKE clause
$search_array  = explode(" ", $search_string);                        // Split input into array of search terms

$option_type = str_repeat("s", count($search_array));                 // Count how many search terms there are and output the value types for mysqli->bind_param
$option_list = implode(" OR ", array_fill(0, count($search_array), "( performerName LIKE ?)"));    // Convert the array to a string for the SQL

// $option_type == "ssssss";
// $option_list == "SELECT field_1, field_2, field_3 FROM sections WHERE ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? )";

$sql   = "SELECT field_1, field_2, field_3 FROM sections WHERE {$option_list}";    // SQL statement merging with $option_list
$query = $mysqli->prepare($sql);                    // Prepare the query
$query->bind_param($var_type, ...$search_array);    // Bind parameters to query
$query->execute();                                  // Execute the query
$query->store_result();                             // Catch the result
$query->bind_result($field1, $field2, $field3);     // Bind the columns to variables

while($query->fetch()){
     // Do something with each row of returned data...

     echo "Name: {$field1}<br>";    // Example, echo name of performer (field_1)
}

是静态查询还是动态查询根据查询更改搜索参数?您是否尝试过使用or关键字?e、 g.其中字段如“ex1”或字段如“ex2”。或者使用IN()。@PadraigD它是动态查询。更改搜索参数Dear I want the Query Same length$Query=“JOANNE GRACE SCHOOL OF DANCE A”;我知道如果我少了乔安妮·格雷斯,它会找到我想要的。但我的动态查询不是changeable@Dharman也许在本例中,使用
PDO
更容易。然而,一般来说,我认为PDO并不是比mysqli更容易;更重要的是,这只是一种不同的方法。使用
mysqli
更容易的一个例子是,如果我们试图对数据库验证整数。要使用
PDO
执行此操作,您需要为每个整数添加一行新代码?其中,与
mysqli
一样,它仍然是您习惯使用的同一行。。。两者都有各自的位置,因此我也添加了一些PDO示例!干杯
$performerName = "JOANNE GRACE SCHOOL OF DANCE";

$search_string = preg_replace("/(\w+)/i", "%$1%", $performerName);
$search_array  = explode(" ", $search_string);

$option_list = implode(" OR ", array_fill(0, count($search_array), "( name LIKE ? )"));

// $option_list == "SELECT field_1, field_2, field_3 FROM sections WHERE ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? )";

$sql   = "SELECT field_1, field_2, field_3 FROM sections WHERE {$option_list}";    // SQL statement merging with $option_list
$query = $pdo->prepare($sql);
$query->execute($search_array);
$query->bindColumn('name', $name);

while($query->fetch()){
     // Do something with each row of returned data...

     echo "Name: {$field1}<br>";    // Example, echo name of performer (field_1)
}
$performerName = "JOANNE GRACE SCHOOL OF DANCE";

$search_string = preg_replace("/(\w+)/i", "%$1%", $performerName);
$search_array  = explode(" ", $search_string);

$option_list = implode(" OR ", array_fill(0, count($search_array), "( name LIKE ? )"));

// $option_list == "SELECT field_1, field_2, field_3 FROM sections WHERE ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? ) OR ( performerName LIKE ? )";

$sql   = "SELECT field_1, field_2, field_3 FROM sections WHERE {$option_list}";    // SQL statement merging with $option_list
$query = $pdo->prepare($sql);
$query->execute($search_array);

while($record = $query->fetchObject()){
     // Do something with each row of returned data...

     echo "Name: {$record->field_1}<br>";    // Example, echo name of performer (field_1)
}
Search String        Matches

%the%                "the", " the ", "other", "clothes"
%app%                "app", "apple", "schnapps"