2011-11-26 5 views
0

와일드 카드 검색이 실제로 작동하지 않는 경우 ... 이것은 실행중인 MySQL 쿼리이며 전체 단어 만 반환합니다 ...와일드 카드 검색 (MySQL 포함)

예 : 내가 검색 단어로 "전화"를 입력하면 내가 그것을 돌려받을 수있는 방법

mysql_query(" SELECT * FROM posts WHERE permalink = '$permalink' AND LOWER(raw_text) LIKE '%$str%' "); 

를 (추가의를 '주의) "전화"모든 거기에 "전화"와 행이 아닌 행을 반환합니다 검색 단어의 모든 변형? 분명히 사용자가 일반적인 문자 입력을 입력하면 모든 종류의 일치를 반환 할 수 있으므로이 문제가 발생할 수 있음을 알고 있습니다. 고급 검색 옵션에이 부분을 추가 할 수 있다고 생각했습니다.

ADENDUM 나는 와일드 카드에없는 문제로 좁혀하지만 반환 된 데이터로 뭘하는지와 ... 내가이 데이터를 던지고 내 정규식입니다.

$pattern= "/(?:[\w\"',.-]+\s*){0,5}[\"',.-]?\S*".$str."(\s|[,.!?])(\s*[A-Za-z0-9.,-]+){0,5}/"; 

preg_match_all($pattern, $row["raw_text"], $matches); 

정규식은 내가 반환하는 원시 데이터에서 null을 던지는 문자열을 찾지 못합니다. 새로운 문제, 나는 정규식에 익숙하지 않기 때문에 이걸 도둑질하려고합니다. 어쩌면 곧 새로운 질문을 던질 것입니다!

덕분에, M

+0

이 질문은 귀하의 질문에 직접적으로 대답하지 않지만 귀하가 직접 보게 될 이상한 행동을 설명해줍니다. [mysqli_prepare()와 함께 준비된 쿼리를 사용하십시오] (http://php.net/manual/en/mysqli.prepare.php). 코드는 그대로 SQL 인젝션 취약점이 있습니다. –

답변

1

나는 뭔가 다른 일이 벌어지고 생각합니다. 쿼리의 % 부분이 올바른 것처럼 보입니다. , 그런데

select 'phones' LIKE '%phone%'; 
+-------------------------+ 
| 'phones' LIKE '%phone%' | 
+-------------------------+ 
|      1 | 
+-------------------------+ 
1 row in set (0.00 sec) 

난 정말 당신이 (너무가 사용자의 입력에서 인 경우 $permalink) $str에 엄격한 위생을하고 희망 : 그리고이 확인 될 것으로 보인다. 영숫자와 기타 안전 문자 (공백 일 가능성이 있음) 만 허용해야하며 mysql_query()에서 사용하기 전에 mysql_real_escape_string()을 통해 실행해야합니다. 더 나은 방법은 PDO입니다.

어쨌든 다음 문제 해결 방법으로 시도하십시오. 시도 할 것은 프로그램에 문자열을 mysql_query()에 기록하도록하는 것일 수 있습니다. 기본적으로 mysql_query()에 대한 호출을 error_log() 또는 echo() 또는 그와 비슷한 것으로 변경하십시오. 그런 다음 복사 한 결과 쿼리를 MySQL의 명령 줄 도구 또는 PHPmyAdmin 또는 무엇이든에 붙여 넣습니다. 쿼리가 예상대로 작동하지 않을 때, 적어도 쿼리를보고 조정할 수 있습니다. 그리고 누가 알겠습니까? 쿼리가 철자가 된 것을 알고 나면 분명히 분명합니다.

+0

동의합니다 ... 내 머리를 감싸는 것처럼 보일 수는 없습니다 ... 테스트 데이터에서 "총"과 "총"과 같은 단어와 단어가 포함 된 레코드가 있다는 것을 알고 있습니다.하지만 내가 "총"에 대한 검색을 수행하면 "총"이 아닌 "총"이 포함 된 레코드 만 반환됩니다 ... 흠 ... 위생과 관련하여 퍼머 링크는 내가 만든 모든 기능을 통해 생성되어 친숙하지 않은 문자를 모두 제거하고 친근한 퍼머 링크를 만듭니다. 검색에 관한 한, 지금까지는 원시 입력을 취하고 있지만 검색 문자열을 정리하고 특정 문자 만 허용합니다. –

+0

시도해 볼 수있는 한 가지 방법은 프로그램이 mysql_query()에 보내는 문자열을 기록하도록하는 것일 수 있습니다. 기본적으로'mysql_query()'호출을'error_log()'나'echo()'와 같은 것으로 변경하십시오. 그런 다음 복사 한 결과 쿼리를 MySQL의 명령 줄 도구 또는 PHPmyAdmin 또는 무엇이든에 붙여 넣습니다. 쿼리가 예상대로 작동하지 않을 때, 적어도 쿼리를보고 조정할 수 있습니다. 그리고 누가 알겠습니까? 쿼리가 철자가 된 것을 알고 나면 분명히 분명합니다. – Trott

+0

정확히 내 부록에 생각했다 ... 쿼리가 데이터를 올바르게 반환했다, 그것은 내 정규식으로 데이터 afterword를 조작하는 방법을 ... 지금은 적절한 정규식으로 해결하고 이제는 아름답게 작동합니다! 답변을 주셔서 감사합니다! –

0

나는 당신이보고있는 것을 설명 할 수 귀하의 $str 변수 뒤에 공간을 가지고 생각 : 귀하의 LIKE 기준이 "... phone ..." 일치 '%phone %',하지만 "... phones ..." 될 것이다.

먼저 값을 잘라내십시오.

+0

정확하게 내 부록에서 생각했던 것입니다 ... 쿼리는 데이터를 올바르게 반환했습니다, 그것은 내가 정규식으로 데이터 afterword를 조작하는 방법이었습니다 ... 지금은 적절한 정규 표현식으로 고쳐졌으며 지금은 아름답게 작동합니다! 답변을 주셔서 감사합니다! –