2011-07-09 16 views
1

通常のmysql_queriesから準備済みの文への変更に忙しかったので、いくつのフィールドが空でないかに基づいて動的クエリを生成する関数が見つかりました。動的更新クエリを使用したMySQLi prepared文

各フィールドを別々のクエリとして実行するように変換することができましたが、を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'関数をループすることができますが、このプロジェクトではPDOの代わりにMySQLiを使うことにしました。 – 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がずっと簡単です。 –

関連する問題