Mike
Mike

Reputation: 3276

Cut array to fit needs

I want to write the array values into my database like:

"UPDATE tbl SET $fieldname = $fieldvalue WHERE id=$recid"

and I get this array from $_POST['changed']:

[changed] => Array
        (
            [0] => Array
                (
                    [recid] => 1
                    [vorname] => Walter
                    [nachname] => Bauer
                )

            [1] => Array
                (
                    [recid] => 2
                    [vorname] => Michael
                )

            [2] => Array
                (
                    [recid] => 3
                    [vorname] => Peter
                    [nachname] => Highler
                    [email] => [email protected]
                )

            [3] => Array
                (
                    [recid] => 4
                    [vorname] => Maria
                    [nachname] => Maier
                )

            [4] => Array
                (
                    [recid] => 5
                    [vorname] => Werner
                    [nachname] => Rock
                )

        )

When I do it with this foreach loop, the recid get's also as field name - but this should not happen.

foreach ($_POST['changed'] as $SubArray)
{
    foreach ($SubArray as $key => $value)
    {
        $sql .= "UPDATE kunden SET ".$key."='".$value."' WHERE id=**?????????**";
    }       
}

Upvotes: 0

Views: 100

Answers (3)

Alexander Yancharuk
Alexander Yancharuk

Reputation: 14501

Try this:

foreach ($_POST['changed'] as $SubArray) {
    foreach ($SubArray as $key => $value) {
        if ($key === 'recid') continue;

        $sql = "UPDATE kunden SET $key = $value WHERE id = '$SubArray[recid]'";
    }    
}

This code is not for production. You must escape each $_POST variable or use PDO placeholders.

Update (PDO placeholders example):

$dsn = 'mysql:dbname=kunden;host=127.0.0.1';
$enc = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'");
$dbh = new PDO($dsn, $user, $pass, $enc);

foreach ($_POST['changed'] as $SubArray) {
    foreach ($SubArray as $key => $value) {
        if ($key === 'recid') continue;

        $sql  = "UPDATE kunden SET $key = :value WHERE id = :recid";
        $stmt = $dbh->prepare($sql);

        try {
            $stmt->execute(array(':value' => $value, ':recid' => $SubArray['recid']));
        } catch (PDOException $e) {
            // error processing
        }
    }
}

Upvotes: -1

Nico
Nico

Reputation: 341

foreach ($_POST['changed'] as $SubArray)
{
    $id = $subArray['recid'];
    $values = array();

    foreach ($SubArray as $key => $value)
    {
        if($key != 'recid')
        {
            $values[] = $key . '=' . $value;                
        }
        $sqlValues = implode(', ', $values);
    }

    $sql = "UPDATE kunden SET " . $sqlValues . " WHERE id='" . $id . "'";
    //execute query here
}

Upvotes: 2

MD SHAHIDUL ISLAM
MD SHAHIDUL ISLAM

Reputation: 14523

Just use:

if ($key === 'recid') continue;
$sql .= "UPDATE kunden SET ".$key."='".$value."' WHERE id='".$SubArray['recid']."'";

instead of

$sql .= "UPDATE kunden SET ".$key."='".$value."' WHERE id=**?????????**";

Upvotes: 0

Related Questions