我有一个包含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;
}
}
}
答案 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'");
?>
正则表达式分别匹配表中的数据。