2013-06-16 3 views
0

두 개의 매개 변수를 사용하는 함수를 작성하려고합니다. 테이블 이름과 매개 변수 목록을 조합하고 SELECT 쿼리를 작성합니다. bind_param을 여러 번 호출하는 메서드

나는이가 ...

SELECT * FROM users WHERE user='myTestUsername' AND pass='myTestPassword' 

다음 선택된 행의 수를 반환

$params['user'] = 'myTestUsername'; 
$params['pass'] = 'myTestPassword'; 
echo $dbCon->countBy('users', $params); 

이이 쿼리를 작성 (및 실행)해야합니다 여기

은 예입니다 2 가지 방법 :

1) 주요 방법 (SQL 마술 발생) :

public function countBy($table, $params) { 
    $query = $this->buildQuery($table, $params); 

    $mySelect = $this->dbh->prepare($query); 
    $params = array_merge(array(count($params)), array_values($params)); 
    call_user_func_array(array(&$mySelect, 'bind_param'), $params); 

    if ($mySelect) { 
     $mySelect->execute(); 
     return $mySelect->rowCount(); 
    } 
    return 0; 
} 

2) 지정된 매개 변수를 사용하여 쿼리를 작성하는 방법 :

public function buildQuery($table, $params) { 
    $i = 0; 
    $where = ''; 

    if (count($params) > 0) { 
     $query = 'SELECT * FROM ' . $table . ' WHERE '; 
     foreach(array_keys($params) as $pList) { 
      $i++; 
      $where .= $pList . '=?' . ($i<count($params) ? ' AND ' : '') ; 
     } 
     $query .= $where; 

     // output is like : SELECT * FROM users WHERE user=? AND pass=? 

     return $query; 
    } 
    return null; 
} 

제 2 방법은 잘 작동하지만, 나는 1 일에 몇 가지 문제가 있습니다. 그리고 그것은 "call_user_func_array"메소드의 사용과 관련이 있습니다.

나는 정말로 내가 잘못한 것을 보지 못했다 ... 어떤 생각?

call_user_func_array과 함께 "솔루션"here에서 찍은, 그러나 나는이 부분에 대해 확실하지 않다 :

내 코드에서
$params = array_merge(array(str_repeat('s', count($params))), array_values($params)); 

나는 이런 식으로 사용하여 시도 :

$params = array_merge(array(count($params)), array_values($params)); 

하지만, 여전히 아무것도 ...

+1

그냥 - mysqli가 아니라'PDO'를 사용하고 있습니까? –

+0

그들은 * mysqli를 사용하고 있지만 pdo로 태그가 붙어 있습니다 –

+0

나는 PDO를 사용하고 있습니다 ... –

답변

3

PDO를 사용하면 바인딩이 약간 다르게 작동합니다.

$mySelect = $this->dbh->prepare($query); 
if ($mySelect) { 
    $mySelect->execute(array_values($params)); 
    return $mySelect->rowCount(); 
} 
+0

bindParam을 사용하는 이유가 없습니다. 실행시 params를 사용할 수 있습니다. '$ mySelect-> execute ($ params)' – MKroeders

+0

이 작업을 시도했지만 작동하지 않습니다 ... 그래서 조금 온라인에서 검색 한 결과 call_user_func_array [/ code]의 사용법이 해결책이 될 ... –

+1

@Hendriq 좋은 지적, 감사합니다. – Niko

0

bind_parammysqli 개체이며, PDO의 경우 bindParam이라고하며 한 번에 여러 매개 변수를 사용할 수 없습니다. $params을 반복하여 따로 따로 추가해야합니다.

+0

나는 이것을 보았는데, 나는 전송 된 값을 확인했지만, 왜 그런 질문이 아닌지 전혀 모른다. 실행 ...다음은 내가 한 일입니다. foreach ($ params as $ param) { $ selectQuery-> bindParam ($ i ++, $ param); var_dump ($ query. '|||'. $ i. '|||'. $ param); // 확인하려면 } –

관련 문제