2009-12-09 2 views
0
function get_tags_by_criteria($gender_id, $country_id, $region_id, $city_id, $day_of_birth=NULL, $tag_id=NULL, $thread_id=NULL) { 

    $query = "SELECT tags.* 
     FROM tags, thread_tag_map, threads 
     WHERE thread_tag_map.thread_id = threads.id 
     AND thread_tag_map.tag_id = tags.id 

     AND threads.gender_id = $gender_id 
     AND threads.country_id = $country_id 
     AND threads.region_id = $region_id 
     AND threads.city_id = $city_id 
     AND tags.id LIKE '%$tag_id%' 
     AND threads.id LIKE '%$thread_id%'"; 
     if(!$day_of_birth) 
     { 
      $query += "AND threads.min_day_of_birth <= '$day_of_birth AND threads.max_day_of_birth >= '$day_of_birth' "; 
     } 

     $query += "GROUP BY tags.name"; 

    $result = $this->do_query($query); 
    return $result; 
} 

$ day_of_birth가 인수로 전달되지 않으면 sql이 if 내부의 2 줄을 생략하기를 원합니다. 내가 사용 :SQL 쿼리 내부 함수?

$all_tags = $forum_model->get_tags_by_criteria(1, 1, 0, 0); 

내가이 SQL은 오류를 반환 이유를 궁금해 :.

Couldn't execute query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0' at line 1 
+1

마지막 쿼리는 어떻게 생겼습니까? echo $ query; – Galen

+0

+1 Galen, 단순히 쿼리를 반복하면 아래 사람들이 지적한 많은 문제에 대해 밝혀 줄 것입니다. – Simon

답변

0

을 = PHP에서 문자열 연결에 사용하지 + =

+0

또한 앞에 공백을 넣고 if 문에 – Galen

1

귀하의 문제는 당신이 출생의 날짜에 의해 '을 남아 있다는 것입니다 참조 -

당신은 SQL 주입을 방지하기 위해, 너무 당신의 입력을 탈출해야합니다. AND threads.min_day_of_birth <= '$day_of_birth'

변경은 다른 사람들이 지적으로, 대신 $query += $query .=를 작성해야, 또한
(주 ' 개방 을 폐쇄) 당신은 SQL 주입 취약점이


을 (.주의) ; 매개 변수를 사용해야합니다.
Remember Bobby Tables!

+0

LOL, 그 바비 테이블 비트가 상당히 재미 있습니다! 좋은 웃음을 주셔서 감사합니다 :). – dcp

+0

바비 테이블? 그게 뭐야? –

+0

링크를 클릭하십시오. – SLaks

1

추가 문자열에 " 사이의 공백 누락있다

0

당신은 또한 당신의 쿼리에 자리를 사용할 수 있습니다. 옵션/매개 변수가 설정되어있는 경우 스크립트가 자리 표시의 내용을 설정합니다 적절한 SQL 코드에 그렇지 않으면 자리가 null/비어 있습니다.

예를 들어

function get_tags_by_criteria($gender_id, $country_id, $region_id, $city_id, $day_of_birth=NULL, $tag_id=NULL, $thread_id=NULL) { 
    if (!is_null($day_of_birth)) { 
    $day_of_birth = "AND ('$day_of_birth' BETWEEN threads.min_day_of_birth AND threads.max_day_of_birth)" 
    } 

    $query = " 
    SELECT 
     tags.* 
    FROM 
     tags, thread_tag_map, threads 
    WHERE 
     thread_tag_map.thread_id = threads.id 
     AND thread_tag_map.tag_id = tags.id 
     AND threads.gender_id = $gender_id 
     AND threads.country_id = $country_id 
     AND threads.region_id = $region_id 
     AND threads.city_id = $city_id 
     AND tags.id LIKE '%$tag_id%' 
     AND threads.id LIKE '%$thread_id%' 
     {$day_of_birth} 
    GROUP BY 
     tags.name 
    "; 

    $result = $this->do_query($query); 
    return $result; 
} 

편집 : 앞에서 언급 한 바와 같이 가능한 SQL 주입을 염두에 두십시오.