continue; } $concat = array(); if ($search_all || $qname) { $concat[] = "a.it_name"; } if ($search_all || $qexplan) { $concat[] = "a.it_explan2"; } if ($search_all || $qid) { $concat[] = "a.it_id"; } $concat_fields = "concat(" . implode(",' ',", $concat) . ")"; $detail_where[] = $concat_fields . " like '%{$word}%' "; // 인기검색어 insert_popular($concat, $word); } $where[] = "(" . implode(" and ", $detail_where) . ")"; } if ($qcaid) { $where[] = " a.ca_id like '{$qcaid}%' "; } if ($qfrom && $qto) { $where[] = " a.it_price between '{$qfrom}' and '{$qto}' "; } $sql_where = " where " . implode(" and ", $where); // 상품 출력순서가 있다면 $qsort = strtolower($qsort); $qorder = strtolower($qorder); $order_by = ""; // 아래의 $qsort 필드만 정렬이 가능하게 하여 다른 필드로 하여금 유추해 볼수 없게함
} $search_query = 'sfl=' . urlencode($sfl) . '&stx=' . urlencode($stx) . '&sop=' . $sop; $text_stx = get_text(stripslashes($stx)); $op1 = ''; // 검색어를 구분자로 나눈다. 여기서는 공백 $s = explode(' ', strip_tags($stx)); // 검색필드를 구분자로 나눈다. 여기서는 + $field = explode('||', trim($sfl)); $str = '('; for ($i = 0; $i < count($s); $i++) { if (trim($s[$i]) == '') { continue; } $search_str = $s[$i]; // 인기검색어 insert_popular($field, $search_str); $str .= $op1; $str .= "("; $op2 = ''; // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...) for ($k = 0; $k < count($field); $k++) { $str .= $op2; switch ($field[$k]) { case 'mb_id': case 'wr_name': $str .= "{$field[$k]} = '{$s[$i]}'"; break; case 'wr_subject': case 'wr_content': if (preg_match("/[a-zA-Z]/", $search_str)) { $str .= "INSTR(LOWER({$field[$k]}), LOWER('{$search_str}'))";
function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator = 'and') { global $g5; $str = ""; if ($search_ca_name) { $str = " ca_name = '{$search_ca_name}' "; } $search_text = strip_tags($search_text); $search_text = trim(stripslashes($search_text)); if (!$search_text) { if ($search_ca_name) { return $str; } else { return '0'; } } if ($str) { $str .= " and "; } // 쿼리의 속도를 높이기 위하여 ( ) 는 최소화 한다. $op1 = ""; // 검색어를 구분자로 나눈다. 여기서는 공백 $s = array(); $s = explode(" ", $search_text); // 검색필드를 구분자로 나눈다. 여기서는 + $tmp = array(); $tmp = explode(",", trim($search_field)); $field = explode("||", $tmp[0]); $not_comment = ""; if (!empty($tmp[1])) { $not_comment = $tmp[1]; } $str .= "("; for ($i = 0; $i < count($s); $i++) { // 검색어 $search_str = trim($s[$i]); if ($search_str == "") { continue; } // 인기검색어 insert_popular($field, $search_str); $str .= $op1; $str .= "("; $op2 = ""; for ($k = 0; $k < count($field); $k++) { // 필드의 수만큼 다중 필드 검색 가능 (필드1+필드2...) // SQL Injection 방지 // 필드값에 a-z A-Z 0-9 _ , | 이외의 값이 있다면 검색필드를 wr_subject 로 설정한다. $field[$k] = preg_match("/^[\\w\\,\\|]+\$/", $field[$k]) ? $field[$k] : "wr_subject"; $str .= $op2; switch ($field[$k]) { case "mb_id": case "wr_name": $str .= " {$field[$k]} = '{$s[$i]}' "; break; case "wr_hit": case "wr_good": case "wr_nogood": $str .= " {$field[$k]} >= '{$s[$i]}' "; break; // 번호는 해당 검색어에 -1 을 곱함 // 번호는 해당 검색어에 -1 을 곱함 case "wr_num": $str .= "{$field[$k]} = " . -1 * $s[$i]; break; case "wr_ip": case "wr_password": $str .= "1=0"; // 항상 거짓 break; // LIKE 보다 INSTR 속도가 빠름 // LIKE 보다 INSTR 속도가 빠름 default: if (preg_match("/[a-zA-Z]/", $search_str)) { $str .= "INSTR(LOWER({$field[$k]}), LOWER('{$search_str}'))"; } else { $str .= "INSTR({$field[$k]}, '{$search_str}')"; } break; } $op2 = " or "; } $str .= ")"; $op1 = " {$search_operator} "; } $str .= " ) "; if ($not_comment) { $str .= " and wr_is_comment = '0' "; } return $str; }