2010-01-12 7 views
1

그래서이 웹 사이트에는 mysql 데이터베이스의 테이블을 검색하는 검색 기능이 있습니다. 현재 데이터베이스에는 1108 개의 행이 있습니다. 아티스트 및 앨범과 같은 음악 정보가 포함되어 있습니다. 모든 캐릭터가 아티스트 이름이나 앨범 이름에 포함될 수 있기 때문에 필자는 데이터베이스에 추가되기 전에 각 변수를 urlencoded했습니다. 아래를 참조PHP를 통해 mysql 데이터베이스를 검색 할 때 문제가 발생했습니다

$artist = urlencode($_POST['artist']); 
$album = urlencode($_POST['album']); 

그래서 지금은 데이터베이스에 새 항목을 추가하고 urlencoded를 할 필요가 문자를 포함 척 할 수 있습니다. 데이터베이스가 잘 보여줍니다.

이제 검색하겠습니다.

외국 문자가 사용되었습니다. 당신은 여기에서 볼 수 있습니다 : http://albumarrrt.net/details.php?artist=Ai%20Otsuka 각각에 대한 앨범 링크를 클릭하면 작동합니다.

하지만 이제 몇 가지 문제가 발생합니다.

1 - '&'을 검색하면 검색 결과 % 26이 (가) 아무것도 표시되지 않습니다. 검색 주소창에 % 26을 표시하지만 아무 것도 읽지 않습니다. 여기 는이 읽고있는 방법은 다음과 같습니다

가 데이터베이스에서 읽을하기 시작하기 전에 $의 검색을 수행 할 수있는 유일한 일이
$search = $_GET['search']; 

if($search == '') { 
    echo "Please enter a search term :("; 
} 

. -

이 단일 또는 이중 따옴표를 검색 할 경우, 일부 이상한 물건의 예를 수행합니다에 대한

검색 "과 일치하는 항목에 대한 찾을 수 없습니다 얻을"% 5C % 5C % 26quot % 3B "검색을 에 대한 ' 와 일치하는 항목은이 작업을 수행하는 이유 데이터베이스 만 인용 아무것도에 대한 코드가 포함되어 있기 때문에 내가 이해하지 못하는 "% 5C % 5C % 26 % 23,039퍼센트의 3B"

을 찾을 수 없습니다 얻을 else.

그건 내 수색에서 잘못 발견 한 유일한 두 가지입니다. 어쩌면 나는 너무 오랫동안 그것을보고 있었지만 그것을 이해할 수는 없었지만, 왜 그것이 '&'을 아무것도 읽지 못하는지에 대해 혼란 스럽습니다.


내 마지막 질문. 현재 검색 방법은 각 단어를 분리하고 주위에 %를 추가 한 다음 LIKE 문을 사용하여 일치하는 단어를 찾습니다. 예 :

검색 :

SELECT * FROM TABLE WHERE (album LIKE '%A%' AND album LIKE '%bunch%' AND album LIKE '%of%' AND album LIKE '%Stuff%' AND album LIKE '%%28word%29%') OR (artist LIKE '%A%' AND artist LIKE '%bunch%' AND artist LIKE '%of%' AND artist LIKE '%Stuff%' AND artist LIKE '%%28word%29%') 

은 분명히이 서버에 부담을 많이두고있다, 그리고 나는 그런에 대한 LIKE 문을 사용하여 알고 : 같은 물건 (단어)의 무리 MySQL의 쿼리는 것 대용량 데이터베이스 검색은 좋지 않으므로 FULL TEXT 또는 다른 방법을 검색하는 대체 방법은 무엇입니까?

압도적 인 질문에 사과드립니다.하지만 그들은 모두 서로 손을 맞잡고 있습니다.


편집 : 내 데이터베이스를 위로 고정,하지만 여전히 몇 가지 질문을했습니다 확인. 누군가 utf8에서 utf로 내 텍스트를 변환하겠다고 제안했는데 어떻게해야합니까?

& 기호가 계속 표시됩니다. 예 : Google에서 &을 검색하면 작동하지만 내 사이트에서는 &을 검색 할 때 검색 결과에 대한 POST 결과가 아무 것도 표시되지 않습니다.

+1

$ _POST 매개 변수를 가져 와서 데이터베이스 쿼리에 적용 할 때 응용 프로그램이 SQL 삽입에 대해 익숙합니다. –

답변

3
  • 첫 번째 : 데이터를 데이터베이스에 urlencode하지 마십시오. 가져온 후 Urlencode 데이터를 으로 출력하여을 HTML로 출력합니다.

  • 둘째 : SQL 쿼리에서 사용자 제공 값을 사용할 때 쿼리 매개 변수를 사용하십시오. 그런 다음 구문 오류 또는 SQL 주입 위험을 야기하는 양식 데이터의 따옴표에 대해 걱정할 필요가 없습니다.

  • 세 번째 : LIKE '%pattern%' 해킹을 사용하지 마십시오. 대신 실제 전체 텍스트 검색 솔루션을 사용하십시오 (FULLTEXT 또는 Lucene/Solr 또는 Sphinx Search). 애드혹 텍스트 검색을 사용하는 것보다 데이터의 양에 따라 수 백 또는 수천 배의 성능이 향상됩니다.

    내가 MySQL 대학에서 한 프레젠테이션 : Practical Full Text Search in MySQL을 참조하십시오.

+0

+1에 대한 FULLTEXT/Lucene 언급 –

+0

FULLTEXT 검색에 약간의 문제가 있습니다. SELECT * FROM TABLE WHERE MATCH (아티스트, 앨범) AGAINST ('underworl'); 텍스트가 정확히 일치해야합니다. 위의 예제에서 "underworl"은 아티스트 "지하 세계"가있는 경우 결과를 반환하지 않습니다. 이게 어떻게 될까? 그렇다면 사물에 댐퍼가 걸리기 때문입니다. 그렇지 않다면 어떻게 해결할 수 있습니까? – smont

+0

예, 전체 단어와 일치합니다. 다른 기술은 형태소 분석을 지원하므로 "지하 세계"와 "지하 세계"가 일치하지만 임의의 하위 문자열과 일치하는 것은 일반적으로 솔루션의 일부가 아닙니다. 'LIKE' 술어를 고수해야 할 수도 있고, 역 색인 *을 사용할 수도 있습니다. –

1

내가 왜 urlencode해야하는지 알지 못한다. mysql_real_escape_string을 사용하기 만하면된다. 당신이를 urlencode 또 다른 문제가 추가 문자의 많은

입니다 첫째를 urlencode하지 않는 한이 스크립트로 전달되지 않도록

'&'는 URL의 구분이다. 충분한 문자를 허용하지 않으면 mySQL이 아티스트 또는 제목을 자동으로자를 수 있습니다.

DC

1

당신이 당신의 URL의 (그리고 게시물)에서 오는 것들 데이터베이스에 배치하기 전에 디코딩 싶지 않아 확신? 다양한 문자열을 저장하는 경우 일반 UTF 또는 다른 형식으로 디코드하여 해당 방식으로 저장하려고합니다. 그런 다음 다시 인코딩하여 표시 할 수 있습니다. 이렇게하면 자체 검색 문제를 해결할 수 있습니다.

둘째, 문자열 검색 액세스 속도를 높이기 위해 모든 문자열을 토큰 화하고 문자열이 포함 된 문자열로 다시 연결되는 문자열 테이블을 만들 수 있습니다. 그런 다음 "like % $ 1 %"대신 $ 1 = stringTable.String을 말하고 해당 ID에 대해 조인 할 수 있습니다. 필자가 이러한 퍼포먼스 튜닝을 직접 해보지 않았으므로 이것을 결코 최적의 솔루션으로 간주하지 마십시오. 그것은 단지 제안 일뿐입니다.

관련 문제