2014-05-14 2 views
2

이것은 검색 엔진입니다. & "검색"에있는 단어에 따라 하나의 필터가있는 페이지 매김입니다. 두 개의 검색 필터를 추가하고자합니다 : 역할 & 두 날짜 사이에서 검색하십시오.PHP에서 검색 필터를 추가

<?php 

$button = $_GET ['submit']; 
$search = $_GET ['search']; 

echo "You searched for <b>$search</b> <hr size='1'></br>"; 
mysql_connect("localhost","root",""); 
mysql_select_db("page"); 

$search_exploded = explode (" ", $search); 

foreach($search_exploded as $search_each) 
{$x=0; 
$construct=""; 
$x++; 
if($x==1) 
$construct .="name LIKE '%$search_each%'"; 

} 

$constructs ="SELECT * FROM info WHERE $construct"; 
$run = mysql_query($constructs); 

$foundnum = mysql_num_rows($run); 

if ($foundnum==0) 
echo "Sorry"; 
else 
{ 

echo "$foundnum results found !<p>"; 
$per_page = 1; 
$start = $_GET['start']; 
$max_pages = ceil($foundnum/$per_page); 
if(!$start) 
$start=0; 
$getquery = mysql_query("SELECT * FROM info WHERE $construct LIMIT $start, $per_page"); 

while($runrows = mysql_fetch_assoc($getquery)) 
{ 
$name = $runrows ['name']; 
} 

//Pagination Starts 
echo "<center>"; 

$prev = $start - $per_page; 
$next = $start + $per_page; 

$adjacents = 3; 
$last = $max_pages - 1; 

if($max_pages > 1) 
{ 
//previous button 
if (!($start<=0)) 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$prev'>Prev</a> ";  

//pages 
if ($max_pages < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up 
{ 
$i = 0; 
for ($counter = 1; $counter <= $max_pages; $counter++) 
{ 
if ($i == $start){ 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$i'><b>$counter</b></a> "; 
} 
else { 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$i'>$counter</a> "; 
} 
$i = $i + $per_page;     
} 
} 
elseif($max_pages > 5 + ($adjacents * 2)) //enough pages to hide some 
{ 
//close to beginning; only hide later pages 
if(($start/$per_page) < 1 + ($adjacents * 2))   
{ 
$i = 0; 
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) 
{ 
if ($i == $start){ 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$i'><b>$counter</b></a> "; 
} 
else { 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$i'>$counter</a> "; 
} 
$i = $i + $per_page;          
} 

} 
//in middle; hide some front and some back 
elseif($max_pages - ($adjacents * 2) > ($start/$per_page) && ($start/$per_page) > ($adjacents * 2)) 
{ 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=0'>1</a> "; 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$per_page'>2</a> .... "; 

$i = $start;     
for ($counter = ($start/$per_page)+1; $counter < ($start/$per_page) + $adjacents + 2; $counter++) 
{ 
if ($i == $start){ 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$i'><b>$counter</b></a> "; 
} 
else { 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$i'>$counter</a> "; 
} 
$i = $i + $per_page;     
} 

} 
//close to end; only hide early pages 
else 
{ 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=0'>1</a> "; 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$per_page'>2</a> .... "; 

$i = $start;     
for ($counter = ($start/$per_page) + 1; $counter <= $max_pages; $counter++) 
{ 
if ($i == $start){ 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$i'><b>$counter</b></a> "; 
} 
else { 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$i'>$counter</a> "; 
} 
$i = $i + $per_page;    
} 
} 
} 

//next button 
if (!($start >=$foundnum-$per_page)) 
echo " <a href='index.php?search=$search&submit=Search+source+code&start=$next'>Next</a> ";  
} 
echo "</center>"; 
} 
?> 
+0

은 역할 (숫자) 또는 문자열입니까? 역할을 입력하거나 드롭 다운 상자를 사용해야합니까? 역할에'LIKE'을 사용 하시겠습니까? 시작일 만 써 주시겠습니까? 종료일 만 입력 할 수 있습니까? –

+0

예, 롤은 하나의 단어와 그 드롭 다운 상자를 말합니다. 두 날짜 사이에 원하는대로 한 번에 하나씩 모두 수행 할 수 있지만 한 번의 검색으로 모두 확인하는 방법을 모릅니다. – rose

+1

코드가 취약합니다. SQL 인젝션에 이르기까지. [PHP로 방지하는 방법] (http://stackoverflow.com/q/60174/53114)을 읽어야합니다. – Gumbo

답변

1

당신은 그렇지 않으면 당신이 지속적으로 (어쨌든 필요가 없습니다) $x의 가치와 $construct을 재설정이

//by name 
$construct="true"; 
foreach($search_exploded as $search_each) { 
    $construct .= " AND name LIKE '%$search_each%'"; 
} 
//by role 
if($role) { 
    $construct .= " AND role = '$role'"; 
} 
//by date 
if($start) { 
    $construct .= " AND the_date >= '$start'"; 
} 
if($end) { 
    $construct .= " AND the_date <= '$end'"; 
} 

처럼 루프를 다시 작성해야합니다.

물론 GET의 날짜/역할을 적절하게 형식화해야합니다.

+0

고마워요, 그 것이 쉬웠습니다 : D – rose