ron
ron

Reputation: 89

PDO Update Set Where - parameter was not defined

I've spent hours looking at this and just don't see the mistake.
6 columns, 6 ?'s, 6 array elements.
The insert works fine the update is the problem!
Btw. is this a good way to deal with insert on duplicate update?

$userId = 13;
foreach($tableKey as $table=>$value){

    foreach($value as $key=>$val){
              $array_of_parameters[$key] = $val;
              $fields[] = sprintf("%s=?", $key);
    }
    $field_list = join(', ', $fields);

    try{
        $update = "UPDATE `$table` SET $field_list WHERE id=$userId";
        $stmt = $db->prepare($update);
        echo $stmt->debugDumpParams();
        $stmt->execute($array_of_parameters);// here's where I get error!

        if($stmt->rowCount() == 0){
            $insert = "INSERT INTO `$table` (".implode(',', array_keys($value)).") VALUES (:".implode(',:', array_keys($value)).")";
            $stmt = $db->prepare($insert);
            echo $stmt->debugDumpParams();
            $stmt->execute($array_of_parameters);
        }
    }
}

Here's the debug and $array_of_parameters

    array
  'user' => string 'somebody' (length=3)
  'first' => string 'some' (length=7)
  'last' => string 'body' (length=4)
  'zoneId' => string 'zone' (length=4)
  'email' => string '[email protected]' (length=21)
  'head' => string '1' (length=1)

 SQL: [80] UPDATE `user` SET user=?, first=?, last=?, zoneId=?, email=?, head=? WHERE id=13 Params: 0  

And of course the error

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined 

Upvotes: 0

Views: 141

Answers (2)

Andrew Cheong
Andrew Cheong

Reputation: 30283

For unnamed parameters, execute probably expects numeric (default) keys in your parameters array. Populate $array_of_parameters in order without keys, then try it.

Upvotes: 1

prodigitalson
prodigitalson

Reputation: 60403

Try calling array_values on $array_of_parameters before executing the statement.

Upvotes: 3

Related Questions