MySQLi подготовил оператор с запросом динамического обновления - PullRequest
1 голос
/ 09 июля 2011

Я занят, переходя от обычных mysql_queries к подготовленным операторам, теперь я нашел функцию, которая генерировала динамический запрос, основанный на том, сколько полей не было пустыми.

Мне удалось преобразовать его, чтобы оно запускало каждое поле как отдельный запрос, но есть ли способ поместить все эти запросы в один запрос без преобразования в 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;
            }
        }

1 Ответ

4 голосов
/ 09 июля 2011

Хитрость заключается в том, чтобы создать массив, содержащий параметры, которые вы хотите связать, затем с помощью 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. Он принимает именованный параметр и может выполнять инкрементное связывание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...