2013-03-08 5 views
6

Я создаю многошаговую форму для своих пользователей. Им будет разрешено обновлять все или все поля. Поэтому мне нужно отправить значения, проверить, установлены ли они, и если да, запустите UPDATE. Вот то, что я до сих пор:UPDATE массив с использованием 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, 

); 

Вот мой PDO (ну, начало попытки)

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

В принципе, как я могу создать UPDATE заявление, так что только обновляет элементы в массив, который не является NULL?

Я думал о запуске foreach цикл вроде этого:

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

но как бы я пишу prepare заявление, если я не уверен значений?

Если я собираюсь сделать это совершенно неправильно, укажите мне в правильном направлении. Благодарю.

+3

Возможно, вы можете использовать 'SET firstName = IFNULL (?, firstName)', см. 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 Спасибо, хорошая идея! – hek2mgl

+0

@mario Спасибо за подсказку! Я не уверен, что это поможет моему делу, если 'IFNULL (NULL, 10);' возвращает '10', мне все равно нужно знать значение для' 10', правильно? Я просто пытаюсь остановить «UPDATE», если значение элемента «NULL» –

ответ

4

Прежде всего, используйте array_filter, чтобы удалить все пустые значения:

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

Во-вторых, параметры связывания, что делает ваш жить намного проще:

$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

Спасибо, я думаю, что это может сделать трюк. Я поиграю с ним и посмотрю. –

+1

Работал отлично, спасибо! Я просто изменил это '$ updates = array_filter ($ updates, function ($ value) { return null! == $ value; });' to '$ updates = array_filter ($ updates, 'strlen'); на комментарий здесь: http://www.php.net/manual/en/function.array-filter.php#111091 –

+1

@relentless нормально, отлично! И вы также знаете, что происходит? Я думаю, что это более важно, чем если код работает или нет. –

1

Ниже можно оптимизировать:

$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

Спасибо за ответ –

Смежные вопросы