Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查MySQL字符串是否与数据库中的部分匹配?_Php_Mysql - Fatal编程技术网

Php 如何检查MySQL字符串是否与数据库中的部分匹配?

Php 如何检查MySQL字符串是否与数据库中的部分匹配?,php,mysql,Php,Mysql,我想做一种黑名单,所以我存储在我的数据库 id|value ----------- 1|test.com 2|example@ 3|@another. ... 现在,我正在寻找一种最快的方法来检查给定的字符串(例如emailAddress)是否与数据库中的一部分值匹配 例如 my@mail.com->数据库中无结果->无垃圾邮件 example@mail.com->与ID2->垃圾邮件匹配 有没有办法做到这一点,内幕人士,MySQL声明 目前我只看到加载数组中所有值的方法,但这种方法需要大量

我想做一种黑名单,所以我存储在我的数据库

id|value
-----------
1|test.com
2|example@
3|@another.
...
现在,我正在寻找一种最快的方法来检查给定的字符串(例如emailAddress)是否与数据库中的一部分值匹配

例如 my@mail.com->数据库中无结果->无垃圾邮件 example@mail.com->与ID2->垃圾邮件匹配

有没有办法做到这一点,内幕人士,MySQL声明

目前我只看到加载数组中所有值的方法,但这种方法需要大量资源,而且速度非常慢

非常感谢。

使用如下查询:

SELECT * FROM `table_name` WHERE `value` LIKE '%emailadress%';

可以只在MySQL中完成处理
请注意,这将不会在较大的表上缩放,因为不能使用索引,所以请记住这一点

查询

SELECT 
 *
FROM  (
  SELECT 
   'test' COLLATE 'utf8mb4_general_ci' AS word 

  UNION ALL

  SELECT  
  'example' COLLATE 'utf8mb4_general_ci' AS word

  # When you need more words
  # UNION AL   
  # SELECT 'another' COLLATE 'utf8mb4_general_ci' AS word
  #

) AS check_list
INNER JOIN
 blacklist
ON
 blacklist.`value` LIKE CONCAT('%', check_list.word ,'%')


# note COLLATE 'utf8mb4_general_ci' might not even be needed to the used server 
# because it's depending on server config and used table charsets/collates
SELECT 
 *
FROM
 blacklist
WHERE
  MATCH (blacklist.`value`)
    AGAINST (
      (
        'test example'
      )
    IN BOOLEAN MODE
  )
结果

| word    | id  | value    |
| ------- | --- | -------- |
| test    | 1   | test.com |
| example | 2   | example@ |

或者,对于在更大的表上扩展的更优化版本,您必须使用全文索引和
MATCH()

查询

SELECT 
 *
FROM  (
  SELECT 
   'test' COLLATE 'utf8mb4_general_ci' AS word 

  UNION ALL

  SELECT  
  'example' COLLATE 'utf8mb4_general_ci' AS word

  # When you need more words
  # UNION AL   
  # SELECT 'another' COLLATE 'utf8mb4_general_ci' AS word
  #

) AS check_list
INNER JOIN
 blacklist
ON
 blacklist.`value` LIKE CONCAT('%', check_list.word ,'%')


# note COLLATE 'utf8mb4_general_ci' might not even be needed to the used server 
# because it's depending on server config and used table charsets/collates
SELECT 
 *
FROM
 blacklist
WHERE
  MATCH (blacklist.`value`)
    AGAINST (
      (
        'test example'
      )
    IN BOOLEAN MODE
  )

请参见使用
LOCATE()
检查字符串是否位于作为字符串提供的给定电子邮件地址中,这不是很简单吗

SELECT
    COUNT(*)
FROM
    blacklist
WHERE
    LOCATE(value, 'my@mail.com');
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+


SELECT
    COUNT(*)
FROM
    blacklist
WHERE
    LOCATE(value, 'example@mail.com');   
+----------+
| COUNT(*) |
+----------+
|        1 |
+----------+

请参阅。

查看@Nick
,就像检查某个值与另一个值一样。你有什么建议-从db中选择所有项目,并在每个项目上使用
like
?我只想在至少有一个匹配项的情况下获取信息,这足以知道它是spamI。我想这会导致该
WHERE
子句上的
子句的列表不断增加。如果在每个页面请求上都执行此查询,那么最终可能值得在内存中缓存黑名单表并执行签入代码,不时刷新缓存。@u\u mulder这是一个黑名单,因此他必须检查每个值。。。或者我没有领会你的意思?这是错误的-你需要另一种方法:
哪里是正确的my@email.address“像concat(“%”,value,“%”)
@PrakashG这不是它应该采取的方式-我必须检查电子邮件是否匹配(也是电子邮件的一部分)-如果我按照你的方式做,test@test.com威尔·伊格诺尔。@StefB,我给你的只是一个暗示,这里的任何人都不应该给你在你的上下文中所要求的直接答案,这需要按照要求来塑造。我相信LIKE在这种情况下会对您有所帮助。如果可能的话,这就是我需要从表_name中选择*的地方,比如“%emailAddress%”;在里面VALUE@StefB试试我的评论