2015-09-14 4 views
1

У меня есть класс DB, который обрабатывает все запросы, которые будут сделаны в базе данных У меня есть mysqli, готовый работать отлично. bind_param также работает нормально, но проблема в том, что я хочу динамически определять тип переменной. вот мой код

public function query($sql, $params = array()){ 
     $this->_error = false; 
     if($this->_query = $this->_mysqli->prepare($sql)){ 
      $x = 1; 
      if(count($params)){ 
       foreach($params as $param){ 
        $this->_query->bind_param($x, $param); 
        $x++; 
       } 
      } 

В параметре кулака PDO определяет позицию я думаю, так что эта функция работает нормально, установив X = 1 и х ++ каждый раз, но в bind_param первого аргумента определяет тип Я думаю в php.net руководстве говорю так есть ли способ, если пользователь нажмет интегральное значение I набор х = я для строки х = s так далее, и так далее для всех 4-х типов ...

как

if((int)$param->){ 
    x = i; 
} 

любые идеи, ребята?

заблаговременно

+0

В PDO я выполнить это, говоря при старте х = 1 означает, что 1-ый держатель место. в конце я сказал, что x ++ означает следующий раз x = 2, так что время отправки будет привязано к второму параметру. Но я согласен с вами в отношении mysqli, поэтому могу ли я использовать ваш метод ниже? это полный запас моего вопроса? –

ответ

0

Вот пример, который может помочь (prepare() функция - метод класса).

function prepare($query, $bind = array()) 
{ 
    if (!$stmt = $this->mysqli->prepare($query)) 
     throw new Exception('Query failed: ' . $query . PHP_EOL . $this->mysqli->error); 

    // if $bind is not an empty array shift the type element off the beginning and call stmt->bind_param() with variables to bind passed as reference 
    if ($type = array_shift($bind)) 
     call_user_func_array( 
      array($stmt, 'bind_param'), 
      array_merge(array($type), array_map(function(&$item) { return $item; }, $bind)) 
     ); 

    if (!$stmt->execute()) 
     throw new Exception('Execute failed: ' . PHP_EOL . $stmt->error); 

    // choose what to return here ('affected_rows', 'insert_id', 'mysqli_result', 'stmt', 'array') 

} 

Пример использования:

$db->prepare("SELECT * FROM user WHERE user_name = ? OR user_email = ?", [ 'ss', $user_name, $user_name ]); 
+0

Мне нравится ваша идея, позвольте мне попробовать это до тех пор, пока @your здравый смысл не ответит на мой вопрос –

+0

не могли бы вы сделать так, как если бы я хотел выбрать * без какого-либо параметра, например 'select * from members' –

+0

@SaeedAnsari,' $ bind 'является необязательным параметром, просто используйте' $ db-> prepare («select * from members»); ' – Danijel

2

Для типов это просто. Просто используйте s полностью.

Существует гораздо более сложная задача: на самом деле, вы не можете связать в петлю, так что, придется использовать call_user_func()

public function query($sql, $params = array()) 
{ 
    if (!$params) 
    { 
     return $this->_mysqli->query($sql); 
    } 
    $stmt = $this->_mysqli->prepare($sql); 
    $types = str_repeat("s", count($params)); 

    if (strnatcmp(phpversion(),'5.3') >= 0) 
    { 
     $bind = array(); 
     foreach($values as $key => $val) 
     { 
      $bind[$key] = &$params[$key]; 
     } 
    } else { 
     $bind = $values; 
    } 

    array_unshift($bind, $types); 
    call_user_func_array(array($stmt, 'bind_param'), $bind); 

    $stmt->execute(); 
    return $stmt->get_result(); 
} 

Обратите внимание, что вы не должны назначить заявление локальной переменной и там также не используется для переменной ошибки. Исключения лучше во всех отношениях.

Глядя на код выше, вы должны думать дважды, прежде чем переворачивания PDO, который будет принимать только три линии для такой функции:

public function query($sql, $params = array()) 
{ 
    $stmt = $this->_pdo->prepare($sql); 
    $stmt->execute($params); 
    return $stmt; 
} 

Если у вас нет опыта работы с PDO, вот PDO tutorial я написал , из которого вы узнаете, что это самый простой, но мощный API баз данных, получающий вам данные в десятках разных форматов с очень небольшим количеством кода.

+0

если я использую s для интеграла, а? –

+0

У меня нет команды в PDO, поэтому я выбираю mysqli, потому что я понимаю это больше, чем PDO, что вы предлагаете? –