2011-07-09 58 views
1

我正在從正常的mysql_queries更改爲預準備語句,現在我發現了一個基於多少字段不爲空而生成動態查詢的函數。MySQLi準備了動態更新查詢語句

我設法將其轉換爲它作爲一個單獨的查詢運行每個字段,但有沒有辦法將所有這些查詢一個查詢沒有轉換爲PDO?

public function edit($ticket_id, $department_id = '', $location_id = '', $ticketcat_id = '', $ticketsta_id = '', 
        $ticketmed_id = '', $ticketpri_id = '', $ticket_assigned = '', $ticket_plandate = '', 
        $ticket_user_name = '', $ticket_user_email = '', $ticket_user_phone = '', $ticket_subject = '') { 

      $data = array(
      array('field' => 'department_id', 'value' => $department_id, 'type' => 'i'), 
      array('field' => 'location_id', 'value' => $location_id, 'type' => 'i'), 
      array('field' => 'ticketcat_id', 'value' => $ticketcat_id, 'type' => 'i'), 
      array('field' => 'ticketsta_id', 'value' => $ticketsta_id, 'type' => 'i'), 
      array('field' => 'ticketmed_id', 'value' => $ticketmed_id, 'type' => 'i'), 
      array('field' => 'ticketpri_id', 'value' => $ticketpri_id, 'type' => 'i'), 
      array('field' => 'ticket_assigned', 'value' => $ticket_assigned, 'type' => 'i'), 
      array('field' => 'ticket_plandate', 'value' => $ticket_plandate, 'type' => 's'), 
      array('field' => 'ticket_user_name', 'value' => $ticket_user_name, 'type' => 's'), 
      array('field' => 'ticket_user_email', 'value' => $ticket_user_email, 'type' => 's'), 
      array('field' => 'ticket_user_phone', 'value' => $ticket_user_phone, 'type' => 's'), 
      array('field' => 'ticket_subject', 'value' => $ticket_subject, 'type' => 's') 
      ); 

      foreach($data as $id => $data_) { 
       IF(empty($data_['value'])) unset($data[$id]); 
      } 

      IF(count($data) > 0) { 

       $errors = false; 
       $query = 'UPDATE tickets SET '; 
       foreach($data as $id => $values) { 
        $query2 = $query.$values['field'].' = ? WHERE ticket_id = ? '; 
        echo $query2.'<br />'; 
        IF($stmt = $this->db->prepare($query2)) {      
         $types = $values['type'].'i'; 
         $stmt->bind_param($types, $values['value'], $ticket_id); 

         IF(!($stmt->execute())) { 
          $errors = true; 
         } 
         $stmt->close(); 
        } 
       } 

       IF(!$errors) { 
        $this->db->commit(); 
        return true; 
       } 

       return false; 
      } 
     } 
+0

你的意思是不轉換爲pdo是什麼意思? –

+0

那麼,在PDO中,你可以循環每個':var'的'bind_param'函數,但是對於這個項目,它已經決定使用MySQLi而不是PDO了。 – Sander

回答

4

關鍵是要構建一個包含您要綁定的參數,然後用call_user_func_array幫助一個數組,你可以將此數組傳遞給bind_param

有關call_user_func_array的詳細信息,請參閱http://www.php.net/manual/en/function.call-user-func-array.php

您的代碼可以是這樣的:

$para_type=""; 
    /* $para is the array that later passed into bind_param */ 
    $para=array($para_type); 
    $query = 'UPDATE tickets SET '; 

    IF(count($data) != 0) { 
     /* Looping all values */ 

     foreach($data as $k=>$d) { 
      $query .= '`'.$d['field'].'` = ? ,'; 

      $para_type .=$d['type']; 

      $para[] = &$data[$k]['value']; 
     } 

     /* removing last comma */ 
     $query[(strlen($query)-2)] = ''; 

     /* adding where */ 
     $query .= ' WHERE `ticket_id` = ?'; 
     $para_type .= 'i'; 
     $para[]=&$ticket_id; 

     call_user_func_array(array($stmt, 'bind_param'), $para); 

     return true; 
    } 

注意的&中的所有參數的前面,它是由bind_param要求。

我認爲更好的另一種方法是使用PDO。它需要命名參數並可以執行增量綁定。

+1

+1是的,但我同意PDO更容易。 –