MYSQLi Select-PHP对行中出现的每个查询项进行回显
我有一个名为pages的表,它存储我网站上网页的id、url地址、标题和内容。下面是该表的一个示例:MYSQLi Select-PHP对行中出现的每个查询项进行回显,php,select,mysqli,Php,Select,Mysqli,我有一个名为pages的表,它存储我网站上网页的id、url地址、标题和内容。下面是该表的一个示例: ID | address | title | content | ------------------------------------------------------------------------------------ 1 | www.example.com/page1 |
ID | address | title | content |
------------------------------------------------------------------------------------
1 | www.example.com/page1 | Page 1 | The quick dog jumps over the lazy dog. |
2 | www.example.com/page2 | Page 2 | The best thing about morning is breakfast. |
3 | www.example.com/page3 | Page 3 | Hotdogs are great ballpark food. |
我想选择一个查询词的所有出现,并在PHP中回显它们。例如,如果我想显示单词dog的搜索结果,我的SELECT语句如下所示:
SELECT * FROM pages WHERE (`content` LIKE '%dog%')
if ($result = $mysqli->query("SELECT * FROM pages WHERE (`content` LIKE '%".$query."%')")) {
// if one or more rows are returned do following
while($results = $result->fetch_array(MYSQLI_ASSOC)){
// $results = mysql_fetch_array($raw_results) puts data from database into array, while it's valid it does the loop
$content = $results['content'];
$contentItems = $results['contentSearch'];
// Count number of times term in content
$count = substr_count($contentItems, $originalQuery);
$content = substr($content,strpos($content,$firstTerm)-25,160);
$content = (strlen($content) > 55 ? '...'.$content.'...' : substr($results['description'],0,160).'...');
foreach($querySplit as $term){
$content = str_ireplace($term, '<strong>'.$term.'</strong>', $content);
}
// highlight search terms
$chars = array("\'", "&");
$charReplace = array("'", "&");
$content = str_replace($chars,$charReplace,$content);
// set $image if not empty
$image = (!empty($results['image']) ? 'http://www.example.com/'.$results['image'] : '');
/* ------------------
------ echo statement
--------------------*/
echo '
<li class="media">';
// if image is not empty
if(!empty($image)):
echo '<a class="pull-left span2 hidden-phone" href="http://www.example.com/'.$results['address'].'"> <img class="media-object thumbnail" src="'.$image.'" alt="'.$results['description'].'"/> </a>';
endif;
echo '
<div class="media-body">
<h4 class="media-heading"><a href="http://www.example.com/'.$results['address'].'">'.htmlspecialchars_decode($results['title']).'</a></h4>
<p class="result-address"><small><a href="http://www.example.com/'.$results['address'].'">http://www.example.com/'.$results['address'].'</a></small></p>
';
/*if(!empty($image)):
echo '<a class="visible-phone" href="'.$results['address'].'"> <img class="thumbnail phone-search-thumb" src="'.$image.'" alt="'.$results['description'].'"/> </a>';
endif;*/
echo '
<p class="result-content">'.$content.'</p>
</div>
</li>
';
/* ------------------
---end echo statement
--------------------*/
} $result->close();
}
我的完整PHP语句(搜索词=$query)如下所示:
SELECT * FROM pages WHERE (`content` LIKE '%dog%')
if ($result = $mysqli->query("SELECT * FROM pages WHERE (`content` LIKE '%".$query."%')")) {
// if one or more rows are returned do following
while($results = $result->fetch_array(MYSQLI_ASSOC)){
// $results = mysql_fetch_array($raw_results) puts data from database into array, while it's valid it does the loop
$content = $results['content'];
$contentItems = $results['contentSearch'];
// Count number of times term in content
$count = substr_count($contentItems, $originalQuery);
$content = substr($content,strpos($content,$firstTerm)-25,160);
$content = (strlen($content) > 55 ? '...'.$content.'...' : substr($results['description'],0,160).'...');
foreach($querySplit as $term){
$content = str_ireplace($term, '<strong>'.$term.'</strong>', $content);
}
// highlight search terms
$chars = array("\'", "&");
$charReplace = array("'", "&");
$content = str_replace($chars,$charReplace,$content);
// set $image if not empty
$image = (!empty($results['image']) ? 'http://www.example.com/'.$results['image'] : '');
/* ------------------
------ echo statement
--------------------*/
echo '
<li class="media">';
// if image is not empty
if(!empty($image)):
echo '<a class="pull-left span2 hidden-phone" href="http://www.example.com/'.$results['address'].'"> <img class="media-object thumbnail" src="'.$image.'" alt="'.$results['description'].'"/> </a>';
endif;
echo '
<div class="media-body">
<h4 class="media-heading"><a href="http://www.example.com/'.$results['address'].'">'.htmlspecialchars_decode($results['title']).'</a></h4>
<p class="result-address"><small><a href="http://www.example.com/'.$results['address'].'">http://www.example.com/'.$results['address'].'</a></small></p>
';
/*if(!empty($image)):
echo '<a class="visible-phone" href="'.$results['address'].'"> <img class="thumbnail phone-search-thumb" src="'.$image.'" alt="'.$results['description'].'"/> </a>';
endif;*/
echo '
<p class="result-content">'.$content.'</p>
</div>
</li>
';
/* ------------------
---end echo statement
--------------------*/
} $result->close();
}
此PHP和SELECT语句返回两个结果:
那只快狗跳过了。。。
热狗很棒。。。
想要的结果请帮忙
我更喜欢的是,我的语句对$query术语的每次出现都回显一个结果,即使是在同一行中,如下所示:
那只快狗跳过了。。。从第1行开始
…为了那只懒狗。从第1行开始
热狗很棒。。。从第3排开始
问题:
我如何编辑我的PHP和/或SELECT语句,以便每次出现$query术语时都能回显一个结果?正如Yogesh Suthar所说:使用PHP 这里有一个又快又脏的例子
$count = substr_count($content, 'dog');
$offset = 0;
for( $i = 0 ; $i < $count ; $i++ ) {
echo $content; // put you code here with strpos($content,$query,$offset)
$offset = strpos($content, 'dog', $offset) + strlen('dog');
}
这是你的答案
<?php
$query="dog";
if ($result = $mysqli->query("SELECT * FROM pages WHERE (`content` LIKE '%".$query."%')"))
{
$inc = 0;
$mysql_result = array();
// if one or more rows are returned do following
while($a_result = $result->fetch_array(MYSQLI_ASSOC))
{
$mysql_result[$inc]=$a_result;
$inc++;
}
$chars_to_show_before = 10; // ...1234567890dog
$chars_to_show_after = 10; // dog1234567890...
foreach($mysql_result as $results)
{
$content = str_replace($query,"my_un1qu3_r3pl4c3m3nt_".$query,$results['content']);
$occurences = explode("my_un1qu3_r3pl4c3m3nt_",$content);
$position_in_original_content = 0;
foreach($occurences as $an_occurence)
{
if (strpos($an_occurence,$query) !== false)
{
$content=$an_occurence;
echo '<li class="media">
<a class="pull-left" href="'.$results['address'].'">
<img class="media-object thumbnail" src="'.$results['image'].'" style="height:100px !important">
</a>
<div class="media-body">
<h4 class="media-heading"><a href="'.$results['address'].'">'.$results['title'].'</a></h4>
<p>...'.str_replace($query,'<strong>'.$query.'</strong>', substr($results['content'],max(0,($position_in_original_content-$chars_to_show_before)),strlen(strlen($query))+$chars_to_show_after+$chars_to_show_before)).'...</p>
</div>
</li>';
}
$position_in_original_content = $position_in_original_content + strlen($an_occurence);
}
}
}
else
{
echo "Sorry, no results found!";
}
?>
这里的工作演示:用PHP解析数据库中的内容,看看那个句子中有多少只狗。@Yogeshuthar-你能解释一下你的意思吗?我不确定我是否理解。请注意,在使用用户输入查询数据库时,您应该使用准备好的语句。此外,您正在混合OOP和程序风格的mysqli。这仅仅出现在您的示例中,还是在您的代码中?@newfurniture-我正在清理用户输入,然后再将其发送到数据库。为了简单起见,您不应该清除任何内容,而应该使用prepared语句。对于number=$count,这只是一遍遍地显示相同的结果,并反复突出显示。我需要移动到for each中出现的下一个术语。您可以使用中的第3个参数搜索字符串中的下一个“dog”。请参见示例-我添加$offset。在代码的strpos中使用$offset作为第三个参数。使用上面更新的代码,$offset实际上没有做任何事情,是吗?代码中有strpos$content,$query。它搜索第一只狗,总是从$content开始。使用strpos中的第3个参数进行更改-使用strpos$content、$query、$offset。并使用我的$offset=。。。计算新的偏移量。如果我误解了这一点,请原谅,但是如何使用现有的mysqli查询初始化结果,使结果为$mysql_result[0]['address']=www.example.com/page1@AdamD see更新的答案没有测试过,但应该可以:它在一定程度上与我的代码一起工作,但是如果用户有一个复合词,比如dog park,它不会返回任何结果。我在玩它…@AdamD确保DB在那个时候返回结果。做一个回声;在while{…}之后,查看是否确实从数据库中获取数据