2017-05-10 60 views
0

就像我的标题说的,我想在搜索栏中搜索1个或多个词。我希望能够搜索(整个搜索,第一个词,第二个词或第三个词)。我做到这一点我可以做到这一点,如果$ searchArray [0],$ searchArray [1]和$ searchArray [2]被定义。问题是我不能搜索超过3个字。这里是我的代码:我想在搜索栏中搜索多个词

if(isset($_GET['search']) AND !empty($_GET['search']) AND $_GET['search'] != ' '){ 
$search = htmlspecialchars($_GET['search']); 
$searchArray = explode(' ',$search); 
var_dump($searchArray); 

$totalVideosReq = $stdb->query('SELECT id FROM videos WHERE title LIKE "%'.$search.'%" OR title LIKE "%'.$searchArray[0].'%" OR title LIKE "%'.$searchArray[1].'%"'); 
$totalVideos = $totalVideosReq->rowcount(); 
$totalPages = ceil($totalVideos/$videosPerPage); 
$videos = $stdb->query('SELECT id, title, videoTime FROM videos WHERE title LIKE "%'.$search.'%" OR title LIKE "%'.$searchArray[0].'%" OR title LIKE "%'.$searchArray[1].'%" ORDER BY id DESC limit '.$start.','.$videosPerPage); 



$currentPage = 1; 
if(isset($_GET['page']) AND !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $totalPages){ 
$_GET['page'] = intval($_GET['page']); 
$currentPage = $_GET['page']; 
}else{ 
    $currentPage = 1; 
}} 

,如果你们知道我可以使它甚至通过搜索3个字的组合:第一,将是巨大的更好。先谢谢你 !

+0

构建查询动态,还可以使用参数化查询,这是开放的SQL注入。 (htmlspecialchars可能阻碍XSS注入,它对SQL注入没有影响)。 – chris85

+0

我想我想通了!你需要使用:mysql_real_escape_string,但你是否也需要htmlspecialchar? –

+0

你正在使用'mysql_ *'吗?参数化查询是保护SQL注入安全的最佳方法。变量不在查询中,您让驱动程序转义并引用它们。 – chris85

回答

0

这可能做的伎俩

$query = 'SELECT id FROM videos WHERE title LIKE "%'.$search.'%"' 
foreach ($searchArray as $s) { 
    $query .= ' OR title LIKE "%'.$s.'%"'; 
} 
$totalVideosReq = $stdb->query($query); 
0

您可以使用implode()动态生成的查询,而不是硬编码的。

$totalVideosReq = $stdb->query('SELECT id FROM videos WHERE title LIKE "%'.$search.'%" OR title LIKE "%'.implode("\" OR title LIKE \"%", $searchArray).'%"'); 

这是很容易受到SQL注入的方式,你需要防止这种情况。

+0

非常感谢您的回答!你知道我怎么可以从SQL注入安全我的代码? –

+0

准备好的陈述和消毒用户输入,在互联网上的许多指南(甚至在SO上)。 – Enstage

0

请尝试下面的代码,

if(count($searchArray) > 0) { 
    $query = 'SELECT id FROM videos WHERE '; 
    $cond = array(); 
    foreach ($searchArray as $s) { 
     $cond[] = ' title LIKE "%'.$s.'%"'; 
    } 
    $cond = implode(' OR ', $cond); 

    //this is your query to get total videos 
    $totalVideosReq = $stdb->query($query.$cond); 

    //this is your query to fetch videos 
    $videos = $stdb->query($query.$cond.' ORDER BY id DESC limit '.$start.','.$videosPerPage); 
}