2013-08-05 2 views
0

"데이터베이스의 열"인 "t1.address_city"가있는 행을 반환하기 위해 데이터베이스에 대한 where 쿼리를 작성해야하는 응용 프로그램과 함께 작업하고 있습니다. 배열의 모든 위치와 같습니다. 나는 이것을 하나의 큰 문자열로 만들기 위해 implode()를 사용해야한다는 것을 이해한다. 그러나 이것은 어떤 행도 반환하지 않는다. 아마도 큰 문자열과 일치하는 행을 찾고 있기 때문이다. 목록입니다). 코드 :긴 문자열과 함께 MySQL "in"절 사용

$_GET["places"]이 같은 것을 포함이 :

["madrid", "lisbon", "london", "paris", "new york"]

배열 이름, $ 장소, IN ('$places')처럼 where 절에 투입 될 때, 나는 더 행을 얻을. 여기에 다른 비슷한 질문에 대한 조언을 따라 배열을 함몰하여 "madrid, lisbon, london, paris, new york"처럼 표시 한 다음 IN ('$implodedplaces')과 같이 내포 된 변수를 사용하지만 앞에서 언급했듯이 모든 행을 찾지 못합니다.

따옴표 (IN ('madrid','lisbon','london'))로 각 장소 이름을 입력하면 완벽하게 작동하지만, 사용자가 조작하므로 $_GET["places"]을 사용하려면 IN 절이 필요합니다. $_GET["places"]의 모든 값을 쉼표로 구분 된 문자열로 입력 할 수 있습니까?

도움이 되었으면 도움이됩니다. 제 설명이 훌륭하지 않은 경우 언제든지 질문 할 수 있습니다.

+1

원하는 모든 소리는 포함 된 작은 따옴표 문자를 두 번 올리거나 작은 따옴표로 큰 따옴표를 대체하고 대괄호를 버리십시오. –

+0

Mysql은 IN ("madrid", "lisbon", "london")도 허용하므로 대괄호를 제거하면됩니다. –

+0

대괄호가 아닙니다 ... 배열입니다. –

답변

-1

는이 $ 장소에있을 수있는 따옴표를 탈출하지 않는

$implodedplaces = implode("','", $places); 

참고하십시오. 이것은 당신이 당신의 장소 이름에 따옴표와 괄호를 찾을 수 없습니다 그러나 그 가정을 않습니다

$implodedplaces = str_replace('"', "'", str_replace('[',"'", str_replace(']',"'",$_GET["places"]))); 

:

$ _GET [ "장소"] 당신이 시도 할 수있는 문자열 인 경우

.

+0

WHERE't1.address_city IN (' ". $ places."')) ")'와 결합하여 완벽하게 작동했습니다. 내 생각을 넘어서지 않으려 고 함몰/폭발을 자주 사용하지 않았습니다. – jbirch

+0

SQL 인젝션 문제를 해결하지 못했기 때문에 downvoted – Halcyon

0

당신은 당신이 이스케이프 할 필요가 명심해야합니다

$in = []; 
foreach ($_GET["places"] as $place) { 
    $in[] = mysql*_real_escape_string($place); 
} 
$in = '"' . implode('", "', $in) . '"'; 
$query = "select * from t where f IN (" . $in . ")"; 

은 또한 당신이 비어 경우 구문 오류입니다 IN()있을 것이다 쿼리 때문에 count($_GET["places"])을 확인해야합니다.

당신은 그것을 볼 EXPLAIN와 쿼리를 확인해야합니다 ..

+0

MYSQL에서 문자열 주위에 큰 따옴표를 사용하는 것을 조심하십시오. ANSI 모드에서는 열과 테이블 이름을 큰 따옴표로 묶는 데 사용됩니다 – noz

+0

왜 이것이 작동하지 않는지 잘 모름 그것은 다소 위의 솔루션과 비슷하지만 나에게 서버 오류를 주었다.다른 사람의 서버를 사용하고 있기 때문에 오류 로그에 액세스 할 수 없기 때문에 오류가 발생했는지 여부를 알 수 있지만 시도하고 발견 할 것입니다. 도와 주셔서 감사합니다. Frits에게 감사드립니다. – jbirch

+0

mysql * _real_escape_string을 적용 할 수있는 함수로 바꿔야합니다. mysqli를 사용하고 있다면 mysqli_real_escape_string과 같다. – Halcyon

0

은 전체 테이블 스캔을 필요로 대부분의 경우에, 인디애나와 조심, 이것은 MySQL의 성능을 죽인다.

+0

'IN'을 'a'("b", "c", "d")'와 같이 사용하지 않으면 : a = "b"또는 a = "c"또는 a = "d"' – Halcyon

+0

매개 변수를 IN 절에서 전달하면 mysql 최적화 프로그램이 범위 스캔에서 전체 테이블 스캔으로 전환하는 변경 사항이 높습니다. 검색어가 덜 선택 적이기 때문에 –

관련 문제