0

我正在尝试确定一个单词是否存在于一个文本字符串中,然后如果该单词存在,则打印相关的字符串。我遇到了问题,因为这段代码似乎适用于我的一些用户,但不是所有用户。

$active = $db->query("SELECT * FROM activity ORDER BY aTIME DESC LIMIT 15");

while($activity = $db->fetch_row($active))
{
    $haveact = $activity['activity'];
    $username = $r['username'];
    if(strpos($haveact, $username))
    {
        print " <div class='activitydiv'>   
                {$activity['activity']} &nbsp&nbsp&nbsp&nbsp<small><font color='grey'>
                {$activity['aTIME']}</font></small>
                </div>";
    }
}
4

7 回答 7

2

除了其他答案中的建议外,我将重写整个代码以在查询中执行字符串搜索。例如像这样:

<?php

$active = $db->query("SELECT * FROM (SELECT * FROM activity 
                      ORDER BY aTIME DESC LIMIT 15)
                      WHERE activity LIKE \"%" . $db->escape($r['username']) . "%\";");

while($activity=$db->fetch_row($active))
{
    print "<div class='activitydiv'>
               {$activity['activity']} &nbsp&nbsp&nbsp&nbsp<small><font color='grey'>
               {$activity['aTIME']}</font></small>
           </div>";
}

?>
于 2013-06-01T17:36:50.127 回答
1

请注意,它strpos返回找到的文本的位置。因此,例如,当您要搜索的单词位于字符串的开头时,该函数将返回“0”。鉴于 0 是一个假值,当你像以前一样使用函数时,即使找到了这个词,它也不会是真的。strpos的正确用法是:

if (strpos($haystack, $needle) !== false) // Note the type check. 
{ 
    // your code...
}

此外,此函数默认区分大小写。您可以stripos用于不区分大小写的搜索。

编辑

从手册:

This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE

检查以下示例以更好地理解:

strpos('the quick brown fox jumps over the lazy dog', 'the'); // Returns 0 (false value)
strpos('the quick brown fox jumps over the lazy dog', 'quick'); // Returns 4 (true value)
strpos('the quick brown fox jumps over the lazy dog', 'THE'); // Returns false (case sensitive)
于 2013-06-01T17:33:37.987 回答
0

就像 Hauke P. 提到的 - 不要用 PHP 做这个。你想用你的数据库过滤匹配的行。如果你因为需要更多的功率而不想使用WHERE row LIKE %foo%,你甚至可以REGEX在 MYSQL 中使用。只是不要用 PHP 处理数据。如果你这样做,那就是设计失败。

查看有关 LIKE、SELECT 和 REGEX 的 MySQL 帮助文件。

提示:http ://www.mysql.com/

于 2013-06-01T19:12:54.840 回答
-1

strpos()如果没有找到 needle,则返回布尔值 FALSE;如果找到,则为它在字符串中的偏移量的整数值。该偏移量可以为 0,这在松散比较中等同于 Boolean FALSE。

利用

if(strpos($haveact, $username) !== FALSE)
于 2013-06-01T17:33:52.840 回答
-1

strpos 有可能返回 0 和 FALSE,它们基本上是相同的“值”

您需要检查类型和值,例如

strpos($haveact,$username) !== FALSE

于 2013-06-01T17:34:06.087 回答
-1

另一种选择,我通常使用,因为它更短:)

if (strpos($haveact, $username) !== false) {
    // In string. 
}
于 2013-06-01T17:46:26.810 回答
-1

作为替代方案,您可以尝试 php 的 preg_match 函数:

if (preg_match("/{$to_search}/" , $subject)) {
  // your code to process
}
于 2013-06-01T18:02:55.397 回答