0

I have created dynamic add/remove fields in a frontend post submission page. Using $wpdb->insert, the system is working perfectly.

I have also created a draft edit page on the frontend. On this page I want these dynamic fields to get updated. I tried $wpdb->update but it only updates the last field. In short I want to update multiple rows on single click.

my code:

$project_id = $_SESSION['project_id'];
global $wpdb;
$reward_ids = $wpdb->get_results("SELECT * FROM wpxa_rewards WHERE project_id = $project_id");
foreach($reward_ids as $reward_id); $r_id = $reward_id->ID;

$count = count( $project_reward_title );
for ( $i = 0; $i < $count; $i++ ) {

global $wpdb;

$wpdb->update( 'wpxa_rewards',

  array(

    'reward_title'       => "$project_reward_title[$i]",
    'reward_description' => "$project_reward_description[$i]",
    'reward_amount'      => "$project_reward_amount[$i]",
    'reward_shipping'    => "$project_reward_shipping[$i]",
    'est_date'           => "$project_est_date[$i]"

  ),

  array( 'ID' => $r_id ),

  array(

    '%s',
    '%s',
    '%d',
    '%s',
    '%s'

  ),

  array( '%d' )

);

}

Plz help.. Thanks

2
  • Don't use "$project_reward_title[$i]", just write $project_reward_title[$i], it'll only confuse the interpreter.
    – janh
    Jan 29, 2018 at 8:40
  • @janh Thanks. But it doesn't work...
    – Minesh
    Jan 29, 2018 at 8:50

1 Answer 1

0

It is a a bit of a stab in the dark, but I'm fairly confident that the problem is your foreach loop. It's broken (it will not execute anything because only an empty statement (;) is affected, and you will probably want it to have a block that contains the rest of the code.

As an example:

<?php
foreach(array(1, 2, 3) as $test);  
print $test . "\n";

will only print 3, while

<?php
foreach(array(1, 2, 3) as $test) // note the lack of the semicolon.
print $test . "\n";

will print a line for 1, 2 and 3. As a general rule, I recommend always being explicit with what you want to be repeated in a loop. Use curly braces, e.g.

<?php
foreach(array(1, 2, 3) as $test) {
    print $test . "\n";
}

It's easy to read and keeps you safe from these kind of bugs. If you have to add another line in the loop, just add it before the closing curly braces.

This code will probably be what you want.

$project_id = $_SESSION['project_id'];
global $wpdb;
$reward_ids = $wpdb->get_results("SELECT * FROM wpxa_rewards WHERE project_id = $project_id");
foreach($reward_ids as $reward_id) {
    $r_id = $reward_id->ID;

    $count = count( $project_reward_title );
    for ( $i = 0; $i < $count; $i++ ) {

        $wpdb->update( 'wpxa_rewards',

        array(

            'reward_title'       => $project_reward_title[$i],
            'reward_description' => $project_reward_description[$i],
            'reward_amount'      => $project_reward_amount[$i],
            'reward_shipping'    => $project_reward_shipping[$i],
            'est_date'           => $project_est_date[$i]

        ),

        array( 'ID' => $r_id ),

        array(

            '%s',
            '%s',
            '%d',
            '%s',
            '%s'

        ),

        array( '%d' )

        );

    }
}
1
  • Thanks for the code. But it is not working... It is updated the last one only... Nothing changed... Any other solution Plz...
    – Minesh
    Jan 29, 2018 at 12:34

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.