2015-04-15 2 views
1

Я пытаюсь создать код многократного использования в PDO.PDO: создание многоразового кода

вот мой код.

$myClass = new main_c(); 
$condition = "email_address = :email_address AND password = :password"; 
$array = array('email_address' => '[email protected]', 'password' => '98467a817e2ff8c8377c1bf085da7138'); 
$row = $myClass->get('user', $condition, $array, $db); 
print_r($row); 

Это моя функция.

 public function get($tablename, $condition, $array, $db){ 

     $stmt = $db->prepare("SELECT * FROM $tablename WHERE $condition"); 
     foreach($array as $k=>$v){ 

      $stmt->bindParam(":$k", $v); 
     } 

     try{ 
      $stmt->execute(); 
     }catch(PDOException $e){ 
      $error = new main_c(); 
      echo $error->error_handling($e); 
     } 

     return $row=$stmt->fetch(PDO::FETCH_ASSOC); 
     } 

Я попытался опуская AND в состоянии и просто поставить один пункт, где и работал. Я думаю, что есть проблема в foreach. Я не уверен, хотя.

+0

Любые ошибки? Какой окончательный запрос вы получите? Я бы опустил параметр '$ db', так как это должно быть какая-то переменная, созданная при инициализации. Включить подсказки типа для атрибутов – Justinas

+0

@ Justinas ошибок пока нет. Sir jeroen правильная необходимость изменить bindParam на bindValue. –

ответ

2

Вы не являетесь обязательными значениями, а параметрами, поэтому в вашем цикле вы привязываете только одну переменную $v к ключу $k. Дважды. И к моменту выполнения вашего запроса эти переменные будут содержать значения последней итерации цикла.

Вам необходимо будет сменить bindParam() на bindValue().

Однако, как вы не используете третий параметр bindParam()/bindValue() - принуждая тип данных - вы можете пропустить этот весь цикл и сделать:

try { 
    $stmt = $db->prepare("SELECT * FROM $tablename WHERE $condition"); 
    $stmt->execute($array); 
    ... 
+1

Спасибо, сэр. Вы очень помогаете. –

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