2011-09-27 8 views
0

저는 독학으로 초보 프로그래머입니다. 최근에 저는 PHP 스크립트를 사용하여 사용자가 입력 한 키워드로 데이터베이스를 쿼리했습니다. 제가 생각한 것보다 훨씬 더 복잡해 보입니다. 그래서 제가 쓴 것을 단순화 할 수있는 방법이 있는지 궁금합니다. 다른 질문이 있거나 더 많은 코드가 필요하면 알려주십시오. 고맙습니다! 당신의 WHERE 조건이 매우 다르기 때문에SQL 쿼리 용 PHP 스크립트 단순화

$types = array(); 
    if(!empty($_GET['location_id']) && isset($_GET['location_id'])) $types[] = "groups.location_id = " . str_replace(' ', '%', $_GET['location_id']) . " "; 
    if(!empty($_GET['season_id']) && isset($_GET['season_id'])) $types[] = "seasons.season_id = " . str_replace(' ', '%', $_GET['season_id']) . " "; 
    if(!empty($_GET['event']) && isset($_GET['event'])) $types[] = "(`event` LIKE '%" . str_replace(' ', '%', $_GET['event']) . "%' OR `note` LIKE '%" . str_replace(' ', '%', $_GET['event']) . "%') "; 
    if(!empty($_GET['place']) && isset($_GET['place'])) $types[] = "`place` LIKE '%" . str_replace(' ', '%', $_GET['place']) . "%' "; 
    if(!empty($_GET['city']) && isset($_GET['city'])) $types[] = "`city` LIKE '%" . str_replace(' ', '%', $_GET['city']) . "%' "; 
    if(!empty($_GET['state_abbr']) && isset($_GET['state_abbr'])) $types[] = "`state_abbr` LIKE '%" . str_replace(' ', '%', $_GET['state_abbr']) . "%' "; 
    if(!empty($_GET['weekday']) && isset($_GET['weekday'])) $types[] = "(`weekday` LIKE '%" . str_replace(' ', '%', $_GET['weekday']) . "%' OR `through_weekday` LIKE '%" . str_replace(' ', '%', $_GET['weekday']) . "%') "; 
    if(!empty($_GET['month']) && isset($_GET['month'])) $types[] = "`month` LIKE '%" . str_replace(' ', '%', $_GET['month']) . "%' "; 
    if(!empty($_GET['day']) && isset($_GET['day'])) $types[] = "(`day` LIKE '%" . str_replace(' ', '%', $_GET['day']) . "%' OR `through_day` LIKE '%" . str_replace(' ', '%', $_GET['day']) . "%') "; 
    if(!empty($_GET['year']) && isset($_GET['year'])) $types[] = "`year` LIKE '%" . str_replace(' ', '%', $_GET['year']) . "%' "; 

답변

2

코드의 줄 수를 줄일 수있는 방법이 없을 것이다 그러나 각 라인은 약간 짧아 질 수 있습니다. 또한 제출 된 변수를 mysql_real_escape_string()으로 전달하여 SQL injection 공격을 막으려합니다.

각 줄에 mysql_real_escapestr_replace를 통해 실행하지 않아도 당신은 루프에 모든 변수를 준비 할 수

:

foreach ($_GET as $key => $val) { 
    $_GET[$key] = mysql_real_escape_string(str_replace(' ', '%', $val)); 
} 

내가 isset() 호출 후 약간 중복 생각하면 '이 같은 것을 볼 수 있었다 각 라인 위의 루프를 실행했습니다 :

if (!empty($_GET['year'])) 
    $types[] = "`year` LIKE '%" . $_GET['year'] . "%' "; 
+0

나는 단지 비슷한 대답을 쓰고 있었다. 단지 차이점은'$ _GET'에 사용 된 키를 가진 배열을 설정하고 그것들만을 수정했다는 것이다. 아마도'$ _GET' 전체를 스캔하고 수정하기를 원하지 않을 것입니다. 왜냐하면 수정하고 싶지 않은 다른 값들이있을 수 있기 때문입니다. –

+0

@AaronW. 귀하의 코드가 어떻게 보이는지 보여 줄 수 있습니까? 고맙습니다! –

0

그냥 생각 .. 그것은 코드를 더 명확하고 아주 쉬운 작업을 쓰는 SQL 만들 수 있습니다.

테스트 목적으로이 코드를 넣어 :

$queryTmplArr=Array("(`@field` LIKE '%@value%' OR `note` LIKE '%@value%') ", 
"`@field` LIKE '%@value%' ","`@field` LIKE '%@value%' ","`@field` LIKE '%@value%' ", 
"(`@field` LIKE '%@value%' OR `through_weekday` LIKE '%@value%') ", 
"`@field` LIKE '%@value%' ","(`@field` LIKE '%@value%' OR `through_day` LIKE '%@value%') ", 
"`@field` LIKE '%@value%' "); 

$i=0; 
foreach($_GET as $key =>$rawData) 
{ 
    $cleanData= mysql_real_escape_string(str_replace(' ', '%', $rawData)) ; 
    $queryTmplArr[$i]=str_replace('@value', $cleanData, $queryTmplArr[$i]); 
    $queryTmplArr[$i]=str_replace('@field', $key, $queryTmplArr[$i]); 
    $i++; 
} 

그리고 다시 시험 목적 :

echo '<pre>'; 
print_r($queryTmplArr); 
$_GET['event']='jut for test'; 
$_GET['place']='jut for test'; 
$_GET['city']='jut for test'; 
$_GET['state_abbr']='jut for test'; 
$_GET['weekday']='jut for test'; 
$_GET['month']='jut for test'; 
$_GET['day']='jut for test'; 
$_GET['year']='jut for test'; 

그런 다음 그 아래에 실제 코드를 넣어

이 출력됩니다이 :

Array 
(
    [0] => (`event` LIKE '%jut%for%test%' OR `note` LIKE '%jut%for%test%') 
    [1] => `place` LIKE '%jut%for%test%' 
    [2] => `city` LIKE '%jut%for%test%' 
    [3] => `state_abbr` LIKE '%jut%for%test%' 
    [4] => (`weekday` LIKE '%jut%for%test%' OR `through_weekday` LIKE '%jut%for%test%') 
    [5] => `month` LIKE '%jut%for%test%' 
    [6] => (`day` LIKE '%jut%for%test%' OR `through_day` LIKE '%jut%for%test%') 
    [7] => `year` LIKE '%jut%for%test%' 
) 

이 괜찮 있습니까?