2011-07-09 118 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更容易。 –