I do a full-text search on the MySQL βtableβ pages. I show a list of pages matching the keyword in their "heading" (plain text, VARCHAR, 255) or "content" (html, TEXT). When a match is found in the "content" field, I would like to display the fragment in which the match was found. I have no idea how to do this.
Can you put me in the right direction?
$query = ' SELECT *, MATCH(title, content) AGAINST("'.$keyword.'") AS score FROM page WHERE MATCH(title, content) AGAINST("'.$keyword.'") ORDER BY score DESC '; $result = mysql_query($query) or die (mysql_error()); if(mysql_num_rows($result) > 0) { $output .= '<p>Your keyword matches the following pages:</p>'; while($row = mysql_fetch_assoc($result)){ $title = htmlentities($row['title']); $content = htmlentities(strip_tags($row['content'])); $content = limit_text($content, 250); // Cuts it down to 250 characters plus ... $output .= '<h2>'.$title.'</h2>'; if(trim($content) != '') { $output .= '<p>'.$content.'</p>'; // I'd like to place a snippet here with the matched context } } } else { $output .= '<p>Keyword not found...</p>'; }
In addition, I have a security question. Right now I am checking $keyword three ways:
- Not empty?
- More than 2 characters?
- Not dangerous? (see below).
I use regex to match the following to see if user login is dangerous
<script|<script|>script|document.|alert|bcc:|cc:|x-mailer:|to:|recipient|truncate|drop table
It may be a little ridiculous and easy to work with, but it is at least a minimal form of protection against XSS exploits. What is the recommended filter protection method for a search keyword? Is PHPIDS overkill?
security mysql search full-text-search
maartenmachiels
source share