php - 具有动态更新查询的 MySQLi 准备语句

标签 php mysql mysqli prepared-statement

我正忙着从普通的 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;
            }
        }

最佳答案

诀窍是构造一个包含您要绑定(bind)的参数的数组,然后借助call_user_func_array,您可以将此数组传递给bind_param

参见 http://www.php.net/manual/en/function.call-user-func-array.php有关 call_user_func_array 的详细信息。

你的代码可以是这样的:

    $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。它采用命名参数并且可以进行增量绑定(bind)。

关于php - 具有动态更新查询的 MySQLi 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6635169/

相关文章:

PHP——数组中的数组?不确定,使用 ajilion MySQLidb 类需要获取原始查询的值

php - 上传多张带有描述的图片?

php - 如何读取文件,如果文件或目录在 Windows 共享驱动器(映射驱动器)上可用,请使用 php

php - 在 NOTORM 中选择不同的列值

php - Symfony 2.0 我把我的 base.css 文件放在哪里

php - 没有从数据库中获取所有行

mysql - Bazaar分店默认位置

Drupal慢查询日志分析

php - PDO fatal error : Cannot use object of type PDOException as array

php - 如何从表单提交值