2013-03-08 9 views
6

Tworzę dla użytkowników formularz wieloetapowy. Będą mogli zaktualizować dowolne lub wszystkie pola. Tak więc, muszę wysłać wartości, sprawdzić, czy są ustawione, a jeśli tak, uruchom UPDATE. Oto co mam do tej pory:AKTUALIZUJ tablicę za pomocą 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, 

); 

Oto moja PDO (dobrze, próba poczynając)

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

Zasadniczo, w jaki sposób można stworzyć oświadczenie UPDATE tak aktualizuje tylko elementy w tablica, która nie jest NULL?

myślałem o prowadzenie foreach pętlę tak:

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

ale jak bym napisać oświadczenie prepare jeśli jestem pewien wartości?

Jeśli mam zamiar to zrobić całkowicie nie tak, proszę wskazać mi właściwy kierunek. Dzięki.

+3

Prawdopodobnie możesz użyć 'SET firstName = IFNULL (?, firstName)', zobacz http://stackoverflow.com/question s/2675968/sql-how-can-i-update-a-value-on-a-column-only-if-that-value-is-null – mario

+0

@mario Dzięki, dobry pomysł! – hek2mgl

+0

@mario Dzięki za cynk! Nie jestem pewien, czy to pomoże mojej sprawie, jeśli 'IFNULL (NULL, 10);' zwraca '10', nadal będę musiał znać wartość dla' 10', prawda? Po prostu próbuję zatrzymać aktualizację 'UPDATE', jeśli wartość elementu wynosi' NULL' –

Odpowiedz

4

Przede wszystkim, należy array_filter usunąć wszystkie wartości NULL:

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

Po drugie, parametry wiązania, które sprawia, że ​​na żywo o wiele łatwiejsze:

$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

Dzięki, myślę, że to może wystarczyć. Będę się z tym bawić i zobaczyć. –

+1

Pracowałem świetnie, dzięki! Właśnie zmodyfikowałem to '$ updates = array_filter ($ updates, function ($ value) { return null! == $ value; });' to '$ updates = array_filter ($ updates, 'strlen'); na komentarz tutaj: http://www.php.net/manual/en/function.array-filter.php#111091 –

+1

@ bezzasadny ok, świetnie! I wiesz też, co się dzieje? Myślę, że to ważniejsze, niż gdyby kod działał, czy nie. –

1

Poniżej można zoptymalizować:

$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

Dzięki za odpowiedź –

Powiązane problemy