2013-06-01 133 views
0

我想确定一个字是否存在于一个文本字符串中,然后如果该字存在,则打印相关的字符串。我遇到了问题,因为此代码似乎适用于我的一些用户,但不是全部。我是否正确使用strpos?

$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>"; 
    } 
} 
+0

手册strpos这里 - > http://php.net/manual/en/function.strpos.php – BeNdErR

+0

刘易斯,得到了一个答案了吗?也许在评论栏中留下反馈意见。如果您正在投票,请在评论栏中说明原因。 –

回答

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) 
-1

strpos()返回一个布尔值FALSE如果针没有找到;以及如果找到它的字符串中的偏移量的整数值。该偏移量可以是0,相当于松散比较中的布尔FALSE。

使用

if(strpos($haveact, $username) !== FALSE) 
-1

strpos有possibilty返回0和FALSE这基本上是相同的 “价值”

你需要检查类型和值像

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

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>"; 
} 

?> 
-1

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

if (strpos($haveact, $username) !== false) { 
    // In string. 
} 
+0

有人在downvote按钮上去了火箭筒:D –

-1

作为替代你可以试试PHP的的preg_match功能:

if (preg_match("/{$to_search}/" , $subject)) { 
    // your code to process 
} 
+0

但是你应该注意,当你知道你在找什么(当你不需要正则表达式的附加功能时),strpos会更快。 – Arjan

0

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

查看关于LIKE,SELECT和REGEX的MySQL帮助文件。

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