2013-03-08 12 views
6

Ich erstelle ein mehrstufiges Formular für meine Benutzer. Sie können einige oder alle Felder aktualisieren. Also, ich muss die Werte senden, überprüfen, ob sie eingestellt sind und wenn ja, führen Sie eine UPDATE. Hier ist, was ich bisher:UPDATE ein Array mit PDO

public function updateUser($firstName, $lastName, $streetAddress, $city, $state, $zip, $emailAddress, $industry, $password, $public = 1, 
    $phone1, $phone2, $website,){ 

    $updates = array(
     'firstName'    => $firstName, 
     'lastName'    => $lastName, 
     'streetAddress'   => $streetAddress, 
     'city'     => $city, 
     'state'     => $state, 
     'zip'     => $zip, 
     'emailAddress'   => $emailAddress, 
     'industry'    => $industry, 
     'password'    => $password, 
     'public'    => $public, 
     'phone1'    => $phone1, 
     'phone2'    => $phone2, 
     'website'    => $website, 

); 

Hier ist mein PDO (na ja, der Anfang Versuch)

$sth = $this->dbh->prepare("UPDATE user SET firstName = "); //<---Stuck here 
    $sth->execute(); 
    $result = $sth->fetchAll(PDO::FETCH_ASSOC); 
    return $result; 

Grundsätzlich, wie kann ich die UPDATE Anweisung erstellen, damit es nur die Elemente in dem Updates Array, die nicht NULL sind?

Ich dachte über eine foreach Schleife wie folgt ausgeführt werden:

foreach($updates as $key => $value) { 
     if($value == NULL) { 
      unset($updates[$key]); 
     } 
    } 

aber wie würde ich die prepare Aussage schreiben, wenn ich von den Werten nicht sicher bin?

Wenn ich das komplett falsch mache, bitte weisen Sie mich in die richtige Richtung. Vielen Dank.

+3

Sie können wahrscheinlich 'SET firstName = IFNULL (?, firstName)' verwenden, siehe http://stackoverflow.com/question s/2675968/sql-wie-kann-ich-update-ein-Wert-auf-einer-Spalte-nur-wenn-das-Wert-ist-null – mario

+0

@mario Danke, gute Idee! – hek2mgl

+0

@mario Danke für den Tipp! Ich bin mir nicht sicher, ob das meinem Fall helfen wird, wenn 'IFNULL (NULL, 10);' '' '10 zurückgibt, muss ich immer noch den Wert für' 10' wissen, richtig? Ich versuche einfach, das "UPDATE" zu verhindern, wenn der Wert eines Elements "NULL" ist. –

Antwort

4

Zunächst einmal verwenden array_filter alle NULL-Werte zu entfernen:

$updates = array_filter($updates, function ($value) { 
    return null !== $value; 
}); 

Zweitens binden Parameter, die Ihre Live viel einfacher macht:

$query = 'UPDATE table SET'; 
$values = array(); 

foreach ($updates as $name => $value) { 
    $query .= ' '.$name.' = :'.$name.','; // the :$name part is the placeholder, e.g. :zip 
    $values[':'.$name] = $value; // save the placeholder 
} 

$query = substr($query, 0, -1).';'; // remove last , and add a ; 

$sth = $this->dbh->prepare($query); 

$sth->execute($values); // bind placeholder array to the query and execute everything 

// ... do something nice :) 
+0

Danke, ich denke, das könnte den Trick machen. Ich werde damit herumspielen und sehen. –

+1

Hat super funktioniert, danke! Ich habe gerade dieses '$ updates = array_filter ($ updates, function ($ wert) { return null! == $ value; });' zu '$ updates = array_filter ($ updates, 'strlen'); 'basierend geändert auf den Kommentar hier: http://www.php.net/manual/en/function.array-filter.php#111091 –

+1

@relentless ok, großartig! Und du weißt auch, was passiert? Ich denke, das ist wichtiger als wenn der Code funktioniert oder nicht. –

1

Die unten optimiert werden kann:

$i = 0; $query = array(); 
foreach($updates as $key => $value) { 
    if ($value != NULL) { 
     $query[] = "{$key} = :param_{$i}"; 
     $i++; 
    } 
} 

if (! empty($query)) { 
    $finalQuery = implode(",", $query); 
    $sth = $this->dbh->prepare('UPDATE user SET ' . $finalQuery); 

    $i = 0; 
    foreach($updates as $key => $value) { 
    if ($value != NULL) { 
     $sth->bindParam(':param_'.$i, $value, PDO::PARAM_STR); 
     $i++; 
    } 
    } 
} 
+0

Danke für die Antwort –