2014-01-26 2 views
-1
나는 PHP 스크립트의 IN() 절에 문제에 직면하고있어

, 나는 다음과 같은 POST 요청에서 다른 페이지에서 데이터를 수신 :PHP 준비된 문장 WHERE IN 사용 절 (...) 절

if(isset($_POST['mycountry'])){   
    if($_POST['mycountry']) $where[] = 'pays in (:pays)'; 
}; 

$ _POST [ 'mycountry'] : 사용자가 선택한 국가를 포함합니다. 사용자가 0 개 또는 여러 국가를 선택할 수 있습니다.

사용자가 국가/국가를 선택하면 해당 열과 값 (국가)을 IN 절.

if(isset($_POST['mycountry'])){ 
$tags = implode(', ', $_POST['mycountry']); 
$stmt->bindParam(':pays', $tags, PDO::PARAM_BOOL); 
} 

사용자가 잘 작동 제로 또는 하나 개의 국가를 선택, 사용자 일단은 아무것도 돌려주지 않는 이상 하나를 선택!

아이디어가 있으십니까?

+0

PDO 매개 변수는 임의의 문자열을 바인드하여 SQL을 구성 할 수 없으며 준비된 문에서 변수 값을 1 : 1로 대체합니다. 따라서 단일 자리 표시 자': pay '를 전달하면 쉼표로 구분 된 모든 태그의 단일 문자열 값이 함께 쿼리로 전송됩니다. 링크 된 질문에서 제안 된 몇 가지 대안 솔루션이 있습니다. –

+0

하나 이상의 선택된 항목에 대해 작동하는 문제는 사용자가 둘 이상을 선택하지 않을 때 발생합니다! – MDIT

+0

오른쪽. 단 하나만 선택하면 MySQL은 궁극적으로 'WHERE pays IN ('1 ')'이 유효하다는 결과를 얻고 결과를 반환합니다. 그러나 배수가 선택되면, MySQL은'어디에서 지불합니까 (1,2,3,4,5 ')를 보게됩니다. 그것은 쉼표로 구분 된 값 목록이 아니라 숫자와 쉼표로 구성된 단일 문자열 값입니다. 쿼리는 구문 적으로 유효하지 않지만 행과 일치하지 않습니다. 서면으로 시도하는 것을 할 수 없습니다. 링크 된 질문에서 높은 점수를 얻는 답을보십시오. –

답변

0

글쎄, 오라클에서는 하나의 var에 배열을 바인딩 할 수 없다는 것을 알고있다. PDO도 마찬가지입니다.

각 루프에 대해를 실행하고 일대일 바인딩을 만들고 원래 바인딩을 생성 한 새 바인딩과 바꾼 것으로 바꿔야합니다. (물론 생성 된 키 - 값 쌍을 가질 바인드 배열 업데이트)