【问题标题】:Wordpress $wpdb. Insert Multiple RecordsWordPress $wpdb。插入多条记录
【发布时间】:2012-09-04 15:08:33
【问题描述】:

有什么方法可以在 Wordpress 中使用$wpdb->insert

完成以下操作

$wpdb->query($wpdb->prepare)):

INSERT into TABLE (column1, column2, column3) 
VALUES
('value1', 'value2', 'value3'),
('otherval1', 'otherval2', 'otherval3'),
('anotherval1', 'anotherval2', 'anotherval3')

...等

【问题讨论】:

  • 嗯,Wordpress 文档中似乎没有一种语法可以解释这种情况
  • WordPress 并没有真正构建为与数据库交互的框架,因此不存在这样的功能。如果你不想自己写,循环和使用插入是你最好的选择。
  • 另外,我刚刚扫描了wpdb 类,并没有找到任何插入多行的方法,因此您必须使用上述两种方法之一。
  • 好吧,我想我明白了。下面回答
  • 酷,很高兴你能成功。确保接受答案,以便其他人知道它已解决:)

标签: php mysql wordpress


【解决方案1】:

好的,我想通了!

为实际值和占位符设置数组

$values = array();
$place_holders = array();

初始查询:

$query = "INSERT INTO orders (order_id, product_id, quantity) VALUES ";

然后循环遍历您要添加的值,并将它们插入到适当的数组中:

foreach ( $_POST as $key => $value ) {
     array_push( $values, $value, $order_id );
     $place_holders[] = "('%d', '%d')" /* In my case, i know they will always be integers */
}

然后将这些位添加到初始查询中:

$query .= implode( ', ', $place_holders );
$wpdb->query( $wpdb->prepare( "$query ", $values ) );

【讨论】:

  • 太棒了,如果需要插入字符串,请使用 '%s'。
  • "在查询字符串中 %d 和 %s 都应该不加引号。"
  • 这里需要$place_holders[]吗?
【解决方案2】:

您也可以使用这种方式来构建查询:

$values = array();

// We're preparing each DB item on it's own. Makes the code cleaner.
foreach ( $items as $key => $value ) {
    $values[] = $wpdb->prepare( "(%d,%d)", $key, $value );
}

$query = "INSERT INTO orders (order_id, product_id, quantity) VALUES ";
$query .= implode( ",\n", $values );

【讨论】:

    【解决方案3】:

    我遇到了这个问题,并决定通过使用公认的答案来构建一个更改进的功能:

    /**
     * A method for inserting multiple rows into the specified table
     * 
     *  Usage Example: 
     *
     *  $insert_arrays = array();
     *  foreach($assets as $asset) {
     *
     *  $insert_arrays[] = array(
     *  'type' => "multiple_row_insert",
     *  'status' => 1,
     *  'name'=>$asset,
     *  'added_date' => current_time( 'mysql' ),
     *  'last_update' => current_time( 'mysql' ));
     *
     *  }
     *
     *  wp_insert_rows($insert_arrays);
     *
     *
     * @param array $row_arrays
     * @param string $wp_table_name
     * @return false|int
     *
     * @author  Ugur Mirza ZEYREK
     * @source http://stackoverflow.com/a/12374838/1194797
     */
    
    function wp_insert_rows($row_arrays = array(), $wp_table_name) {
        global $wpdb;
        $wp_table_name = esc_sql($wp_table_name);
        // Setup arrays for Actual Values, and Placeholders
        $values = array();
        $place_holders = array();
        $query = "";
        $query_columns = "";
    
        $query .= "INSERT INTO {$wp_table_name} (";
    
                foreach($row_arrays as $count => $row_array)
                {
    
                    foreach($row_array as $key => $value) {
    
                        if($count == 0) {
                            if($query_columns) {
                            $query_columns .= ",".$key."";
                            } else {
                            $query_columns .= "".$key."";
                            }
                        }
    
                        $values[] =  $value;
    
                        if(is_numeric($value)) {
                            if(isset($place_holders[$count])) {
                            $place_holders[$count] .= ", '%d'";
                            } else {
                            $place_holders[$count] .= "( '%d'";
                            }
                        } else {
                            if(isset($place_holders[$count])) {
                            $place_holders[$count] .= ", '%s'";
                            } else {
                            $place_holders[$count] .= "( '%s'";
                            }
                        }
                    }
                            // mind closing the GAP
                            $place_holders[$count] .= ")";
                }
    
        $query .= " $query_columns ) VALUES ";
    
        $query .= implode(', ', $place_holders);
    
        if($wpdb->query($wpdb->prepare($query, $values))){
            return true;
        } else {
            return false;
        }
    
    }
    

    来源:https://github.com/mirzazeyrek/wp-multiple-insert

    【讨论】:

    • 请注意,如果$row_arrays 参数是一个关联数组,这将失败,因为if($count == 0) 假设它是从0 开始的数字索引的。不是很好,要依赖假设,这不是甚至记录在案。最好使用不同的方法来区分第一行。
    • 感谢@Grapestain 的评论。 docblock 中有解释,github 存储库中还有其他示例。你想举个例子,什么样的场景会导致方法失败?
    • 这会失败:wp_insert_rows([ 'row1' => ['prop1', 'prop2'], 'row2' => ['propA', 'propB'] ] , 'my_table') 或者这会失败:wp_insert_rows([ 1 => ['prop1', 'prop2'], 2 => ['propA', 'propB'] ] , 'my_table') 而这会成功:wp_insert_rows([ ['prop1', 'prop2'], ['propA', 'propB'] ] , 'my_table') 不是一个大问题,我只是对$count == 0 条件感到惊讶,当它并不是说输入数组不能是关联的(即不能使用自定义键)。我永远不会这样做,因为这意味着该函数依赖于一个假设,而该假设并未强制执行。
    【解决方案4】:

    除了使用 $wpdb 插入多行之外,如果您需要更新现有行,则 sn-p 应该会有所帮助。 这是上面提供的 @philipp 的更新 sn-p。

    $values = array();
    
    // We're preparing each DB item on it's own. Makes the code cleaner.
    foreach ( $items as $key => $value ) {
        $values[] = $wpdb->prepare( "(%d,%d)", $key, $value );
    }
    
    $values = implode( ",\n", $values );
    $query = "INSERT INTO orders (order_id, product_id, quantity) VALUES {$values} ON DUPLICATE KEY UPDATE `quantity` = VALUES(quantity)";
    

    【讨论】:

    • 尚未测试此解决方案,但我为使用 ON DUPLICATE KEY UPDATE 提供 +1。
    • @HPWD 我有。它运作良好。您也可以使用 array_map 代替循环。 (我不知道它是否是特定于 MySQL 的,但请注意 VALUES() 引用可能的新值的语法是 deprecated as of MySQL 8.0.20,但从 8.0.19 开始,可以使用别名。)跨度>
    【解决方案5】:

    这有点晚了,但你也可以这样做。

        global $wpdb;
        $table_name = $wpdb->prefix . 'your_table';
    
        foreach ($your_array as $key => $value) {
              $result = $wpdb->insert( 
                $table_name, 
                array( 
                  'colname_1' => $value[0], 
                  'colname_2' => $value[1], 
                  'colname_3' => $value[2], 
                ) 
              );
            }
      if (!$result) {
        print 'There was a error';
      }
    

    【讨论】:

    • 这将执行单行的多个 INSERT,而不是多行的单个 INSERT。此外,将仅检测最后一次插入的错误。
    【解决方案6】:

    不是很好,但如果你知道你在做什么:

    require_once('wp-load.php');
    mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);  
    @mysql_select_db(DB_NAME) or die();
    mysql_query("INSERT into TABLE ('column1', 'column2', 'column3') VALUES 
                                   ('value1', 'value2', 'value3'), 
                                   ('otherval1', 'otherval2', 'otherval3'),
                                   ('anotherval1', 'anotherval2', 'anotherval3)");
    

    【讨论】:

    • -1 这是一个糟糕的解决方案。请停止使用古老的mysql_ 函数。它们很快就会被弃用。
    • 我也建议停止使用or die(),这是一种处理错误的可怕方式。
    猜你喜欢
    • 2016-05-23
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2015-10-04
    相关资源
    最近更新 更多