2015-09-14 103 views
1

我有數據庫類正在處理所有查詢將提出到數據庫 我有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++; 
       } 
      } 

IN PDO拳頭參數定義位置我想是這樣函數運行通過設置X = 1和x ++每次, 但在bind_param第一個參數定義的I型猜 作爲php.net手動微調說 所以有是,如果用戶按下我設置 X積分值任何方式=我 字符串 X = S 等等等等所有4種類型...

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

任何創意傢伙?

在此先感謝

+0

在PDO我通過在開始X = 1說完成它意味着第一位置保持器。最後我說x ++意味着下一次x = 2,所以發送時間將綁定到第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

我喜歡你的想法讓我試試看,直到@你的常識回答我的問題 –

+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更瞭解它你建議的嗎? –