2013-06-16 4 views
0

Я пытаюсь построить функцию, которая принимает 2 параметра: имя таблицы и список параметров и построить запрос SELECT.Метод, который вызывает bind_param несколько раз

Вот пример:

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

Это должно строить (и выполнить) этот запрос:

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

, а затем возвращает количество выбранных строк ...

У меня есть эти 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

Чтобы быть уверенным, вы используете 'PDO', а не' mysqli'? –

+0

Они * используют * mysqli, но помечены pdo –

+0

Я использую PDO ... –

ответ

3

С PDO привязка работает немного иначе:

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

Я не понимаю, почему вы используете bindParam. Если вы можете использовать параметры для выполнения. '$ mySelect-> execute ($ params)' – MKroeders

+0

Я пытался это сделать, но это не сработало ... вот почему я немного искал в Интернете и обнаружил, что использование [code] call_user_func_array [/ code] может быть решением ... –

+1

@ Хендрик Хорошая точка, спасибо. – Niko

0

bind_param - метод mysqli объект, для PDO он называется bindParam, и он не принимает сразу несколько параметров. Вы должны пройти через ваш $params и добавить их отдельно.

+0

Я пробовал это, я проверил переданные значения, но я понятия не имею, почему запрос не является выполняется ...Вот что я сделал: foreach ($ params as $ param) { $ selectQuery-> bindParam ($ i ++, $ param); var_dump ($ query. '|||'. $ I. '|||'. $ Param); // для проверки } –

Смежные вопросы