PDO Prepared Inserts multiple rows in single query

后端 未结 22 2076
感情败类
感情败类 2020-11-21 23:38

I am currently using this type of SQL on MySQL to insert multiple rows of values in one single query:

INSERT INTO `tbl` (`key1`,`key2`) VALUES (\'r1v1\',\'r1         


        
22条回答
  •  一整个雨季
    2020-11-21 23:45

    Although an old question all the contributions helped me a lot so here's my solution, which works within my own DbContext class. The $rows parameter is simply an array of associative arrays representing rows or models: field name => insert value.

    If you use a pattern that uses models this fits in nicely when passed model data as an array, say from a ToRowArray method within the model class.

    Note: It should go without saying but never allow the arguments passed to this method to be exposed to the user or reliant on any user input, other than the insert values, which have been validated and sanitised. The $tableName argument and the column names should be defined by the calling logic; for instance a User model could be mapped to the user table, which has its column list mapped to the model's member fields.

    public function InsertRange($tableName, $rows)
    {
        // Get column list
        $columnList = array_keys($rows[0]);
        $numColumns = count($columnList);
        $columnListString = implode(",", $columnList);
    
        // Generate pdo param placeholders
        $placeHolders = array();
    
        foreach($rows as $row)
        {
            $temp = array();
    
            for($i = 0; $i < count($row); $i++)
                $temp[] = "?";
    
            $placeHolders[] = "(" . implode(",", $temp) . ")";
        }
    
        $placeHolders = implode(",", $placeHolders);
    
        // Construct the query
        $sql = "insert into $tableName ($columnListString) values $placeHolders";
        $stmt = $this->pdo->prepare($sql);
    
        $j = 1;
        foreach($rows as $row)
        {
            for($i = 0; $i < $numColumns; $i++)
            {
                $stmt->bindParam($j, $row[$columnList[$i]]);
                $j++;
            }
        }
    
        $stmt->execute();
    }
    

提交回复
热议问题