如何通过匹配存储在表列中的字符串中的单个单词来查找数据库中的数据

how to find data from database by matching single word in a string stored in table's column

提问人:Timothy 提问时间:10/25/2022 最后编辑:user3783243Timothy 更新时间:10/26/2022 访问量:453

问:

这是从表中查找地址的查询,其中它与变量 ,$fromCity

$fromCity= "324 West Gore Street, Orlando, FL 32806, USA";
$sql = "SELECT * FROM vendor_info WHERE mailing_address LIKE '$fromCity'";
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$company = $stmt->fetchAll();
dd($company);

在表中,列如下所示vendor_infomailing address324 WEST GORE STREETORLANDO, FL 32806

如果任何一个单词与列匹配,我想得到结果mailing_address

现在的结果是空数组,dd(company);

请帮我找出这个解决方案,它是在symfony中,

php mysql symfony 搜索 类SQL

评论

3赞 Lessmore 10/25/2022
在何处尝试'%$fromCity%'
0赞 Uwe 10/25/2022
您可以将 City 字符串分解为单个单词数组。然后用它来查询所有单词。(使用不同的 和 组合)但要小心,您当前的字符串包含,因此您将获得美国的所有公司。- 在你分解原始字符串之前,也许可以替换逗号。likeorUSA
0赞 Akina 10/25/2022
不要使用 LIKE,而是使用 INSTR/LOCATE。
0赞 user3783243 10/25/2022
您错误地使用了预准备语句。值不会进入查询,请绑定它们。
0赞 user3783243 10/25/2022
你确定吗?我认为该术语将与大多数记录相匹配。if any single word is matchstreet

答:

1赞 mscdeveloper 10/26/2022 #1

也许是这样的:

   $fromCity = "324 West Gore Street, Orlando, FL 32806";
   $fromCity_arr = explode(', ', $fromCity);
   $whereStr = '';
   foreach($fromCity_arr as $fromCity_el){
     if(!empty($whereStr)){$whereStr .= " AND ";}
     $whereStr .= "mailing_address LIKE '%".$fromCity_el."%'";
   }
   $sql = "SELECT * FROM vendor_info WHERE $whereStr";
   ......

结果:

SELECT 
 * 
FROM 
  vendor_info 
WHERE 
  mailing_address LIKE '%324 West Gore Street%' 
 AND 
  mailing_address LIKE '%Orlando%' 
 AND 
  mailing_address LIKE '%FL 32806%' 

评论

0赞 Rufinus 10/26/2022
$fromCity = "%';--"
0赞 Rufinus 10/26/2022 #2

@mscdeveloper 的答案基本上是正确的 - 但是当您使用 doctrine 时,您还应该使用准备好的语句来避免 SQL 注入。

$fromCity = "324 West Gore Street, Orlando, FL 32806";
$fromCity_arr = explode(', ', $fromCity);
$stm = $this->getEntityManager()->getRepository(MyModel::class)->getQueryBuilder('a');
for($i=0;$i<count($fromCity_arr);$i++) {
    $stm->andWhere('a.mailing_address like ?)
        ->setParameter($i+1, '%'.$fromCity_arr[$i].'%'); 
}

$result = $stm->getQuery()->getResult();
dump($stm->getQuery()->getSql());
dd($result);