2013-04-03 100 views
0

我想爲PHP做一個mysql查詢包裝函數,現在我正在嘗試使用預準備語句,因爲它們顯然是最好的方法在SQL查詢的MySQL,到目前爲止,這是我所有沒有辦法讓bind_param接受可變數量的參數

public function run_query($query) 
{ 
    $arguments = $query['arguments']; 
    $prep = $this->connection->prepare($query['query']) 
    $dtString = ''; 

    foreach($arguments as $_field => $_argument) 
    { 
     $dtString .= array_keys($_argument); 
    } 
} 

$query結構是這樣

$query = array("query" => QUERY, 
        "arguments" => array(FIELD => array(DATATYPE => VALUE))) 

和榜樣的什麼$query可能是這個

$query = array("query" => "SELECT * FROM table_1 WHERE active = ? AND group = ?", 
        "arguments" => array("active" => array("i" => 1), 
             "group" => array("i" => 17))) 

現在你可以看到,我正在試圖做的是讓我的函數允許任何查詢,而不管查詢是什麼以及要使用多少個參數。

現在

在我的功能,以後每個接下來的步驟是使用$prep->bind_param($dtString, [VALUES]);但是我讀了每個值就是有點弄亂的東西了

我不知道是否有一個功能的單獨的參數辦法讓bind_param在我的函數接受可變數量的參數

我目前的解決方案是創建另一個函數,在傳遞$參數作爲參數傳遞給函數,將我的每一個到新的功能和創建$dtString後計算它的大小,並有一個只有多個bind_param但具有不同數量的參數的開關盒就像這個

switch($count) 
{ 
    case 1: 
     $prep->bind_param($dtString, $array[0]); 
     break; 
    case 2: 
     $prep->bind_param($dtString, $array[0], $array[1]); 
     break; 
    case 3: 
     $prep->bind_param($dtString, $array[0], $array[1], $array[2]); 
     break; 
} 

,但我寧願避免這樣

+0

不,你不能避免那個爛攤子。不要忘記,您也將獲得類似的娛樂獲取查詢結果。所以,最好轉到PDO,直到太遲 –

+0

@YourCommonSense是否有任何缺點使用PDO在MySQLi上準備好的語句? –

+1

當然可以。如果你更喜歡冗長,複雜和臃腫的代碼,轉向PDO將是一個痛苦。 –

回答

1

到代碼的東西。如果你想堅持用唯一的本地預處理語句,PDO是唯一的[理智]選擇
說不上你的函數何意返回,但假設所有數據來自查詢:

public function run_query($query, $params) 
{ 
    $stm = $this->connection->prepare($query) 
    $stm->execute($params); 
    return $stm->fetchAll(); 
} 

$query = "SELECT * FROM table_1 WHERE active = ? AND group = ?"; 
$data = $db->run_query($query, array(1, 17)); 
相關問題