2017-11-20 1 views
0

여러 옵션을 '확인'할 수있는 확인란이 있습니다. 일단 체크되면 JavaScript 배열에 저장되고 ajax를 통해 PHP 파일로 전달됩니다. 거기에서 배열의 각 요소를 가져오고 각 요소의 SQL 문에 새로운 where 조건을 추가하고 쿼리를 실행하기 위해 foreach 루프를 수행하려고합니다. 실행PHP - foreach 루프 내에서 SQL 문에 새로운 WHERE 절 추가

스크립트

var vendors = []; 

function filterResults($this) 
{ 
    var vendor = $($this).attr('data-id'); 
    if($($this).prop('checked')) 
    { 
    var action = 'add'; 
    vendors.push(vendor); 
    } 
    else 
    { 
    var action = 'remove'; 
    var index = vendors.indexOf(vendor); 
    if(index >= 0) 
    { 
     vendors.splice(index, 1); 
    } 
} 

PHP 스크립트 (필터 results.php)

if(is_array($_POST['vendors'])) 
{ 
    $collaterals = $vendor->updateResults($_POST['vendors']); 
    var_dump($collaterals); 

    foreach($collaterals as $col) 
    { 
    include '../parts/item.php'; 
    } 
} 

PHP 함수 함유 foreach 루프

public function updateResults($vendors) 
{ 
    try 
    { 
     $items = array(); 
     $sql = "SELECT * FROM collaterals WHERE "; 
     foreach ($vendors as $ven) 
     { 
      echo $ven; 
      $sql .= "vendor = ".$ven." OR "; 
     } 

     $stmt = $this->db->prepare($sql); 
     $stmt->execute(); 

     while($row = $stmt->fetchObject()) 
     { 
      $items[] = $row; 
     } 

     return $items; 

    } 
    catch(Exception $e) 
    { 
     $e->getMessage(); 
    } 
} 

PHP 함수의 'echo'는 작동하지만 var_dump()가 'NULL'을 돌리고 있습니다. 즉, 어딘가에 SQL 문 내에 오류가 있음을 의미합니다.

도움을 주시면 감사하겠습니다. 감사!

답변

1

당신은 당신이 마지막 OR을 제거해야합니다

SELECT * FROM collaterals WHERE vendor = x OR vendor = x OR 

처럼

$sql = "SELECT * FROM collaterals WHERE vendor IN ('".implode("','",$vendors)."')"; 
+1

대단히 감사합니다. 모든 답변이 매우 도움이됩니다! –

0

조회에 보이는 foreach 루프없이이 실행 쿼리를 다음과 수. 또한 implode() PHP 함수와 함께 IN 절을 사용하는 것이 좋습니다.

0

사용은 생산 "벤더 = 1 OR 벤더 = 2 또는 WHERE 담보 SELECT *"것 "담보에서 선택 * 여기서, (1,2,3)에 공급 「대신

0

문제 : 당신은 vendor = item1 OR vendor = item2 OR을 사용하고

  1. IN를 사용
  2. 당신은 SHO 같은 결과를 얻을 수 (교수형을 알 OR) 준비된 문을 사용 자민련

는이 작업을 수행 :

$items = array(); 
$sql = "SELECT * FROM collaterals WHERE vendor IN (". 
    implode(",",array_fill(0, count($vendors), "?")) 
.")"; 
// $sql would look like e.g. SELECT * FROM collaterals WHERE vendor IN (?,?,?) 
$stmt = $this->db->prepare($sql); 
$stmt->execute($vendors); 

참고 : 당신은 당신이 bindParam 전화를 걸거나해야 다른 유형으로 바인드해야 할 경우 모든 $vendors은, 위의 코드에서 문자열로 처리됩니다 각 배열 항목에 bindValue