2013-03-11 8 views
0

Я создал класс для обработки всех операций с базой данных для моего приложения. До сих пор я собирал и отображал данные в заявлениях foreach в моем представлении. То, что я хочу, это получить и установить отдельные элементы из функции из моего класса базы данных.Функция динамической базы данных для получения и настройки данных

Вот моя функция базы данных для отображения данных в Еогеаспе:

public function test($sql, $type, $param) 
    { 
     $variables = array(); 
     $results = array(); 

     // Mysqli 
     if($stmt = $this->AC->Mysqli->prepare($sql)) 
     { 
     $params = array_merge($type, $param); 
      call_user_func_array(array($stmt, 'bind_param'), $this->make_values_referenced($params)); 
     $stmt->execute(); 
     $stmt->store_result();   
     // Existance 
     if($stmt->num_rows > 0) 
     { 

     $meta = $stmt->result_metadata(); 

     while($field = $meta->fetch_field()) 
     { 
      $parameters[] = &$row[$field->name]; 
     } 

     call_user_func_array(array($stmt, 'bind_result'), $parameters);      


     while($stmt->fetch()) 
     { 

      $elemet = array(); 

      foreach($row as $key => $val) 
      { 
       $element[$key] = $val; 
      } 

      $results[] = $element; 

     } 

     return $results;    

     } 
     else 
     { 
      $results = FALSE; 
      return $results; 
     }    
     } 
     else 
     { 
     die("ERROR: We could not connect."); 
     } 
    } 

Функция ниже вызывается из моей модели:

public function profile_information($account_name) 
    { 
    // Mysqli Variables 
    $sql = "SELECT $this->account_details.bio 
      FROM account_details 
      WHERE $this->account_details.account_name = ? LIMIT 10";  

      $type = array("s"); 
      $param = array($account_name); 

      $results = $this->AC->Database->prepared_select_loop($sql, $type, $param); 

      $this->AC->Template->set_data('profile_information', $results, FALSE); 
    } 

После установки в моей модели, я вызываю функцию в мой контроллер и получить доступ к нему в моем представлении с помощью foreach для отображения данных:

$profile_information = $this->get_data('profile_information'); 
    foreach ($profile_information as $row) : 
     //Displaying data here 
    endforeach; 

Вышеописанное прекрасно подходит для отображения большого количества данных, но то, что я хочу сделать, это вызвать функцию базы данных, которая позволит мне установить отдельные элементы данных. Поэтому не нужно использовать foreach, если im только получает ограниченный объем данных (например, один ряд Имя, возраст, адрес)

Нединамический способ, с которым я столкнулся, состоит в том, чтобы написать базу данных для каждой функции, желаю одну строки из базы данных:

function name($variable) 
    { 
      $sql = 'statement here'; 
      $stmt = $this->AC->Mysqli->prepare($sql); 
       $stmt->bind_param("i", $id); 
       $stmt->execute(); 
       $stmt->store_result(); 
       $stmt->bind_result(bind results); 
       $stmt->fetch(); 

      $this->AC->Template->set_data('id', $id);    
      $this->AC->Template->set_data('account_name', $account_name); 
    } 

Так что в основном я хочу сделать вышеуказанное заявление рефакторинга в мой класс базы данных и, таким образом, делая его более динамичным.

Я не знаю, как я смогу решить эту проблему, я не хочу использовать PDO, поскольку я хочу найти решение в Mysqli. Любая помощь будет оценена по достоинству.

+0

вашей идея объединения API базы данных с вызовами шаблонов в один функция выглядит ошибочно ... необычно для меня. Однако, я желаю вам удачи. Mysqli особенно злой с динамическими подготовленными заявлениями. Если вам не нравятся однострочные PDO, несколько экранов кода mysqli - лучший выбор. –

+0

Вы бы порекомендовали просто переключиться на PDO? – HireLee

ответ

1

Вы бы порекомендовали просто переключиться на PDO?

Определенно.

Всего ваша функцию test() можно переписать в три линий (предполагая $ пары содержат массив с параметрами для подготовленного оператора):

public function test($sql, $param) 
{ 
    $stmt = $this->AC->pdo->prepare($sql); 
    $stmt->execute($param); 
    return $stmt->fetchAll(); 
} 
Смежные вопросы