2016-08-16 2 views
2

내가하려는 것은 이와 유사합니다. 내 드롭 다운에 성별과 종교를 선택하면 Search Filtering with PHP/MySQL필터 데이터 pdo

<?php 
     require 'con.php'; 

     $minage  = $_POST['data'][0]; 
     $maxage  = $_POST['data'][1]; 
     $gender  = $_POST['data'][2]; 
     $religion = $_POST['data'][3]; 

     $query = "SELECT CONCAT(firstname, ' ', middlename, ' ', lastname, ' ', extension_name) as fullname, TIMESTAMPDIFF(YEAR, birthday ,NOW()) as age FROM mytable"; 
$filter = array(); 


     if($gender != -1){ 
      $gender = substr($gender, 1, -1); 
      $filter[] = "gender = :gender"; 
     } 
     if($religion != -1){ 
      $filter[] = "religion = :religion"; 
     } 

     if(count($filter) > 0){ 
      $query .= " WHERE " . implode(' AND ', $filter); 
      $sql = $connection->prepare($query); 
    -> $sql->bindParam(':gender', $gender, PDO::PARAM_STR); 
    -> $sql->bindParam(':religion', $religion, PDO::PARAM_STR); 
      $sql->execute(); 
      $res = $sql->fetchAll(); 
     }else{ 
      $sql = $connection->prepare($query); 
      $sql->execute(); 
      $res = $sql->fetchAll(); 
     } 
    ?> 

    <?php foreach($res as $row): ?> 
     <div><?php echo $row['fullname'];?></div> 
    <?php endforeach; ?> 

는, 결과는 괜찮습니다. 어디 $sql->bindParam(...);을 배치하는 나는 조금 혼란 스러워요

number of bound variables does not match number of tokens

:

하지만 하나를 선택할 때의 성별 말을하자, 나는 오류가 발생했습니다. 이게 내 오류의 원인이라고 생각해? 또는 '오류'가 더 있거나 올바르지 않은 것이있는 경우 수정하십시오. 미리 감사드립니다.

답변

1

이 바로

을 실행하는 바로 자리 표시 자와 함께 값을 추가 한 다음를 보내려고
if($gender != -1){ 
    $filter[] = "gender = ?"; 
    $values[] = $gender; 
} 
if($religion != -1){ 
    $filter[] = "religion = ?"; 
    $values[] = $religion; 
} 
$query .= " WHERE 1 AND " . implode(' AND ', $filter); 
$stmt = $connection->prepare($query); 
$stmt->execute($values); 
0

바인드는 조건도 할 수 없을시 :

if($gender != -1){ 
      $filter[] = "gender = :gender"; 
     } 
     if($religion != -1){ 
      $filter[] = "religion = :religion"; 
     } 

     if(count($filter) > 0){ 
      $gender = substr($gender, 1, -1); 
      $query .= " WHERE " . implode(' AND ', $filter); 
      $sql = $connection->prepare($query); 
      if($gender != -1){ 
     $sql->bindParam(':gender', $gender, PDO::PARAM_STR); 
      } 
      if($religion != -1){ 
     $sql->bindParam(':religion', $religion, PDO::PARAM_STR); 
      } 
      $sql->execute(); 
      $res = $sql->fetchAll(); 
     }else{ 

매우 심하게 조직 된 코드를 먹으 렴, 더 읽을 수 있도록

+0

@ your-common-sense의 대답에서 배우십시오. 그러면 코드가 더 읽기 쉽고 이해하기 쉬울 것입니다. – cske