如何找到与字符串匹配的数据库行?

时间:2018-10-21 05:45:16

标签: php mysql

我有一个包含10万行和100个项目的数组的数据库表。而且我需要查找是否在我的Users表用户名行中找到了数组项。

我的数据库表Users

| id | username | fullname |
  1      John    John Smith
  2      Elliot  Jim Elliot
  3      Max     Max Richard

我的数组看起来像这样

[
   {
      string: 'Hello, this is Elliot from downtown Las Vegas!'
   },

   {
      string: 'Hey how are you?'
   }
]

我的想法是对我的Users表(100k条记录)中的每一行进行一次foreach循环,以查找它是否与我的数组匹配,但这太慢了。

foreach ($MyArray as $Array) {
    foreach ($dbrows as $dbrow) {
        if (strpos($Array['string'], $dbrow['username']) !== false) {
            echo 'found it!';

            break;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

我认为更好的方法是将搜索数组分成单词,然后在查询中使用它,例如:

<?php
// Assuming your search array is $search...
$words = array ();
foreach ( $search as $text)
{
  $words = array_merge ( $words, explode ( " ", trim ( preg_replace ( "/[^0-9a-z]+/i", " ", $text))));
}
$words = array_unique ( $words);
$in = "";
foreach ( $words as $text)
{
  $in .= ",'" . $mysqli->real_escape_string ( $text) . "'";
}
if ( ! $result = $mysqli->query ( "SELECT * FROM `Users` WHERE `username` IN (" . substr ( $in, 1) . ")"))
{
  echo "MySQL error!";
}
// Results at $result
?>

答案 1 :(得分:0)

这将是一个偶然的机会,因为您可能会发现用户拥有与正常单词匹配的各种奇怪名称,这种方法将输入分为单词,然后使用它们形成in子句来搜索数据库。因此,它只会查看匹配的记录,而不是所有记录...

$search = 'Hello, this is Elliot from downtown Las a1 Vegas!';
$words = str_word_count($search, 1);
$bind  = str_repeat("?,", count($words));
$bind  = trim($bind, ",");

$query = $conn->prepare("select * from users where username in ($bind)" );
$types = str_repeat("s", count($words));
$query->bind_param($types, ...$words);
$query->execute();
$res = $query->get_result();
while($row = $res->fetch_assoc())   {
    // Process result
}

它也使用准备好的语句,这是所有$bind$types处理的地方。如果查看$query,您将看到它是如何构建的。

答案 2 :(得分:0)

您可以使用正则表达式:

<?php

    $query_string = "bla bla bla...";

    $qry = $mysqli_query($conn, "SELECT *FROM table WHERE username REGEXP '$query_string'");

?>

正则表达式分别匹配表中的数据。